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的工作的主要内容,如果未能解决你的问题,请参考以下文章
sklearn.preprocessing 中 LabelEncoder 的类似方法?
Sklearn LabelEncoder 在排序中抛出 TypeError
为啥不应该使用 sklearn LabelEncoder 对输入数据进行编码?