当前位置: 首页 > 知识库问答 >
问题:

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

郜琦
2023-03-14

我正在机器学习项目中使用LabelEncoderonehotcodersklearn对数据集中的标签(国家名称)进行编码。一切正常,我的模型运行良好。该项目将根据包括客户所在国家在内的许多特征(数据)对银行客户是否继续或离开银行进行分类。

当我想预测(分类)一个新客户(仅一个)时,我的问题就出现了。新客户的数据仍未预处理(即,国家名称未编码)。如下所示:

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]])

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

共有3个答案

丁理
2023-03-14

问题是您没有对数据集的country属性进行编码。

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.]]

对于您的问题,此数据=['cold'、'cold'、'warm'、'cold'、'hot'、'hot'、'warm'、'cold'、'warm'、'hot']应该是数据集的国家属性。然后可以选择整数或二进制编码方法。然后继续学习过程。

慎星纬
2023-03-14

在机器学习中,将预处理管道保存在内存中是一种习惯,这样,在拾取其超参数并训练模型后,您可以对测试数据应用相同的预处理。

如果所有这些都在同一个python实例中运行,就像中小型项目一样,那么这意味着保持您的LabelEncoder在线或不将其发送到垃圾回收机制。如果在不同的实例中运行训练和测试,我认为最简单的解决方案是将其存储在磁盘上,并将其加载到测试脚本中。

我建议您使用pickle。这里有一个例子。

穆鸿波
2023-03-14

看起来您可能正在查找。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)

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

 类似资料:
  • 我正在制作一个Grafana仪表盘,想要一个面板,报告我们的应用程序的最新版本。版本在(say)度量中作为标签报告,如下所示: 我尝试了许多Prometheus查询,从这个时间序列的最新成员中提取作为字符串的版本标签,但没有效果。 例如,查询 返回值为的元素。当将Grafana仪表板放在单个值面板中时,它不会显示版本字符串,而是显示计数值()。 如何构造返回版本字符串的Prometheus查询?

  • 问题内容: 我有标签: 后面的代码: 和: 如何返回多个值?该标签仅显示单个值,但表中还有6个值。 问题答案: 试试这个: 当然,这 只是 一个示例,并不能完全解决您的问题,但是应该作为一个起点:)

  • 问题内容: 我正在关注有关Udemy的iOS Swift指南,这是我无法解决的第一个问题: 我应该看到html等打印到控制台,但是我得到了null。 这是本节: 如果我只打印数据,那么它给了我一些内容,但是当它编码为零时。 有什么帮助吗?在解决此问题之前,无法移动到下一部分。 问题答案: rmaddy已经提到的问题是您使用的编码。您需要使用。 或从Martin R中获取线索,您可以从响应中检测字符

  • 我有一个12列的数据帧,下面的数据帧是一个简化的示例。 1)我了解值100,200和300,并且如果这些值在列1中可用,则要添加一个包含1的新列(列4),如果这些值在列1中可用,则为0,如果这些值不可用。 2)如果这些值(100,200,300)可用,我想从lookup_table中查找属于这些值的名称。 这是我想要的输出。 对于问题1,我尝试过,但没有成功。 对于问题2,我对原始数据帧中的12列

  • 问题内容: 假设我有一个文件。我怎么写“你好” TAB“ alex”? 问题答案: 这是代码: 字符串的内部是水平制表符的转义序列。

  • Java类/接口中的方法签名是否包含其返回类型? 例子: Java是否知道这两种方法之间的区别: 或者可能只有方法名和参数列表才重要?