return sklearn LabelEncoder 中的标签及其编码值
return the labels and their encoded values in sklearn LabelEncoder
我正在使用 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]])
我认为这不切实际,必须有一种方法可以自动将法国编码为原始数据集中使用的相同代码,或者至少可以return 列出国家及其名称编码值。手动编码标签似乎很乏味且容易出错。那么我怎样才能使这个过程自动化,或者为标签生成代码呢?提前致谢。
在机器学习中,习惯将预处理管道保存在内存中,这样,在选择其超参数并训练模型后,您可以对测试数据应用相同的预处理。
如果所有这些都 运行 在同一个 python 实例中,这对于 small/middle 大小的项目很常见,那么这意味着您的 LabelEncoder
是否在线将其发送到垃圾收集。如果 运行 在不同的实例中进行培训和测试,我认为最简单的解决方案是将其存储在磁盘上,然后将其加载到测试脚本中。
我建议你使用pickle
。 Here 是一个例子。
看来您可能正在寻找估算器的 .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)
时学到的 "mapping" 并将其应用于新数据(在本例中为新标签)。您可以反向查看此映射:
>>> 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)
然后在新会话中加载它并用它转换传入数据。
问题是您没有对数据集的国家/地区属性进行编码。
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# define example
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm',
'hot']
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
输出:-
['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']
[0 0 2 0 1 1 2 0 2 1]
[[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 0. 1.]
[0. 1. 0.]]
对于您的问题,此 data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
应该是您数据集的国家/地区属性。然后您可以选择整数或二进制编码方法。然后继续学习过程。
我正在使用 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]])
我认为这不切实际,必须有一种方法可以自动将法国编码为原始数据集中使用的相同代码,或者至少可以return 列出国家及其名称编码值。手动编码标签似乎很乏味且容易出错。那么我怎样才能使这个过程自动化,或者为标签生成代码呢?提前致谢。
在机器学习中,习惯将预处理管道保存在内存中,这样,在选择其超参数并训练模型后,您可以对测试数据应用相同的预处理。
如果所有这些都 运行 在同一个 python 实例中,这对于 small/middle 大小的项目很常见,那么这意味着您的 LabelEncoder
是否在线将其发送到垃圾收集。如果 运行 在不同的实例中进行培训和测试,我认为最简单的解决方案是将其存储在磁盘上,然后将其加载到测试脚本中。
我建议你使用pickle
。 Here 是一个例子。
看来您可能正在寻找估算器的 .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)
时学到的 "mapping" 并将其应用于新数据(在本例中为新标签)。您可以反向查看此映射:
>>> 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)
然后在新会话中加载它并用它转换传入数据。
问题是您没有对数据集的国家/地区属性进行编码。
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# define example
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm',
'hot']
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
输出:-
['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']
[0 0 2 0 1 1 2 0 2 1]
[[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 0. 1.]
[0. 1. 0.]]
对于您的问题,此 data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
应该是您数据集的国家/地区属性。然后您可以选择整数或二进制编码方法。然后继续学习过程。