在sklearn LabelEncoder中返回标签及其编码值

Bac*_*ash 1 python machine-learning scikit-learn one-hot-encoding

我使用LabelEncoder,并OneHotEncodersklearn一个机器学习项目编码数据集中的标签(国名)。一切正常,我的模型运行完美。该项目将根据包括客户所在国家/地区在内的许多功能(数据)对银行客户是继续还是离开银行进行分类。

当我要预测(分类)新客户(仅一个)时,就会出现我的问题。新客户的数据仍未进行预处理(即,国家/地区名称未编码)。类似于以下内容:

new_customer = np.array([['France', 600, 'Male', 40, 3, 60000, 2, 1,1, 50000]])
Run Code Online (Sandbox Code Playgroud)

在我学习机器学习的在线课程中,讲师打开了包含编码数据的预处理数据集,并手动检查了France的代码并在中对其进行了更新new_customer,如下所示:

new_customer = np.array([[0, 0, 600, 'Male', 40, 3, 60000, 2, 1,1, 50000]])
Run Code Online (Sandbox Code Playgroud)

我认为这不切实际,必须有一种方法可以自动将France编码为原始数据集中使用的相同代码,或者至少应有一种返回国家及其编码值的列表的方法。手动编码标签似乎很乏味且容易出错。那么,如何使该过程自动化或为标签生成代码?提前致谢。

Bra*_*mon 6

似乎您可能正在寻找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])
Run Code Online (Sandbox Code Playgroud)

这将采用您调用时所学的“映射”,fit(c)并将其应用于新数据(在本例中为新标签)。您可以反向看到此映射:

>>> enc.inverse_transform(encoded)
array(['France', 'UK', 'US', 'US', 'UK', 'China', 'France'], dtype='<U6')
Run Code Online (Sandbox Code Playgroud)

如此处的答案所述,如果要在Python会话之间执行此操作,可以将估算器序列化为磁盘,如下所示:

import pickle

with open('enc.pickle', 'wb') as file:
    pickle.dump(enc, file, pickle.HIGHEST_PROTOCOL)
Run Code Online (Sandbox Code Playgroud)

然后将其加载到新会话中,并转换传入的数据。