sklearn中labelEncoder的工作

Posted

技术标签:

【中文标题】sklearn中labelEncoder的工作【英文标题】:Working of labelEncoder in sklearn 【发布时间】:2017-06-06 00:55:38 【问题描述】:

假设我有以下输入功能:

hotel_id = [1, 2, 3, 2, 3]

这是一个带有数值的分类特征。如果我把它按原样交给模型,模型会将其视为连续变量,即 2 > 1。

如果我申请sklearn.labelEncoder() 那么我会得到:

hotel_id = [0, 1, 2, 1, 2] 

所以这个编码特征被认为是连续的还是分类的? 如果它被视为连续的,那么 labelEncoder() 有什么用。

附:我知道一种热编码。但是大约有 100 个hotel_id,所以不想使用它。 谢谢

【问题讨论】:

【参考方案1】:

LabelEncoder 是一种编码类级别的方法。除了您包含的整数示例之外,请考虑以下示例:

>>> from sklearn.preprocessing import LabelEncoder
>>> le = LabelEncoder()
>>>
>>> train = ["paris", "paris", "tokyo", "amsterdam"]
>>> test = ["tokyo", "tokyo", "paris"]
>>> le.fit(train).transform(test)
array([2, 2, 1]...)

然后,LabelEncoder 允许我们为分类数据分配序数级别。 但是,您注意到的是正确的:即 [2, 2, 1] 被视为数字数据。这是将OneHotEncoder 用于虚拟变量(我知道您说过您希望不使用)的好候选。

请注意,LabelEncoder 必须在 one-hot 编码之前使用,因为 OneHotEncoder 无法处理分类数据。因此,它经常被用作 one-hot 编码的前导。

或者,它可以将您的目标编码为可用的数组。例如,如果 train 是您的分类目标,则需要 LabelEncoder 将其用作 y 变量。

【讨论】:

很好的答案。我想知道是否有一个组合的 LabelEncoder 和 OneHotEncoder? 在 sklearn 最新版本的 OneHotEncoder 中,您不再需要在运行 OneHotEncoder 之前运行 LabelEncoder 步骤,即使是分类数据。您现在可以这样做,一步到位,因为 OneHotEncoder 将首先将分类变量转换为数字。【参考方案2】:

如果您正在运行分类模型,则标签将被视为类并忽略顺序。你不需要onehot。

【讨论】:

#simon “标签”是什么意思? labelEncoder() 的输出?是的,我正在运行多类分类模型。我检查了,labelEncoder() 的输出是 np.array() 类型,单个元素是整数。 是的。目标变量是标签。分类器会将它们视为未排序的类别。 谢谢。如果是这种情况,那么事情就很容易了。但是,为什么我们需要 get_dummies() 或 OneHotEncoding()?由于这两个函数做同样的事情,但增加了维度,如果它按照您所说的方式工作,我们总是可以使用 labelEncoder() 代替。 "分类器会将它们视为未排序的类别。"一般来说,你不能做出这样的声明。这取决于分类器和分类器的实现。例如,scikit-learn DecisionTree 分类器绝对会将这些视为数字,而不是分类。 Getdummies 和 onehot 通常用于特征而非标签。【参考方案3】:

解决此问题的一种方法是将您的数字更改为带有包装inflect

的标签

所以我一直在访问所有数量的酒店 ID,并将它们更改为单词,例如 1 -> 'one' 和 2 -> 'two' ... 99 -> '99'

import inflect
p = inflect.engine()

def toNominal(df,column):
for index, row in df.iterrows():
    df.loc[index, column] =  p.number_to_words(df.loc[index, column])

toNominal(df, 'hotel_id')

【讨论】:

以上是关于sklearn中labelEncoder的工作的主要内容,如果未能解决你的问题,请参考以下文章

LabelEncoding到pandas中的多个列

在 LabelEncoder 中自定义

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

Sklearn LabelEncoder 在排序中抛出 TypeError

sklearn.preprocessing 中 LabelEncoder 的类似方法?

使用 LabelEncoder 转换数据