Почему не следует использовать sklearn LabelEncoder для кодирования входных данных? - PullRequest
4 голосов
/ 26 января 2020

документы для sklearn.LabelEncoder начинаются с

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

Почему это так?

Я публикую только один пример того, как эта рекомендация игнорируется на практике, хотя, кажется, загружается больше. https://www.kaggle.com/matleonard/feature-generation содержит

#(ks is the input data)

# Label encoding
cat_features = ['category', 'currency', 'country']
encoder = LabelEncoder()
encoded = ks[cat_features].apply(encoder.fit_transform)

Ответы [ 2 ]

1 голос
/ 26 января 2020

Не так уж важно, что он изменяет выходные значения y, потому что он переучивается только на основании этого (если это регрессия, основанная на ошибке).

Проблема, если он изменяет веса входные значения «X», которые делают невозможным делать правильные прогнозы.

Вы можете сделать это на X, если вариантов не так много, например, 2 категории, 2 валюты, 2 города, закодированные в int-s. не сильно меняет игру.

0 голосов
/ 26 января 2020

Я думаю, что они предупреждают об использовании его для X (входные данные), потому что:

  • Категориальные входные данные лучше кодируются как одно горячее кодирование, а не как целые числа в большинстве случаев поскольку в большинстве случаев у вас есть несортируемые категории.

  • Во-вторых, другая техническая проблема будет заключаться в том, что LabelEncoder не запрограммирован для обработки таблиц (для столбцов / функций кодирования будет необходимо для ИКС). LabelEncoder предполагает, что данные представляют собой простой список. Это будет проблемой.

from sklearn.preprocessing import LabelEncoder

enc = LabelEncoder()

categories = [x for x in 'abcdabaccba']
categories
## ['a', 'b', 'c', 'd', 'a', 'b', 'a', 'c', 'c', 'b', 'a']

categories_numerical = enc.fit_transform(categories)

categories_numerical
# array([0, 1, 2, 3, 0, 1, 0, 2, 2, 1, 0])

# so it makes out of categories numbers
# and can transform back

enc.inverse_transform(categories_numerical)
# array(['a', 'b', 'c', 'd', 'a', 'b', 'a', 'c', 'c', 'b', 'a'], dtype='<U1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...