В чем отличие линейной регрессии от других методов в работе с категориальными признаками
Что проверяют
Понимаете ли вы, что линейная модель видит только числа и как выбор кодирования меняет смысл её коэффициентов. Следом обычно спрашивают про ловушку фиктивных переменных и про признак с тысячами уникальных значений.
Как отвечать
Линейная регрессия умножает признак на коэффициент, поэтому категорию нужно превратить в числа, не придумав несуществующий порядок:
- one-hot: по бинарной колонке на категорию (
OneHotEncoderв scikit-learn,pd.get_dummies). При наличии свободного члена одну категорию выкидывают (drop='first'), иначе колонки линейно зависимы и коэффициенты неоднозначны. Коэффициент тогда читается как сдвиг относительно базовой категории; - порядковое кодирование: для линейной модели годится, только если порядок реален и шаги между уровнями примерно равны («низкий, средний, высокий»). Для городов или брендов оно навязывает ложную зависимость;
- высокая кардинальность: one-hot даёт тысячи разреженных колонок, поэтому нужна регуляризация (Ridge, Lasso) или target encoding. Его считают со схемой кросс-валидации, иначе целевая переменная утечёт в признак. В scikit-learn есть
TargetEncoder, который делает это внутриfit_transform.
Отличие от деревьев и бустинга в двух вещах. Первое: деревьям не страшно порядковое кодирование, они просто режут значения порогами, а часть библиотек умеет категории нативно: LightGBM, CatBoost с упорядоченными целевыми статистиками, HistGradientBoostingRegressor через categorical_features. Второе: деревья сами находят взаимодействия между признаками, а в линейную модель их нужно добавлять явно, например признаком «город × тариф».
Где спотыкаются
Говорят, что любые деревья «работают с категориями напрямую». Классические DecisionTreeRegressor и RandomForestRegressor в scikit-learn ждут числового входа, нативная поддержка зависит от библиотеки.
Кодируют категории числами 1, 2, 3 и отдают линейной модели. Модель честно выучит, что шаг от первой категории ко второй равен шагу от второй к третьей.
Забывают про категории, которых не было в обучении. Без handle_unknown='ignore' или отдельной категории «прочее» пайплайн падает на первых же новых данных.