在多个程序中正确使用Scikit的LabelEncoder

alp*_*uri 21 python pandas scikit-learn

我手头的基本任务是

a)读取一些制表符分隔的数据.

b)做一些基本的预处理

c)对于每个分类列,用于LabelEncoder创建映射.这有点像这样

mapper={}
#Converting Categorical Data
for x in categorical_list:
     mapper[x]=preprocessing.LabelEncoder()

for x in categorical_list:
     df[x]=mapper[x].fit_transform(df.__getattr__(x))
Run Code Online (Sandbox Code Playgroud)

其中df是pandas数据帧,categorical_list是需要转换的列标题列表.

d)训练分类器并使用将其保存到磁盘 pickle

e)现在在另一个程序中,加载了保存的模型.

f)加载测试数据并执行相同的预处理.

g)LabelEncoder's用于转换分类数据.

h)该模型用于预测.

现在我的问题是,步骤g)是否正常工作?

正如文档LabelEncoder所说

It can also be used to transform non-numerical labels (as long as 
they are hashable and comparable) to numerical labels.
Run Code Online (Sandbox Code Playgroud)

那么每个条目每次都会哈希到完全相同的值吗?

如果不是,有什么好办法可以解决这个问题.有没有办法重新编码编码器的映射?或者与LabelEncoder完全不同的方式?

Art*_*lev 34

根据LabelEncoder实现,当且仅当您fit在测试时使用具有完全相同的唯一值集的数据的LabelEncoders时,您描述的管道才能正常工作.

重新使用在火车期间获得的LabelEncoders有一种不太常见的方法.LabelEncoder只有一个属性,即classes_.你可以腌制它,然后恢复像

培养:

encoder = LabelEncoder()
encoder.fit(X)
numpy.save('classes.npy', encoder.classes_)
Run Code Online (Sandbox Code Playgroud)

测试

encoder = LabelEncoder()
encoder.classes_ = numpy.load('classes.npy')
# Now you should be able to use encoder
# as you would do after `fit`
Run Code Online (Sandbox Code Playgroud)

这似乎比使用相同数据重新调整它更有效.


sha*_*rif 16

对我来说,最简单的方法是将 LabelEncoder 作为.pkl每列的文件导出。使用该fit_transform()功能后,您必须导出每列的编码器

例如

from sklearn.preprocessing import LabelEncoder
import pickle
import pandas as pd
df_train = pd.read_csv('traing_data.csv')
le = LabelEncoder()    
df_train['Departure'] = le.fit_transform(df_train['Departure'])
#exporting the departure encoder
output = open('Departure_encoder.pkl', 'wb')
pickle.dump(le, output)
output.close()
Run Code Online (Sandbox Code Playgroud)

然后在testing工程中,可以transform()直接加载LabelEncoder对象和apply函数

from sklearn.preprocessing import LabelEncoder
import pandas as pd
df_test = pd.read_csv('testing_data.csv')
#load the encoder file
import pickle 
pkl_file = open('Departure_encoder.pkl', 'rb')
le_departure = pickle.load(pkl_file) 
pkl_file.close()
df_test['Departure'] = le_departure.transform(df_test['Departure'])
Run Code Online (Sandbox Code Playgroud)

  • @ArunGeorge我相信我的解决方案不包含任何提及“classes_”请再试一次并告诉我是否可以提供帮助 (3认同)