Какие способы работы с категориальными признаками существуют
Что проверяют
Знаете ли вы больше двух способов кодирования и умеете ли выбирать под модель, а не по привычке. Отдельно смотрят на аккуратность: категориальные признаки это главный источник утечки таргета. Следом спрашивают, как вы с ней боролись и что делать с категорией, которой не было в обучении.
Как отвечать
Пройдите по способам с указанием, где каждый уместен:
- one-hot: базовый вариант для линейных моделей при небольшой кардинальности.
OneHotEncoderв scikit-learn умеетhandle_unknown="ignore",min_frequencyиmax_categories, чтобы редкие значения схлопывались в группу; - ordinal encoding: только для порядковых шкал или для деревьев, которым безразличен масштаб;
- target encoding: статистика таргета по категории со сглаживанием и обязательно вне фолда. В scikit-learn есть
TargetEncoderс внутренней кросс-подгонкой; - частотное кодирование: дёшево, работает как прокси популярности, но игнорирует связь с таргетом;
- хеширование (
FeatureHasher): фиксированная размерность при любой кардинальности ценой коллизий; - эмбеддинги: обучаемые векторы категорий в нейросетях;
- нативная поддержка в бустингах: CatBoost делает всё сам, LightGBM через
categorical_feature, XGBoost черезenable_categorical,HistGradientBoostingчерезcategorical_features="from_dtype".
Практическое правило: до нескольких десятков уникальных значений берите one-hot, дальше таргет-кодирование или нативную поддержку бустинга. Редкие категории объединяйте в «прочее» по порогу, посчитанному на обучающей выборке. Заранее решите, что подставлять незнакомому значению. И весь препроцессинг держите внутри Pipeline и ColumnTransformer, чтобы fit не видел валидацию.
Где спотыкаются
Считают target encoding на всей выборке до разбиения. Метрика на валидации взлетает, на проде модель разваливается, и причину ищут где угодно, кроме кодировщика.
Нумеруют номинальные значения подряд и отдают в линейную модель или kNN. Модель начинает считать, что Казань больше Москвы, потому что индекс выше.
Не думают про новые категории. Кодировщик встречает незнакомый город и падает либо молча выдаёт нули, а мониторинга такого дрейфа нет.