Как обрабатывать пропуски и категориальные признаки перед обучением модели
Что проверяют
Понимаете ли вы, что способ обработки зависит от природы пропуска и от модели, и умеете ли сделать это без утечки данных. Следом часто просят написать пайплайн на scikit-learn или спрашивают, что делать с категорией, которой не было в обучении.
Как отвечать
С пропусками сначала выясните, почему они есть: случайно (MCAR), зависят от других признаков (MAR) или от самого значения (MNAR, например доход не указывают те, у кого он низкий). Сам факт пропуска часто информативен. Инструменты:
SimpleImputer: стратегииmean,median,most_frequent,constant. Для скошенных признаков медиана устойчивее среднего, аadd_indicator=Trueдобавляет флаг пропуска;KNNImputerиIterativeImputer: заполнение по соседям или моделью, второй всё ещё экспериментальный и требует импортаenable_iterative_imputer;- нативная поддержка:
HistGradientBoostingClassifier, LightGBM, XGBoost и CatBoost работают сNaNсами.
С категориальными признаками выбор зависит от модели и кардинальности:
OneHotEncoder: для линейных моделей и небольшого числа категорий.handle_unknown="ignore"спасает от новых значений на проде,min_frequencyсворачивает редкие в одну;OrdinalEncoder: для деревьев или когда порядок осмыслен;TargetEncoder: для высокой кардинальности, вfit_transformсам делает кросс-фиттинг против утечки таргета. CatBoost решает то же своими упорядоченными статистиками.
Всё собирается в ColumnTransformer внутри Pipeline: fit вызывается только на train, а на валидации и проде только transform.
Где спотыкаются
Заполняют пропуски средним по всему датасету до разбиения на train и test. Статистика теста утекает в обучение, метрика завышена.
Пишут код под старые версии: OneHotEncoder(sparse=False) в актуальном scikit-learn падает, параметр называется sparse_output. А df["col"].fillna(..., inplace=True) с Copy-on-Write, который стал поведением по умолчанию в pandas 3.0, исходный датафрейм не меняет.
Кодируют номинальные признаки через LabelEncoder для линейной модели. Он предназначен для таргета, а модель начинает видеть в городах осмысленный порядок.