Ответ
One-Hot Encoding (OHE) создает проблемы для бустинговых алгоритмов (XGBoost, LightGBM) из-за их природы. Основные причины:
- Высокая разреженность и размерность: OHE создает много новых бинарных признаков, заполненных в основном нулями. Бустинг строит деревья, ищущие информативные разбиения, а в разреженных данных это приводит к неэффективным деревьям с большим количеством бесполезных проверок.
- Переобучение на шум: При высокой кардинальности категориального признака (например, 100+ уникальных значений) OHE создает столько же новых признаков. Бустинг, будучи мощным алгоритмом, может начать "ловить" статистический шум в этих многочисленных бинарных колонках, особенно на небольших выборках.
- Потеря потенциальной информации о порядке: OHE превращает категории в независимые бинарные флаги, уничтожая любые возможные порядковые связи между ними (например, 'низкий', 'средний', 'высокий'), которые дерево могло бы использовать.
Практические альтернативы, которые я использовал:
- Target Encoding / Mean Encoding: Замена категории на среднее значение целевой переменной по этой категории. Эффективно, но требует аккуратной реализации (например, добавления шума или использования кросс-валидации) для избежания дата-лика.
- Встроенные методы в LightGBM и CatBoost: Эти фреймворки могут работать с категориальными признаками напрямую. LightGBM использует особый алгоритм разбиения для них, а CatBoost применяет эффективный вариант таргет-энкодинга.
# Пример: Работа с категориальными признаками в LightGBM без OHE import lightgbm as lgb import pandas as pd
Допустим, 'category_col' - строковый признак
train_data = lgb.Dataset(X_train, label=y_train, categorical_feature=['category_col']) params = {'objective': 'binary', 'metric': 'auc'} gbm = lgb.train(params, train_data)