如何使用 scikit LabelEncoder 获取新标签?

Posted

技术标签:

【中文标题】如何使用 scikit LabelEncoder 获取新标签?【英文标题】:How do I use use scikit LabelEncoder for new labels? 【发布时间】:2018-01-11 17:07:59 【问题描述】:

所以我的代码如下:

>>> le = preprocessing.LabelEncoder()
>>> le.fit(train["capital city"])
LabelEncoder()
>>> list(le.classes_)
['amsterdam', 'paris', 'tokyo']
>>> le.transform(["tokyo", "tokyo", "paris"])
array([2, 2, 1])
>>> list(le.inverse_transform([2, 2, 1]))
['tokyo', 'tokyo', 'paris']

但是,如果在我的测试数据集中,我有类似“beijing”但训练集中不存在“beijing”的内容怎么办?编码器有没有办法在不添加全球每个可能的首都城市的情况下处理这个问题?

【问题讨论】:

【参考方案1】:

在将数据帧 df 拆分为训练和测试之前,您可以将 df['capital city'] 的总列表传递给 LabelEncoder.fit()

例如,如果df 是这样的:

df['capital city'] = ['amsterdam', 'paris', 'tokyo', 'beijing', 'tokyo', 'newyork', 'paris']

然后,你可以使用:

le = preprocessing.LabelEncoder();
le.fit(df['capital city'])

le.classes_
Output: ['amsterdam', 'beijing', 'newyork', 'paris', 'tokyo']

然后在训练和测试数据上使用transform() 将它们正确转换为整数。

train["capital city integers"] = le.transform(train["capital city"])
test["capital city integers"] = le.transform(test["capital city"])

希望这会有所帮助。

注意: 尽管上面给出的 siggestion 对您有用并且在您学习时完全可以接受,但是在将其用于实际任务时,您应该考虑现实世界的场景。因为在现实世界中,所有可用的数据都是训练数据(因此您使用和编码首都城市),然后可能会出现包含前所未有的首都城市价值的新数据。在这种情况下你想做什么?

【讨论】:

呃,这就是问题所在。我在现实世界中使用它,我相信你给出的建议是不可扩展的。我希望这个PR 被合并。否则,我将尝试实现自己的方法来处理新的分类信息。 @Flair 。是的,我就是这么问的。因为在现实世界中,如果你在一个数据上训练你的数据并且在预测时出现看不见的数据,它可能不会在 i 上给出好的结果,可能会完全失败。【参考方案2】:

您可以尝试“sklearn.LabelEncoder 中从未见过的值”的解决方案 https://***.com/a/48169252/9043549

【讨论】:

【参考方案3】:

对于现实世界的场景,您所拥有的只是训练数据并且以后可能会出现新课程,您可以尝试我的解决方案:

le.classes_ = np.append(le.classes_, "new_class_name")
le.transform(new_y)

【讨论】:

这仅适用于new_class_name 将出现在所有类的末尾,当python 进行字符串排序时。例如:如果 a、b、d 是现有类,则 e 的新类将按预期工作。但是如果 new class= c,就不行了。

以上是关于如何使用 scikit LabelEncoder 获取新标签?的主要内容,如果未能解决你的问题,请参考以下文章

在多个程序中正确使用 Scikit 的 LabelEncoder

获取 ValueError:y 在使用 scikit learn 的 LabelEncoder 时包含新标签

Scikit learn的AttributeError:'LabelEncoder'对象没有属性'classes_'?

scikit-learn 中跨多个列的标签编码

如何使用SciKit Learn转换一次编码多个功能

使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧