Лучшие практики для кодирования категориальных функций для деревьев решений?

13

При кодировании категориальных признаков для линейной регрессии существует правило: количество манекенов должно быть на единицу меньше общего количества уровней (чтобы избежать коллинеарности).

Существует ли подобное правило для деревьев решений (в мешках, усиленных)? Я спрашиваю об этом, потому что стандартная практика в Python, по-видимому, заключается в расширении nуровней в nманекены (sklearns ' OneHotEncoderили Pandas' pd.get_dummies), что кажется мне неоптимальным.

Что бы вы посоветовали в качестве лучших практик для кодирования категориальных функций для деревьев решений?

Сергей Бушманов
источник

Ответы:

12

Кажется, вы понимаете, что вы можете иметь nуровни, а не n-1потому, что в отличие от линейной регрессии вам не нужно беспокоиться о совершенной колинеарности.

(Я подхожу к этому с точки зрения R, но я предполагаю, что в Python то же самое.) Это зависит от нескольких моментов, таких как: 1) какой пакет вы используете и 2) сколько у вас уровней факторов.

1) Если вы используете randomForestпакет R , то если у вас <33 факторных уровня, вы можете оставить их в одной функции, если хотите. Это связано с тем, что в реализации случайного леса R он будет проверять, какие уровни факторов должны быть на одной стороне разделения, а какие на другой (например, 5 ваших уровней могут быть сгруппированы на левой стороне, а 7 могут быть сгруппированы вместе справа). Если вы разделите категорический признак на nпустышки, то алгоритм не будет иметь этой опции в своем распоряжении.

Очевидно, что если конкретный пакет, который вы используете, не может обрабатывать категориальные функции, вам просто нужно создать nфиктивные переменные.

2) Как я упоминал выше, реализация случайного леса R может обрабатывать только 32 факторных уровня - если у вас их больше, вам нужно либо разделить ваши факторы на меньшие подмножества, либо создать фиктивную переменную для каждого уровня.

цацка
источник
1
Спасибо! Правильно ли я вас понимаю: если я не моделирую в R, где категориальные особенности в randomForestкодируются автоматически, я должен пойти с nпустышками, потому что коллинеарность не проблема для RF?
Сергей Бушманов
3
Наличие более чем 32-уровневых двоично-закодированных категорий будет иметь немного другое поведение в дереве, поскольку RF будет просто выбирать из этих двоичных столбцов, а не выбирать один столбец фактора со многими уровнями. Эта небольшая разница означает, что разделение по двоичным столбцам будет менее информативным по сравнению с разделением по столбцу факторов, поскольку существует только один выбор (0/1) по сравнению с (1 / {2,3}, {2,1} / 3 ) и т. д.
Sycorax говорит восстановить Монику
@ user777 Это не проблема наличия более 32 переменных. Проблема в том, что в Python нет «сгруппированных» переменных категории sklearn... Практически говоря, есть ли доказательства (практический опыт, исследования и т. Д.), Что «дублированные» переменные будут работать хуже, чем «сгруппированные» категориальные переменные [в R]
Сергей Бушманов
1
Теоретически, мы можем ожидать, что не сгруппированные будут работать немного хуже, потому что вы даете модели меньше гибкости. В сгруппированном случае, если было бы действительно лучше рассматривать эту функцию как не сгруппированную, то модель могла бы сделать это (поместив одну группу с одной стороны, а затем все остальные с другой). Однако на практике я был бы удивлен, если бы было много различий (особенно в случае RF, где вы создаете так много деревьев)
Tchotchke
2
Я считаю, что реализация randomForest, использующая функции со многими факторными уровнями (> 15), медленна, как уже упоминалось, но также дает посредственную производительность модели. Я предполагаю, что очень большое количество возможных расколов уменьшит предполагаемую декорреляцию деревьев в ансамбле. extraTrees и Rborist пробуют только подвыборку катагорических разбиений в каждом узле. Это может помочь декорреляции и, конечно, скорости. Таким образом, возможен диапазон решений между «randomForest try any split» и «sklern dummy-variable только try 1-vs-rest split». Также могут оказаться полезными различные кластеры многих уровней на меньшее количество уровней.
Сорен Хавелунд Веллинг
4

Существует другой подход к работе с категориальными переменными, который называется целевым / ударным кодированием.

В этой схеме идея заключается в кодировании объекта с использованием одного столбца с плавающей точкой, в котором значение является средним значением целевой переменной по всем строкам, которые разделяют категорию. Это особенно полезно для моделей на основе дерева, поскольку оно накладывает порядок порядка внутри объекта (т. Е. Значения справа от категории имеют более высокий средний отклик, чем значения слева), и это облегчает разделение пространства предиктора.

Вот хорошее объяснение предмета:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

А вот ссылка на документ, в котором изначально была предложена кодировка: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Есть еще некоторые подробности, чтобы избежать оценки среднего значения в категориях с низким количеством, а также есть другая модель, CatBoost, предлагающая решение смещения, представленного этим кодированием, но по моему опыту это простой и очень полезный способ кодирования категориальных переменных с высокой кардинальностью. ,

Ludecan
источник