Какие способы кодирования категориальных признаков существуют
Что проверяют
Знаете ли вы способы и понимаете ли, где возникает утечка целевой переменной.
Как отвечать
- Прямое кодирование (one-hot): по колонке на категорию. Прямолинейно и корректно для линейных моделей. Проблема при высокой мощности признака: тысяча городов даёт тысячу колонок, матрица становится разреженной, а деревьям такие признаки мешают, потому что каждое разбиение отделяет одну категорию;
- порядковое кодирование: категории заменяются числами. Корректно для действительно упорядоченных признаков (уровень образования, размер). Для номинальных вводит несуществующий порядок, что критично для линейных моделей и почти безразлично для деревьев;
- кодирование по частоте или количеству: категория заменяется тем, как часто она встречается. Дёшево, не растит размерность, иногда неожиданно информативно;
- кодирование целевой переменной: категория заменяется средним значением цели по ней. Очень мощно при высокой мощности признака, но именно здесь главная опасность утечки. Считать среднее по всей выборке нельзя: в признак попадает ответ. Правильно считать внутри фолдов кросс-валидации и добавлять сглаживание к общему среднему, иначе редкие категории получат экстремальные значения;
- хеширование: категория отображается в фиксированное число колонок. Размерность контролируется, новые категории обрабатываются автоматически, платой служат коллизии;
- обучаемые представления: категория превращается в вектор, обучаемый вместе с моделью. Стандарт для нейросетей и рекомендательных систем.
Отдельно стоит сказать про CatBoost: он обрабатывает категориальные признаки сам, применяя упорядоченную схему кодирования по цели, устойчивую к утечке. Часто это лучший ответ, чем ручное кодирование.
Практические вопросы, которые надо решить в любом случае: что делать с редкими категориями (объединять в общую группу) и с новыми категориями в проде, которых не было при обучении. Без запасного пути модель упадёт на первом же незнакомом значении.
Где спотыкаются
Считают целевое кодирование по всей выборке и получают утечку.
Применяют прямое кодирование к признаку с тысячами значений.
Не предусматривают поведение при новой категории.
Вводят порядок там, где его нет, для линейной модели.