Почему LabelEncoder из sklearn следует использовать только для целевой переменной? - PullRequest
1 голос
/ 14 июля 2020

Я пытался создать конвейер с 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, не должны использоваться с функциями и должны использоваться только для цели прогнозирования.

Из документации:

class sklearn.preprocessing .LabelEncoder

Кодировать целевые метки со значением от 0 до n_classes-1.

Этот преобразователь следует использовать для кодирования целевых значений, то есть y, а не входных X.

Мой вопрос: почему мы не можем использовать LabelEncoder для переменных функций и есть ли другие преобразователи, у которых есть такое условие?

1 Ответ

1 голос
/ 14 июля 2020

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.]])
...