为什么应该将sklearn的LabelEncoder仅用于目标变量?

时间:2020-07-14 09:31:34

标签: python machine-learning scikit-learn label-encoding

我试图用LabelEncoder创建管道以转换分类值。

cat_variable = Pipeline(steps = [
    ('imputer',SimpleImputer(strategy = 'most_frequent')),
    ('lencoder',LabelEncoder())
])
                        
num_variable = SimpleImputer(strategy = 'mean')

preprocess = ColumnTransformer (transformers = [
    ('categorical',cat_variable,cat_columns),
    ('numerical',num_variable,num_columns)
])

odel = RandomForestRegressor(n_estimators = 100, random_state = 0)

final_pipe = Pipeline(steps = [
    ('preprocessor',preprocess),
    ('model',model)
])

scores = -1 * cross_val_score(final_pipe,X_train,y,cv = 5,scoring = 'neg_mean_absolute_error')

但这会引发TypeError:


TypeError: fit_transform() takes 2 positional arguments but 3 were given

在进一步参考中,我发现LabelEncoders之类的转换器不应该与功能一起使用,而应该仅在预测目标上使用。

From Documentation:

sklearn.preprocessing.LabelEncoder类

使用0到n_classes-1之间的值编码目标标签。

此转换器应用于编码目标值(即y)而不是输入X。

我的问题是,为什么我们不能在特征变量上使用LabelEncoder,并且还有其他条件类似的转换器吗?

1 个答案:

答案 0 :(得分:1)

LabelEncoder可用于规范化标签或转换非数字标签。对于分类输入,应使用OneHotEncoder

区别:

le = preprocessing.LabelEncoder()
le.fit_transform([1, 2, 2, 6])
array([0, 0, 1, 2])

enc = OneHotEncoder(handle_unknown='ignore')
enc.fit_transform([[1], [2], [2], [6]]).toarray()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])