Какие способы предобработки признаков используются и с какими проблемами сталкиваются
Что проверяют
Знаете ли вы стандартный набор преобразований и, главное, понимаете ли, где предобработка ломает валидацию. Почти всегда следом спрашивают, как вы гарантируете, что на проде признаки считаются так же, как при обучении.
Как отвечать
Идите по типам проблем и к каждой называйте инструмент:
- пропуски:
SimpleImputer(среднее, медиана, мода, константа),KNNImputer. Полезно добавить флаг пропуска (add_indicator=True): сам факт отсутствия значения часто информативен. Градиентные бустинги вроде LightGBM и CatBoost обрабатывают пропуски сами; - масштаб:
StandardScaler,MinMaxScaler,RobustScalerна медиане и межквартильном размахе, он устойчив к выбросам. Нужен линейным моделям, SVM, kNN и нейросетям, деревьям нет; - категории:
OneHotEncoder(handle_unknown="ignore")при малом числе значений,OrdinalEncoderдля настоящих порядковых признаков,TargetEncoderпри высокой кардинальности; - распределения: логарифм,
PowerTransformer(Yeo-Johnson),QuantileTransformer, клиппинг выбросов по квантилям; - отбор:
VarianceThreshold, L1-регуляризация, permutation importance,RFE.
Главная мысль ответа: всё это собирается в Pipeline с ColumnTransformer, fit вызывается только на обучающей части, а в кросс-валидацию подаётся пайплайн целиком. Сохраняют тоже его, и на проде работает тот же код. Из проблем назовите утечку, расхождение обучения и продакшена (train/serving skew), дрейф распределений и новые категории, которых не было в трейне.
Где спотыкаются
Масштабируют или заполняют пропуски на всём датасете до train_test_split. Статистики теста утекают в обучение, и метрика получается завышенной. Target encoding без фолдов даёт уже прямую утечку целевой переменной.
Применяют LabelEncoder к номинальным признакам для линейной модели. Он предназначен для таргета и вносит фиктивный порядок: город с кодом 2 для модели оказывается «вдвое больше» города с кодом 1.
Делают предобработку вручную в ноутбуке, а на проде переписывают заново. Малейшее расхождение в порядке колонок или заполнении пропусков тихо портит предсказания, а OneHotEncoder без handle_unknown падает на первой новой категории.