XGBoost Категориальные переменные: Dummification vs encoding

При использовании XGBoost нам нужно преобразовать категориальные переменные в числовые.

Будет ли какая-либо разница в показателях производительности/оценки между методами:

  1. dummifying ваши категориальные переменные
  2. кодируя ваши категориальные переменные от 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.

Этот метод позволяет вам захватывать "уровни" под одним столбцом и избегать разреженности или индукции смещения, которые могут возникать с помощью думминга или кодирования.

Надеюсь это поможет !