Как привести числовые значения к нормальному распределению и минимизировать влияние выбросов
Что проверяют
Понимаете ли вы, зачем менять форму распределения и каким моделям это нужно. Следом почти всегда спрашивают: выброс это ошибка в данных или редкое, но настоящее значение, и что вы с ним сделаете.
Как отвечать
Начните с оговорки: деревьям и бустингам (LightGBM, CatBoost, XGBoost) форма распределения безразлична, а линейные модели, kNN, SVM и нейросети чувствительны к масштабу и тяжёлым хвостам. Потом инструменты:
- логарифм:
np.log1pдля неотрицательных признаков с длинным правым хвостом (доход, цены, счётчики), нули переносит спокойно; - Бокс-Кокс: подбирает степень по данным, но работает только со строго положительными значениями;
- Йео-Джонсон: та же идея для любых чисел. Оба метода есть в
PowerTransformerизsklearn, по умолчанию там Йео-Джонсон со стандартизацией результата; - квантильное преобразование:
QuantileTransformer(output_distribution='normal')приводит к нормальному виду почти что угодно, но искажает расстояния; RobustScaler: центрирует по медиане и делит на IQR, поэтому пара экстремальных точек не сдвигает шкалу.
С выбросами: найти, понять природу, выбрать действие. Искать можно по IQR (за пределами Q1 - 1.5 * IQR и Q3 + 1.5 * IQR), по модифицированному z-score на медиане, в многомерном случае через IsolationForest. Действия: исправить ошибку ввода, обрезать по перцентилям (винзоризация, например по 1-му и 99-му), добавить признак-флаг, взять устойчивую функцию потерь вроде Huber. Результат проверяйте гистограммой и Q-Q графиком: тест Шапиро-Уилка на больших выборках отвергает нормальность из-за любой мелочи.
Где спотыкаются
Называют стандартизацию способом получить нормальное распределение. StandardScaler меняет только сдвиг и масштаб, скошенный признак после него остаётся таким же скошенным.
Удаляют всё дальше трёх сигм. Среднее и стандартное отклонение сами искажены выбросами, а в задачах вроде антифрода «выброс» и есть целевой класс.
Подбирают параметры преобразования на всём датасете до разбиения. Статистики теста утекают в обучение, и валидация выглядит лучше, чем будет в проде. Всё должно жить внутри Pipeline и обучаться только на train.