分类变量

时间:2018-01-23 13:57:42

标签: python pandas scikit-learn

我想在使用sklearn的ML模型之前重新编码分类变量。我将使用变量来建模决策树,而不是用于可视化。

我已经阅读了关于在建模之前转换分类变量的sklearn文档。我也可以 *使用pandas get_dummies函数(虽然这会使有序列的语法为diffucult,因为参数有点笨拙?) *或者我可以使用sklearn的内置函数LabelEncoderOneHotEncoder

为什么我会在一行中的熊猫中使用sklearn?

pd.get_dummies(data=df, columns=['col1', 'col2'], drop_first=True)

以下是我在sklearn中的表现。

# step i) label encoder, to go from strings to intergers 
le = preprocessing.LabelEncoder()
df[colcat] = le.fit_transform(df[colcat])

# step ii) one hot encoder, to go from integers to dummies 
enc = preprocessing.OneHotEncoder()
df[colcat] = enc.fit_transform()

# automate step i and ii 
def labelencoder_and_onehotencoder(x):
    le = preprocessing.LabelEncoder()
    x = le.fit_transform(x)
    enc = preprocessing.OneHotEncoder()
    x = enc.fit_transform(x)
    return x
cols_categorical = ['col1', 'col2'] 
df[cols_categorical] = df[cols_categorical].apply(labelencoder_and_onehotencoder)

1 个答案:

答案 0 :(得分:-1)

get_dummies的作用是最终创建将分类变量转换为二进制变量。

另一方面,

LabelEncoder通常用于枚举分类变量,以便在建模时可以直接使用它们,因为sklearn库通常不允许在建模时处理分类变量,如本示例所示

>>> le = preprocessing.LabelEncoder()
>>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
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']

在您提供的示例中,您使用的编码方式与get_dummies相同,在这种情况下,编码和获取虚拟对象之间的唯一区别是编码通常允许存储转换的位置。

根据我的经验,有时您的建模和测试数据集不具有相同的分类值集合,在这种情况下使用编码会导致您对变量进行错误编码