XGBoost Категориальные переменные: Dummification vs encoding
При использовании XGBoost
нам нужно преобразовать категориальные переменные в числовые.
Будет ли какая-либо разница в показателях производительности/оценки между методами:
- dummifying ваши категориальные переменные
- кодируя ваши категориальные переменные от eg (a, b, c) до (1,2,3)
ТАКЖЕ:
labelencoder
ли какие-либо причины не идти с методом 2, используя, например, labelencoder
?
Ответы
Ответ 1
xgboost
только с числовыми столбцами.
если у вас есть функция [a,b,b,c]
которая описывает категориальную переменную (т.е. числовое отношение)
Используя LabelEncoder, вы просто получите следующее:
array([0, 1, 1, 2])
Xgboost
неправильно интерпретирует эту функцию как числовое отношение! Это просто отображает каждую строку ('a','b','c')
в целое число, не более того.
Надлежащим образом
Используя OneHotEncoder, вы в конце концов доберетесь до этого:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
Это правильное представление категориальной переменной для xgboost
или любого другого инструмента машинного обучения.
Pandas get_dummies - отличный инструмент для создания фиктивных переменных (что, на мой взгляд, проще в использовании).
Метод № 2 в вышеуказанном вопросе не будет представлять данные правильно
Ответ 2
Я хочу ответить на этот вопрос не только с точки зрения XGBoost, но и с точки зрения любой проблемы, связанной с категориальными данными. В то время как "думмификация" создает очень разреженную настройку, особенно если у вас есть несколько категориальных столбцов с разными уровнями, кодировка ярлыков часто предвзята, так как математическое представление не отражает отношения между уровнями.
Для проблем с бинарной классификацией гениальный, но неизведанный подход, который сильно зависит от традиционных моделей кредитного скоринга, заключается в том, чтобы использовать вес доказательств для замены категориальных уровней. В принципе, каждый категориальный уровень заменяется долей Товаров/Процент Плохих.
Можно прочитать об этом здесь.
Здесь находится библиотека Python.
Этот метод позволяет вам захватывать "уровни" под одним столбцом и избегать разреженности или индукции смещения, которые могут возникать с помощью думминга или кодирования.
Надеюсь это поможет !