我在机器学习项目中使用来自 LabelEncoder
的 OneHotEncoder
和 sklearn
编码数据集中的标签(国家/地区名称)。一切都很好,我的模型完美运行。该项目旨在根据许多功能(数据)(包括客户的国家/地区)对银行客户是继续还是离开银行进行分类。
当我想预测(分类)新客户(仅限一个)时,我的问题就出现了。新客户的数据仍未预处理(即,国家名称未编码)。如下所示:
new_customer = np.array([['France', 600, 'Male', 40, 3, 60000, 2, 1,1, 50000]])
在我学习机器学习的在线课程中,讲师打开了包含编码数据的预处理数据集,并且 手动 检查了法国的代码并更新了它在new_customer
中,如下所示:
new_customer = np.array([[0, 0, 600, 'Male', 40, 3, 60000, 2, 1,1, 50000]])
我认为这不切实际,必须有一种方法可以自动将法国编码为原始数据集中使用的相同代码,或者至少是返回国家/地区列表及其编码值的方法。手动编码标签似乎很乏味且容易出错。那么我该如何自动化这个过程,或者为标签生成代码呢?提前致谢。
答案 0 :(得分:2)
您似乎正在寻找估算工具的transform()
方法。
>>> from sklearn.preprocessing import LabelEncoder
>>> c = ['France', 'UK', 'US', 'US', 'UK', 'China', 'France']
>>> enc = LabelEncoder().fit(c)
>>> encoded = enc.transform(c)
>>> encoded
array([1, 2, 3, 3, 2, 0, 1])
>>> encoded.transform(['France'])
array([1])
这将获取您调用fit(c)
时学习的“映射”并将其应用于新数据(在本例中为新标签)。你可以反过来看到这个映射:
>>> enc.inverse_transform(encoded)
array(['France', 'UK', 'US', 'US', 'UK', 'China', 'France'], dtype='<U6')
正如这里的答案所提到的,如果你想在Python会话之间做到这一点,你可以像这样将估算器序列化到磁盘:
import pickle
with open('enc.pickle', 'wb') as file:
pickle.dump(enc, file, pickle.HIGHEST_PROTOCOL)
然后在新会话中加载它并使用它转换传入数据。
答案 1 :(得分:1)
在机器学习中,将预处理管道保留在内存中是一种习惯,这样在选择其超参数并训练模型后,您可以对测试数据应用相同的预处理。
如果所有这些都在同一个python实例中运行,这对于小型/中型项目来说是常见的,则意味着保持LabelEncoder
在线或不将其发送到垃圾回收。如果在不同的实例中运行培训和测试,我认为最简单的解决方案是将其存储在磁盘上,并将其加载到测试脚本中。
我建议你使用pickle
。 Here就是一个例子。