Квантильное преобразование (Quantile Transformer) — это метод непараметрического преобразования числовых признаков, который принудительно задаёт нужное распределение (например, нормальное или равномерное) для данных. Основная идея — сопоставить значения исходного признака с квантилями целевого распределения.

Как это работает (основной принцип)

Алгоритм работает в два этапа:

  1. Оценка кумулятивной функции распределения (CDF):

    • Для каждого признака строится оценка его функции распределения (используя обучающие данные). По сути, он запоминает, какая доля данных имеет значение меньше или равное каждому конкретному значению признака. Для этого часто используется ранжирование (порядковые статистики) или сглаженная оценка.
  2. Отображение на целевое распределение:

    • Каждое исходное значение признака заменяется на соответствующий квантиль целевого распределения.
    • Если целевое распределение — равномерное Uniform(0, 1), то значение преобразуется в его перцентиль (процентное ранговое значение).
    • Если целевое распределение — нормальное Normal(0, 1), то полученный перцентиль затем отображается с помощью обратной функции нормального распределения (PPF — Percent Point Function).

Проще говоря: Метод выстраивает все ваши данные по порядку, присваивает им “ранги” (от 0 до 1), а затем подставляет эти ранги в желаемое распределение.

Ключевые характеристики

  • Непараметрический метод: Не делает предположений о виде исходного распределения (в отличие от Box-Cox, который предполагает, что данные можно привести к нормальному с помощью степенного преобразования).
  • Устойчивость к выбросам: Поскольку преобразование основано на рангах, выбросы не оказывают катастрофического влияния. Самый большой выброс просто станет, например, 99.9-м перцентилем.
  • Сжимает диапазон: Все данные после преобразования оказываются в конечном диапазоне (для нормального распределения — примерно [-3.5, 3.5], для равномерного — точно [0, 1]).
  • Монотонность: Преобразование сохраняет порядок исходных данных.

Варианты преобразования

В библиотеке scikit-learn у QuantileTransformer есть два основных параметра:

  1. output_distribution='uniform' (по умолчанию): Преобразует данные к равномерному распределению в диапазоне [0, 1].
  2. output_distribution='normal': Преобразует данные к стандартному нормальному распределению (среднее = 0, стандартное отклонение = 1).

Преимущества

  1. Универсальность: Эффективно работает с данными любого исходного распределения (сильно скошенными, мультимодальными).
  2. Устранение проблем масштаба: Все признаки приводятся к одинаковому диапазону/распределению, что полезно для линейных моделей, SVM, методов, основанных на расстоянии (KNN), и градиентного спуска.
  3. Нелинейность: Способно выявлять нелинейные зависимости, которые могли быть скрыты в исходных данных.
  4. Подавление выбросов: Выбросы перестают быть экстремальными значениями, так как “встраиваются” в хвосты целевого распределения.

Недостатки и предосторожности

  1. Риск переобучения (Data Leakage): Алгоритм для своей работы должен “запомнить” распределение обучающей выборки. Крайне важно:
    • Обучать QuantileTransformer только на тренировочных данных.
    • Затем использовать .transform() для преобразования валидационной и тестовой выборок. Нельзя заново обучать трансформер на этих данных.
  2. Изменение распределения: Иногда исходное распределение содержит важную для модели информацию (например, закономерности в выбросах). Квантильное преобразование эту информацию разрушает.
  3. Вычислительная сложность: Требует сортировки данных и хранения информации о квантилях, что может быть затратно для очень больших наборов данных.
  4. Неинтерпретируемость: После преобразования теряется прямой физический смысл исходных признаков.

Сравнение с другими методами

МетодИдеяРабота с выбросамиТип преобразования
Квантильное преобразованиеСопоставление с квантилями целевого распределенияУстойчив (работает с рангами)Непараметрический, нелинейный
Стандартизация (Z-score)(x — mean) / stdЧувствителен (mean и std “тянутся” выбросами)Линейный
Min-Max Scaling(x — min) / (max — min)Очень чувствителенЛинейный
Box-Cox/Yeo-JohnsonОптимизация параметра λ для максимальной нормальностиЧувствителенПараметрический, нелинейный

Когда использовать?

  • Когда данные имеют сложное, нестандартное распределение, а вам нужно привести их к нормальному виду для алгоритмов, которые на этом основаны (например, некоторые линейные модели).
  • Когда в данных много выбросов, и вы хотите ослабить их влияние, не прибегая к удалению.
  • Когда нужно, чтобы все признаки имели одинаковое распределение (не только масштаб).

Практический пример (Python, scikit-learn)

import numpy as np
from sklearn.preprocessing import QuantileTransformer
 
# Создаем скошенные данные с выбросами
X = np.random.exponential(scale=2.0, size=(100, 1))
X = np.vstack([X, np.array([[10], [12]])])  # Добавляем выбросы
 
# Инициализируем трансформер для нормального распределения
transformer = QuantileTransformer(output_distribution='normal', random_state=0)
 
# Обучаем и преобразуем данные
X_transformed = transformer.fit_transform(X)
 
# Теперь X_transformed будет иметь распределение, близкое к N(0,1)
print(f"Среднее: {X_transformed.mean():.2f}, Std: {X_transformed.std():.2f}")

Квантильное преобразование — мощный и гибкий инструмент для работы с “неидеальными” данными, особенно когда важна устойчивость к выбросам и нестандартным распределениям. Однако его нужно применять с осторожностью, помня о риске переобучения и потере интерпретируемости.