说我有以下输入功能:
hotel_id = [1, 2, 3, 2, 3]
这是具有数值的分类功能。如果我按原样将其交给模型,则模型将其视为连续变量,即,2> 1.
如果我申请sklearn.labelEncoder()
,我会得到:
hotel_id = [0, 1, 2, 1, 2]
所以这个编码的功能被认为是连续的或绝对的? 如果它被视为连续,那么使用labelEncoder()。
P.S。我知道一个热门编码。但是大约有100个hotel_ids所以不想使用它。 感谢
答案 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')