Как кодировать признак рейтинг от 1 до 5
Что проверяют
Понимаете ли вы, что способ кодирования зависит от природы признака и от модели, а не выбирается по привычке. Рейтинг упорядочен, но расстояния между оценками не обязательно равные. Следом обычно спрашивают, что изменится для линейной модели и для бустинга.
Как отвечать
Сначала назовите тип признака: порядковый, пять значений. Дальше варианты с условиями:
- оставить числом 1..5: для деревьев и градиентного бустинга лучший вариант, модель сама найдёт пороги вроде «рейтинг ≤ 3». Для линейной модели это допущение, что шаг от 1 к 2 весит столько же, сколько от 4 к 5;
- one-hot: снимает допущение о равных интервалах, линейная модель выучит свой вес для каждой оценки. Цена: пять разреженных колонок и потеря порядка, а для регрессии со свободным членом одну категорию выбрасывают (
drop="first"вOneHotEncoder), иначе мультиколлинеарность; OrdinalEncoder: нужен, если рейтинг пришёл строкой («плохо», «отлично»). Порядок задавайте явно черезcategories, иначе он будет алфавитным;- бинаризация: если бизнесу важна граница, добавьте флаг
rating >= 4или схлопните в «негатив, нейтрал, позитив»; - target encoding: для пяти значений обычно избыточен, а без схемы с кросс-валидацией даёт утечку.
Про пропуски: «нет оценки» это не ноль и не тройка. Лучше флаг rating_missing плюс импутация или отдельная категория. Если же рейтинг это среднее по отзывам (4,3), признак уже непрерывный, и рядом полезно число отзывов.
Всё кодирование держите внутри Pipeline с ColumnTransformer, чтобы на инференсе применялось то же преобразование, что при обучении.
Где спотыкаются
Говорят «категориальный, значит one-hot» и теряют порядок, который для бустинга был полезной информацией.
Кодируют строковые оценки через LabelEncoder и получают алфавитный порядок, где «отлично» меньше «плохо». К тому же LabelEncoder предназначен для целевой переменной, а не для признаков.
Заполняют отсутствие рейтинга нулём, после чего модель считает «не оценил» худшей оценкой.