我手头的基本任务是
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))
其中 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.
那么每个条目每次都会散列到完全相同的值吗?
如果否,有什么好的方法可以解决这个问题。有什么方法可以检索编码器的映射?还是与 LabelEncoder 完全不同的方式?
最佳答案
根据LabelEncoder
实现,当且仅当您在测试时 fit
LabelEncoders 使用具有完全相同的唯一值集的数据时,您描述的管道才能正常工作。
有一种方法可以重用您在训练期间获得的 LabelEncoders。 LabelEncoder
只有一个属性,即classes_
。可以腌制一下,然后恢复就好了
火车:
encoder = LabelEncoder()
encoder.fit(X)
numpy.save('classes.npy', encoder.classes_)
测试
encoder = LabelEncoder()
encoder.classes_ = numpy.load('classes.npy')
# Now you should be able to use encoder
# as you would do after `fit`
这似乎比使用相同的数据重新拟合更有效。
关于python - 在多个程序中正确使用 Scikit 的 LabelEncoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28656736/