在sklearn中使用labelEncoder

时间:2017-01-20 23:01:55

标签: python machine-learning scikit-learn categorical-data

说我有以下输入功能:

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

这是具有数值的分类功能。如果我按原样将其交给模型,则模型将其视为连续变量,即,2> 1.

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

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

所以这个编码的功能被认为是连续的或绝对的? 如果它被视为连续,那么使用labelEncoder()。

P.S。我知道一个热门编码。但是大约有100个hotel_ids所以不想使用它。 感谢

3 个答案:

答案 0 :(得分:9)

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,因为OneHotEncoder无法处理分类数据。因此,它经常被用作单热编码的前传。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

解决此问题的一种方法是将您的号码更改为标签包 inflect

所以我一直在访问所有酒店的ID,我已将它们改为单词,例如1 - > '一'和2 - > '两个'... 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')