Зачем нужна нормализация признаков
Что проверяют
Понимаете ли вы, каким моделям масштаб признаков важен, а каким нет, и почему. Следом почти всегда спрашивают: «Нужно ли нормировать признаки для градиентного бустинга?» и «На каких данных вы обучаете скейлер?»
Как отвечать
Нормализация приводит признаки к сопоставимому масштабу. Нужна она там, где модель чувствительна к абсолютным величинам:
- градиентные методы: при признаках разного порядка поверхность функции потерь вытянута, градиентный спуск идёт зигзагом и сходится медленно. Для нейросетей стандартизируют входы, а внутри сети работают BatchNorm и LayerNorm;
- расстояния: kNN, k-means, SVM с RBF-ядром. Без масштабирования доход в сотнях тысяч полностью задавит возраст;
- регуляризация: L1 и L2 штрафуют все коэффициенты одинаково, поэтому масштаб признака меняет силу штрафа для него;
- PCA: ищет направления максимальной дисперсии и без стандартизации просто выберет признак с большими числами.
Деревьям и бустингу (XGBoost, LightGBM, CatBoost) масштаб безразличен: разбиение по порогу не меняется от монотонного преобразования.
Инструменты в scikit-learn: StandardScaler (среднее 0, дисперсия 1), MinMaxScaler (диапазон [0, 1]), RobustScaler (медиана и межквартильный размах, устойчив к выбросам), QuantileTransformer и PowerTransformer для сильно скошенных распределений, логарифм для денег и счётчиков.
Главное правило: скейлер обучают только на train, а к валидации и тесту применяют transform. Надёжнее завернуть его в Pipeline: кросс-валидация не подглядит в валидационный фолд, а в проде применятся ровно те параметры, что были при обучении.
Где спотыкаются
Делают fit_transform на всём датасете до разбиения. Это утечка: статистики теста попадают в обучение, и метрика получается завышенной.
Считают, что нормализация защищает от выбросов. MinMaxScaler как раз к ним очень чувствителен: один выброс сжимает остальные значения в узкую полосу.
Путают термины. «Нормализацией» называют и min-max, и стандартизацию, а класс Normalizer в scikit-learn вообще нормирует строки к единичной норме, а не столбцы.