Обсуждение участника:Imil Baltaniazov

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
 
Строка 1: Строка 1:
-
{{well|Статья написана с использованием LLM Claude Sonnet 5 и проверена участником Imil Baltaniazov 16:49, 10 июля 2026 (MSD)}}
+
```
 +
{{well|Статья написана с использованием LLM Claude Sonnet 5 и проверена участником Imil Baltaniazov 15:56, 10 июля 2026 (MSD)}}
-
'''Метрики качества в машинном обучении''' — совокупность количественных показателей, позволяющих оценить эффективность работы модели и сравнить между собой различные алгоритмы. Выбор метрики определяет цель оптимизации и непосредственно влияет на поведение обученной модели в реальных условиях эксплуатации.
+
'''Нормализация признаков''' и '''стандартизация признаков''' (обобщённо ''масштабирование признаков'', англ. ''feature scaling'') — методы [[Предобработка данных|предварительной обработки данных]], приводящие числовые [[Признак|признаки]] к сопоставимому диапазону значений или к сопоставимой статистической форме распределения. Масштабирование не меняет информативность признака в статистическом смысле (взаимную связь с целевой переменной), но существенно влияет на поведение многих алгоритмов [[Машинное обучение|машинного обучения]] — от скорости сходимости [[Градиентный спуск|градиентных методов]] до корректности работы [[Регуляризация|регуляризации]] и методов, основанных на расстояниях между объектами.
-
== Введение ==
+
В литературе термины употребляются не вполне единообразно. В узком смысле ''нормализацией'' называют приведение признака к фиксированному диапазону, чаще всего <tex>[0,1]</tex> (min-max scaling), а ''стандартизацией'' — приведение к нулевому среднему и единичной дисперсии (z-score). В широком смысле оба термина нередко используются как синонимы для обозначения любого масштабирования признаков; в данной статье эти понятия разграничиваются в узком, более строгом смысле. Наряду с ними рассматривается робастное масштабирование и ряд специализированных преобразований (MaxAbsScaler, PowerTransformer, QuantileTransformer), реализованных, в частности, в модуле <tt>sklearn.preprocessing</tt> библиотеки [[Scikit-learn|scikit-learn]].
-
'''Метрика качества''' (англ. evaluation metric) — это функция, отображающая предсказания модели и истинные значения целевой переменной в числовую оценку, характеризующую степень соответствия модели решаемой задаче. В отличие от [[функция потерь|функции потерь]], используемой на этапе обучения и обязанной быть дифференцируемой, метрика качества может быть произвольной вычислимой функцией, что позволяет точнее отражать бизнес-требования или клинические стандарты.
+
== Постановка задачи ==
-
Корректный выбор метрики критически важен по двум причинам. Во-первых, метрика служит ориентиром при [[валидация модели|валидации]] и отборе моделей: модель, оптимальная по одной метрике, может оказаться неприемлемой по другой. Во-вторых, в условиях [[дисбаланс классов|дисбаланса классов]] или асимметричной цены ошибок традиционные метрики вроде [[Accuracy|доли правильных ответов]] дают чрезмерно оптимистичную картину, маскируя неспособность модели распознавать миноритарный класс.
+
Признаки, описывающие объекты реального мира, как правило, измерены в разных единицах и имеют разные диапазоны значений. Рассмотрим задачу [[Классификация|классификации]] клиентов банка, где каждый объект описывается двумя признаками — возрастом (в годах) и месячным доходом (в рублях):
-
== Матрица ошибок ==
+
{| class="wikitable"
-
 
+
! Клиент !! Возраст, лет !! Доход, руб./мес.
-
'''[[Матрица ошибок]]''' (англ. confusion matrix) для задачи [[бинарная классификация|бинарной классификации]] представляет собой таблицу размером 2×2, строки которой соответствуют истинным классам, а столбцы — предсказанным. Приняты следующие обозначения:
+
-
 
+
-
{| class="wikitable" style="text-align:center;"
+
-
|+ Матрица ошибок бинарного классификатора
+
-
|-
+
-
! colspan="2" rowspan="2" |
+
-
! colspan="2" | Предсказанный класс
+
-
|-
+
-
! Положительный (P)
+
-
! Отрицательный (N)
+
|-
|-
-
! rowspan="2" | Истинный класс
+
| Иванов || 25 || 45 000
-
! Положительный (P)
+
-
| style="background:#d4edda;" | TP<br>(True Positive)
+
-
| style="background:#f8d7da;" | FN<br>(False Negative)
+
|-
|-
-
! Отрицательный (N)
+
| Петров || 45 || 47 000
-
| style="background:#f8d7da;" | FP<br>(False Positive)
+
-
| style="background:#d4edda;" | TN<br>(True Negative)
+
|}
|}
-
Здесь:
+
Возраст изменяется в диапазоне единиц-десятков, доход — в диапазоне десятков тысяч. Если вычислить евклидово расстояние между объектами без предварительного масштабирования:
-
* <tex>\text{TP}</tex> (True Positive) — число верно предсказанных положительных объектов;
+
:: <tex>d = \sqrt{(45-25)^2 + (47000-45000)^2} = \sqrt{400 + 4\,000\,000} \approx 2000{,}1</tex>
-
* <tex>\text{TN}</tex> (True Negative) — число верно предсказанных отрицательных объектов;
+
-
* <tex>\text{FP}</tex> (False Positive) — число ошибочно предсказанных положительных объектов ([[ошибка I рода]]);
+
-
* <tex>\text{FN}</tex> (False Negative) — число ошибочно предсказанных отрицательных объектов ([[ошибка II рода]]).
+
-
Сумма всех элементов равна общему числу наблюдений: <tex>N = \text{TP} + \text{TN} + \text{FP} + \text{FN}</tex>.
+
признак «возраст» практически не вносит вклада в итоговое расстояние: его слагаемое (400) на четыре порядка меньше слагаемого дохода (4 000 000). Для любого метода, опирающегося на расстояния между объектами — [[Метод ближайших соседей|метода ближайших соседей]], [[Метод опорных векторов|метода опорных векторов]], кластеризации методом k-средних, [[Метод главных компонент|метода главных компонент]] — это означает, что признак с большим численным диапазоном будет доминировать в решении независимо от его действительной значимости для задачи.
-
== Метрики для бинарной классификации ==
+
Аналогичная проблема возникает при обучении моделей [[Градиентный спуск|градиентными методами]]. Функция потерь как функция параметров модели образует в пространстве весов некоторую поверхность; при сильно различающихся масштабах признаков линии уровня этой поверхности превращаются в вытянутые эллипсы с большим числом обусловленности гессиана. Градиентный спуск на такой поверхности движется зигзагообразно, и для достижения минимума требуется существенно больше итераций либо очень малый шаг обучения. После масштабирования признаков линии уровня приближаются по форме к окружностям, направление антиградиента указывает более точно на минимум, и сходимость ускоряется — этот эффект хорошо задокументирован для [[Линейная регрессия|линейной]] и [[Логистическая регрессия|логистической регрессии]], а также для [[Нейронная сеть|нейронных сетей]].
-
На основе матрицы ошибок вычисляются производные показатели, каждый из которых отражает определённый аспект качества классификации.
+
== Нормализация (min-max scaling) ==
-
=== Accuracy (доля правильных ответов) ===
+
'''Min-max scaling''' линейно преобразует признак так, чтобы его значения попали в заданный диапазон, чаще всего <tex>[0,1]</tex>:
-
:: <tex>\text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}</tex>
+
:: <tex>x' = \frac{x - x_{min}}{x_{max} - x_{min}}</tex>
-
'''[[Accuracy]]''' показывает общую долю верных предсказаний. Метрика интуитивно понятна, но непригодна при сильном дисбалансе классов. Если отрицательный класс составляет 99% выборки, константный классификатор, всегда предсказывающий отрицательный класс, достигнет Accuracy = 0.99, будучи абсолютно бесполезным для детекции положительного класса.
+
где <tex>x_{min}</tex> и <tex>x_{max}</tex> — минимальное и максимальное значен
 +
ия признака на обучающей выборке. Для произвольного целевого диапазона <tex>[a,b]</tex> формула обобщается:
-
=== Precision (точность) ===
+
:: <tex>x' = a + \frac{(x - x_{min})(b-a)}{x_{max} - x_{min}}</tex>
-
:: <tex>\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}</tex>
+
Метод сохраняет форму исходного распределения (все относительные расстояния между значениями пропорционально сжимаются или растягиваются), что удобно, когда диапазон признака имеет содержательный смысл — например, для признаков, ограниченных по своей природе (доля, вероятность, пиксельная интенсивность 0–255), а также при подготовке входов для нейронных сетей с сигмоидными или иными ограниченными функциями активации.
-
'''[[Точность и полнота|Precision]]''' измеряет долю истинно положительных объектов среди всех, кого модель отнесла к положительному классу. Высокая точность означает, что модель редко ошибается, называя объект положительным. Метрика критична в задачах, где цена ложноположительного срабатывания велика — например, при фильтрации спама, когда ложное отнесение легитимного письма к спаму нежелательно.
+
Существенный недостаток — высокая чувствительность к выбросам, поскольку <tex>x_{min}</tex> и <tex>x_{max}</tex> определяются единственными экстремальными наблюдениями. Продемонстрируем это на выборке значений дохода (тыс. руб.): 30, 45, 50, 55, 60, 65, 400, где последнее значение — аномально высокий доход.
-
=== Recall (полнота) ===
+
Здесь <tex>x_{min}=30</tex>, <tex>x_{max}=400</tex>, диапазон равен 370. После min-max масштабирования:
-
:: <tex>\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}</tex>
+
{| class="wikitable"
 +
! Исходное значение !! После Min-Max
 +
|-
 +
| 30 || 0,000
 +
|-
 +
| 45 || 0,041
 +
|-
 +
| 50 || 0,054
 +
|-
 +
| 55 || 0,068
 +
|-
 +
| 60 || 0,081
 +
|-
 +
| 65 || 0,095
 +
|-
 +
| 400 (выброс) || 1,000
 +
|}
-
'''[[Точность и полнота|Recall]]''' (также называемый '''Sensitivity''' или '''True Positive Rate''') показывает, какую долю истинно положительных объектов модель сумела обнаружить. Метрика приоритетна в задачах, где пропуск положительного объекта недопустим — например, в [[медицинская диагностика|скрининге онкологических заболеваний]], когда ложноотрицательный диагноз стоит жизни.
+
Единственный выброс растянул диапазон настолько, что все «типичные» значения оказались сжаты в узкий интервал <tex>[0;\,0{,}095]</tex> и стали практически неразличимы для алгоритма. Это ключевое ограничение метода: перед его применением рекомендуется отдельно проверить данные на наличие выбросов (см. [[Выброс|выбросы]]).
-
=== Specificity (специфичность) ===
+
В scikit-learn метод реализован классом <tt>MinMaxScaler</tt>:
-
:: <tex>\text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}}</tex>
+
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import MinMaxScaler
-
'''[[Specificity]]''' (True Negative Rate) — доля верно распознанных отрицательных объектов. Совместно с Recall образует пару, характеризующую способность модели разделять классы. В медицинской диагностике Specificity показывает, насколько хорошо тест исключает заболевание у здоровых пациентов.
+
scaler = MinMaxScaler(feature_range=(0, 1))
 +
X_scaled = scaler.fit_transform(X)
 +
</syntaxhighlight>
-
=== F1-мера ===
+
== Стандартизация (z-score) ==
-
:: <tex>F_1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}</tex>
+
'''Стандартизация''' (z-score normalization) центрирует признак относительно среднего и масштабирует его по стандартному отклонению:
-
'''[[F-мера|F1-мера]]''' — гармоническое среднее Precision и Recall. В отличие от арифметического, гармоническое среднее сильнее штрафует дисбаланс составляющих: если одна из метрик близка к нулю, F1 также будет близка к нулю. Это делает F1 удобной агрегированной метрикой, когда важен баланс между точностью и полнотой. Обобщением служит <tex>F_\beta</tex>-мера:
+
:: <tex>x' = \frac{x - \mu}{\sigma}</tex>
-
:: <tex>F_\beta = (1 + \beta^2) \cdot \frac{\text{Precision} \cdot \text{Recall}}{\beta^2 \cdot \text{Precision} + \text{Recall}}</tex>
+
где
-
Параметр <tex>\beta > 1</tex> увеличивает вес Recall, <tex>\beta < 1</tex> — вес Precision.
+
:: <tex>\mu = \frac{1}{n}\sum_{i=1}^{n} x_i, \qquad \sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2}</tex>
-
=== Сводная таблица метрик ===
+
После преобразования признак имеет нулевое среднее и единичную дисперсию: <tex>\mathbb{E}[x']=0</tex>, <tex>\mathrm{Var}[x']=1</tex>. Величина <tex>x'</tex> показывает, на сколько стандартных отклонений исходное значение отстоит от среднего, что делает интерпретацию наглядной при приближённо [[Нормальное распределение|нормальном распределении]] признака: согласно правилу «трёх сигм» около 68 % значений попадают в интервал <tex>[-1,1]</tex>, около 95 % — в <tex>[-2,2]</tex>. При этом сама по себе стандартизация не делает распределение нормальным — она лишь центрирует и масштабирует его, сохраняя исходную форму (асимметрию, эксцесс).
 +
 
 +
Продолжим пример с доходом. Для выборки {30, 45, 50, 55, 60, 65, 400} среднее <tex>\mu \approx 100{,}71</tex>, стандартное отклонение <tex>\sigma \approx 122{,}63</tex>. После стандартизации:
{| class="wikitable"
{| class="wikitable"
-
|+ Основные метрики бинарной классификации
+
! Исходное значение !! После Z-score
 +
|-
 +
| 30 || −0,577
|-
|-
-
! Метрика
+
| 45 || −0,454
-
! Формула
+
-
! Когда использовать
+
|-
|-
-
| Accuracy
+
| 50 || −0,414
-
| <tex>\frac{\text{TP} + \text{TN}}{N}</tex>
+
-
| Сбалансированные классы, равнозначные ошибки
+
|-
|-
-
| Precision
+
| 55 || −0,373
-
| <tex>\frac{\text{TP}}{\text{TP} + \text{FP}}</tex>
+
-
| Высокая цена ложных срабатываний
+
|-
|-
-
| Recall
+
| 60 || −0,332
-
| <tex>\frac{\text{TP}}{\text{TP} + \text{FN}}</tex>
+
-
| Высокая цена пропуска цели
+
|-
|-
-
| Specificity
+
| 65 || −0,291
-
| <tex>\frac{\text{TN}}{\text{TN} + \text{FP}}</tex>
+
-
| Дополнение к Recall, анализ обеих ошибок
+
|-
|-
-
| F1
+
| 400 (выброс) || 2,441
-
| <tex>2 \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}</tex>
+
-
| Компромисс между Precision и Recall
+
|}
|}
-
== Компромисс Precision/Recall ==
+
По сравнению с min-max масштабированием типичные значения распределены несколько шире (интервал <tex>[-0{,}58;\,-0{,}29]</tex> против <tex>[0;\,0{,}095]</tex>), однако среднее и стандартное отклонение по-прежнему вычисляются с учётом выброса, а значит, остаются им искажены.
-
Precision и Recall связаны обратной зависимостью: увеличение одной метрики часто ведёт к снижению другой. Фундаментальная причина — [[классификационный порог]]: понижая порог, модель относит к положительному классу больше объектов, что увеличивает Recall (находим больше истинно положительных), но одновременно снижает Precision (растёт число ложных срабатываний). Повышение порога даёт обратный эффект.
+
Стандартизация метод по умолчанию для линейных и логистических моделей с регуляризацией, [[Метод опорных векторов|метода опорных векторов]], [[Метод главных компонент|метода главных компонент]] и линейного дискриминантного анализа, а также для большинства архитектур нейронных сетей. В отличие от min-max scaling, результат не ограничен фиксированным диапазоном, что не создаёт проблем при появлении на этапе применения модели значений, выходящих за пределы диапазона обучающей выборки.
-
Рассмотрим задачу детекции мошеннических транзакций. Если банк установит низкий порог и будет блокировать любые подозрительные операции, Recall окажется высоким (почти все мошеннические транзакции заблокированы), но Precision — низким (множество легитимных операций ложно помечены как мошеннические, что вызывает недовольство клиентов). Если же банк повысит порог, Precision возрастёт, но часть мошеннических операций пройдёт незамеченной (Recall снизится). Выбор рабочей точки на кривой Precision-Recall определяется бизнес-ограничениями и относительной стоимостью ошибок FP и FN.
+
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import StandardScaler
-
== ROC-кривая и AUC-ROC ==
+
scaler = StandardSca
 +
ler()
 +
X_scaled = scaler.fit_transform(X)
 +
</syntaxhighlight>
-
'''[[ROC-кривая]]''' (Receiver Operating Characteristic) строится в координатах True Positive Rate (Recall) против False Positive Rate:
+
Стоит отметить, что <tt>StandardScaler</tt> в scikit-learn по умолчанию вычисляет смещённую (population) дисперсию, то есть делит сумму квадратов отклонений на <tex>n</tex>, а не на <tex>n-1</tex>.
-
:: <tex>\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}}, \quad \text{FPR} = \frac{\text{FP}}{\text{TN} + \text{FP}}</tex>
+
== Робастное масштабирование ==
-
Каждая точка кривой соответствует определённому [[классификационный порог|порогу классификации]]. При варьировании порога от 0 до 1 точка (FPR, TPR) перемещается от (1,1) до (0,0). Идеальный классификатор проходит через точку (0,1). Диагональ <tex>\text{TPR} = \text{FPR}</tex> соответствует случайному гаданию.
+
'''Робастное масштабирование''' (robust scaling) использует вместо среднего и стандартного отклонения статистики, устойчивые к выбросам, — [[Медиана|медиану]] и [[Квартиль|межквартильный размах]] (IQR):
-
'''AUC-ROC''' (Area Under the ROC Curve) — площадь под ROC-кривой, принимающая значения от 0 до 1. Значение 0.5 означает бесполезный классификатор, 1.0 — идеальное разделение классов. AUC-ROC обладает вероятностной интерпретацией: это вероятность того, что случайно выбранный положительный объект получит от модели более высокую оценку принадлежности к положительному классу, чем случайно выбранный отрицательный.
+
:: <tex>x' = \frac{x - Q_2}{Q_3 - Q_1}</tex>
-
Достоинство AUC-ROC независимость от порога и априорных вероятностей классов. Недостаток нечувствительность к калибровке вероятностей и маскировка проблем при сильном дисбалансе, когда большая площадь достигается за счёт корректного ранжирования отрицательных примеров, а положительные тонут в массе FP.
+
где <tex>Q_2</tex> медиана (второй квартиль), <tex>Q_1</tex> и <tex>Q_3</tex> первый и третий квартили, а разность <tex>Q_3-Q_1</tex> — межквартильный размах (IQR), охватывающий центральные 50 % наблюдений.
-
== PR-кривая и AUC-PR ==
+
Медиана и квартили — порядковые статистики, устойчивые к экстремальным значениям: смещение одного выброса в область бесконечности практически не меняет положение медианы или границ IQR, поскольку эти величины определяются не самими значениями, а их рангом в отсортированной выборке.
-
'''PR-кривая''' (Precision-Recall curve) строится в координатах Precision против Recall. В отличие от ROC, PR-кривая не учитывает TN, что делает её чувствительной исключительно к качеству предсказаний положительного класса.
+
Завершим сквозной пример с доходом. Для выборки {30, 45, 50, 55, 60, 65, 400}: медиана <tex>Q_2=55</tex>, <tex>Q_1=45</tex>, <tex>Q_3=65</tex>, IQR <tex>=20</tex>. Сведём все три метода в одну таблицу:
-
 
+
-
'''AUC-PR''' — площадь под PR-кривой. В условиях сильного дисбаланса (доля положительного класса < 5%) PR-кривая даёт более информативную картину, чем ROC. Причина в том, что FPR в знаменателе ROC-кривой доминируется огромным количеством TN, из-за чего даже значительный абсолютный рост FP слабо меняет FPR. Precision же непосредственно реагирует на каждый ложноположительный объект.
+
{| class="wikitable"
{| class="wikitable"
-
|+ Сравнение ROC и PR кривых
+
! Исходное значение !! Min-Max !! Z-score !! Robust
|-
|-
-
! Характеристика
+
| 30 || 0,000 || −0,577 || −1,25
-
! ROC
+
-
! PR
+
|-
|-
-
| Оси
+
| 45 || 0,041 || −0,454 || −0,50
-
| TPR vs FPR
+
-
| Precision vs Recall
+
|-
|-
-
| Учёт TN
+
| 50 || 0,054 || −0,414 || −0,25
-
| Да (через FPR)
+
-
| Нет
+
|-
|-
-
| Чувствительность к дисбалансу
+
| 55 || 0,068 || −0,373 || 0,00
-
| Занижена
+
-
| Высокая
+
|-
|-
-
| Рекомендуемое применение
+
| 60 || 0,081 || −0,332 || 0,25
-
| Сбалансированные классы
+
|-
-
| Дисбаланс классов, фокус на положительном классе
+
| 65 || 0,095 || −0,291 || 0,50
 +
|-
 +
| 400 (выброс) || 1,000 || 2,441 || 17,25
|}
|}
-
== Многоклассовые обобщения ==
+
Различие хорошо видно: под min-max и z-score основная масса «нормальных» значений сжата в узкий интервал из-за влияния выброса на <tex>x_{max}</tex>, <tex>\mu</tex> и <tex>\sigma</tex>. Робастное масштабирование, напротив, не изменило относительное расположение типичных значений (интервал <tex>[-1{,}25;\,0{,}5]</tex> пропорционален исходным различиям), а выброс получил большое по модулю, но не искажающее остальные данные значение — 17,25, что само по себе может служить сигналом об аномалии. Ценой этой устойчивости является то, что робастное масштабирование не гарантирует единичной дисперсии преобразованного признака и хуже подходит там, где важна именно эта статистическая интерпретация.
-
Для задач [[многоклассовая классификация|многоклассовой классификации]] метрики Precision, Recall и F1 обобщаются путём усреднения по классам.
+
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import RobustScaler
-
Пусть <tex>C</tex> — множество классов, <tex>P_c, R_c, F1_c</tex> — точность, полнота и F1-мера для класса <tex>c</tex>, вычисленные по схеме «один против всех» (класс <tex>c</tex> считается положительным, остальные — отрицательным), <tex>N_c</tex> — число истинных примеров класса <tex>c</tex>.
+
scaler = RobustScaler(quantile_range=(25.0, 75.0))
 +
X_scaled = scaler.fit_transform(X)
 +
</syntaxhighlight>
-
'''Micro-усреднение''' агрегирует элементы матрицы ошибок по всем классам перед вычислением метрики:
+
== Другие методы ==
-
:: <tex>P_{\text{micro}} = \frac{\sum_{c} \text{TP}_c}{\sum_{c} (\text{TP}_c + \text{FP}_c)}, \quad R_{\text{micro}} = \frac{\sum_{c} \text{TP}_c}{\sum_{c} (\text{TP}_c + \text{FN}_c)}</tex>
+
Помимо трёх базовых подходов, в scikit-learn реализован ряд специализированных преобразований.
-
Micro-усреднение даёт больший вес классам с большим числом примеров. В пределе micro-averaged Accuracy, Precision и Recall численно совпадают.
+
'''MaxAbsScaler''' делит значения признака на максимальный модуль:
-
'''Macro-усреднение''' вычисляет метрику независимо для каждого класса, затем берёт арифметическое среднее:
+
:: <tex>x' = \frac{x}{|x_{max}|}</tex>
-
:: <tex>P_{\text{macro}} = \frac{1}{|C|} \sum_{c} P_c, \quad R_{\text{macro}} = \frac{1}{|C|} \sum_{c} R_c</tex>
+
Результат попадает в диапазон <tex>[-1,1]</tex>. Важное свойство — преобразование не сдвигает данные (не вычитает среднее или минимум), поэтому нулевые значения остаются нулевыми. Это делает MaxAbsScaler предпочтительным для разреженных матриц (например, TF-IDF представлений текста), где сохранение разреженности критично для памяти и скорости вычислений.
-
Macro-усреднение придаёт равный вес всем классам, что делает его чувствительным к качеству классификации миноритарных классов, но и уязвимым к выбросам в классах с малым числом примеров.
+
'''PowerTransformer''' — семейство нелинейных степенных преобразований, приближающих распределение признака к нормальному и стабилизирующих дисперсию. Преобразование Бокса — Кокса (Box-Cox) определено только для строго положительных значений:
-
'''Weighted-усреднение''' берёт средневзвешенное по числу истинных примеров класса:
+
:: <tex>x^{(\lambda)} = \begin{cases} \dfrac{x^{\lambda} - 1}{\lambda}, & \lambda \neq 0 \\[4pt] \ln x, & \lambda = 0 \end{cases}</tex>
-
:: <tex>P_{\text{weighted}} = \frac{\sum_{c} N_c \cdot P_c}{\sum_{c} N_c}, \quad R_{\text{weighted}} = \frac{\sum_{c} N_c \cdot R_c}{\sum_{c} N_c}</tex>
+
Параметр <tex>\lambda</tex> подбирается по данным (обычно методом максимального правдоподобия). Преобразование Йео — Джонсона (Yeo-Johnson) — обобщение, допускающее нулевые и отрицательные значения:
-
Weighted-усреднение занимает промежуточную позицию: учитывает размер классов, но чувствительнее к миноритарным классам, чем micro-усреднение.
+
:: <tex>x^{(\lambda)} = \begin{cases} \dfrac{(x+1)^{\lambda} - 1}{\lambda}, & \lambda \neq 0,\ x \geq 0 \\[4pt] \ln(x+1), & \lambda = 0,\ x \geq 0 \\[4pt] -\dfrac{(-x+1)^{2-\lambda} - 1}{2-\lambda}, & \lambda \neq 2,\ x < 0 \\[4pt] -\ln(-x+1), & \lambda = 2,\ x < 0 \end{cases}</tex>
-
== Метрики для регрессии ==
+
Оба преобразования полезны для сильно асимметричных признаков (доход, число визитов, время
 +
ожидания), особенно для моделей, чувствительных к форме распределения.
-
В задачах [[регрессионный анализ|регрессии]], где целевая переменная непрерывна, используются метрики, основанные на отклонениях предсказаний <tex>\hat{y}_i</tex> от истинных значений <tex>y_i</tex>.
+
'''QuantileTransformer''' строит нелинейное отображение на основе эмпирической функции распределения признака, приводя его к равномерному либо нормальному распределению. Метод наиболее агрессивно устраняет влияние выбросов и асимметрии, поскольку опирается только на ранги наблюдений, но может исказить взаимосвязи между признаками (нелинейное преобразование не сохраняет корреляции) и чувствителен к объёму обучающей выборки.
 +
 
 +
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import MaxAbsScaler, PowerTransformer, QuantileTransformer
 +
 
 +
pt = PowerTransformer(method="yeo-johnson")
 +
X_pt = pt.fit_transform(X)
 +
 
 +
qt = QuantileTransformer(output_distribution="normal")
 +
X_qt = qt.fit_transform(X)
 +
</syntaxhighlight>
 +
 
 +
== Влияние на алгоритмы ==
 +
 
 +
Чувствительность к масштабу признаков существенно различается между семействами алгоритмов.
{| class="wikitable"
{| class="wikitable"
-
|+ Основные метрики регрессии
+
|+ Чувствительность алгоритмов машинного обучения к масштабу признаков
 +
! Алгоритм !! Чувствительность !! Обоснование
 +
|-
 +
| [[Линейная регрессия|Линейная]] / [[Логистическая регрессия|логистическая регрессия]] с регуляризацией || Высокая || [[Регуляризация|Регуляризационный]] штраф зависит от масштаба коэффициентов, который, в свою очередь, зависит от масштаба признаков
 +
|-
 +
| [[Метод опорных векторов|Метод опорных векторов]] (SVM) || Высокая || Построение разделяющей гиперплоскости и ядровые функции опираются на евклидово расстояние между объектами
 +
|-
 +
| [[Метод ближайших соседей|Метод ближайших соседей]] (KNN) || Высокая || Классификация непосредственно основана на расстояниях между объектами в признаковом пространстве
 +
|-
 +
| [[Метод главных компонент|Метод главных компонент]] (PCA) || Высокая || Направления максимальной дисперсии определяются абсолютным масштабом признаков, а не их относительной значимостью
|-
|-
-
! Метрика
+
| Кластеризация методом k-средних || Высокая || Формирование кластеров основано на расстояниях до центроидов
-
! Формула
+
-
! Особенности
+
|-
|-
-
| MSE<br>(Mean Squared Error)
+
| [[Нейронная сеть|Нейронные сети]] (градиентное обучение) || Высокая (влияет на скорость и устойчивость сходимости) || Разномасштабные входы приводят к вытянутому рельефу функции потерь и неравномерным градиентам по слоям
-
| <tex>\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2</tex>
+
-
| Сильно штрафует большие ошибки (квадратичная зависимость). Дифференцируема, используется как функция потерь. Чувствительна к выбросам.
+
|-
|-
-
| RMSE<br>(Root Mean Squared Error)
+
| [[Дерево решений|Деревья решений]] || Низкая || Разбиения строятся по пороговым значениям одного признака независимо от масштаба остальных
-
| <tex>\sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}</tex>
+
-
| Интерпретируется в единицах целевой переменной. Сохраняет чувствительность к выбросам.
+
|-
|-
-
| MAE<br>(Mean Absolute Error)
+
| [[Случайный лес|Случайный лес]] || Низкая || Ансамбль деревьев решений, наследует их инвариантность к монотонным преобразованиям признаков
-
| <tex>\frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|</tex>
+
-
| Менее чувствительна к выбросам, чем MSE. Даёт линейный штраф. Не дифференцируема в нуле.
+
|-
|-
-
| MAPE<br>(Mean Absolute Percentage Error)
+
| [[Градиентный бустинг|Градиентный бустинг]] (XGBoost, LightGBM, CatBoost) || Низкая || Также опирается на пороговые разбиения по отдельным признакам
-
| <tex>\frac{100\%}{n} \sum_{i=1}^{n} \left| \frac{y_i - \hat{y}_i}{y_i} \right|</tex>
+
-
| Выражается в процентах, интуитивно понятна бизнес-пользователям. Неприменима при <tex>y_i = 0</tex>. Асимметрична: штраф за занижение и завышение различен.
+
|-
|-
-
| <tex>R^2</tex><br>(Коэффициент детерминации)
+
| Наивный байесовский классификатор || Низкая / умеренная || Оценивает распределение каждого признака отдельно; масштаб не влияет на итоговую разделяющую способность
-
| <tex>1 - \frac{\sum_i (y_i - \hat{y}_i)^2}{\sum_i (y_i - \bar{y})^2}</tex>
+
-
| Показывает долю дисперсии целевой переменной, объяснённой моделью. Значение 1 — идеальное предсказание, 0 — модель не лучше константы (среднего). Может быть отрицательным.
+
|}
|}
-
Выбор метрики в регрессии диктуется распределением ошибок и бизнес-требованиями. При наличии выбросов предпочтительнее MAE; если большие ошибки критичны — MSE или RMSE. <tex>R^2</tex> удобен для сравнительного анализа моделей на одном наборе данных, но не отражает абсолютную величину ошибки.
+
Общая закономерность: методы, основанные на пороговых разбиениях одного признака (деревья и их ансамбли), инвариантны к любому монотонному преобразованию масштаба, тогда как методы, использующие расстояния, скалярные произведения или градиентную оптимизацию, чувствительны к нему напрямую.
-
== Метрики для ранжирования ==
+
== Влияние на регуляризацию ==
-
В задачах [[обучение ранжированию|ранжирования]] оценивается качество упорядочивания объектов согласно их релевантности запросу.
+
[[Регуляризация|L1- и L2-регуляризация]] штрафуют величину коэффициентов модели. Для линейной регрессии с L2-штрафом (гребневая регрессия) функционал имеет вид:
-
'''MRR''' (Mean Reciprocal Rank) — среднее обратное значение позиции первого релевантного документа:
+
:: <tex>L(\beta) = \sum_{i=1}^{n}\left(y_i - \beta_0 - \sum_{j=1}^{p}\beta_j x_{ij}\right)^2 + \lambda \sum_{j=1}^{p}\beta_j^2</tex>
-
:: <tex>\text{MRR} = \frac{1}{|Q|} \sum_{q \in Q} \frac{1}{\text{rank}_q}</tex>
+
а для L1-регуляризации (лассо) — соответственно с штрафом <tex>\lambda\sum_{j}|\beta_j|</tex>. В обоих случаях величина штрафа зависит исключительно от численного значения коэффициента <tex>\beta_j</tex>, а не от того, насколько признак <tex>x_j</tex> в действительности значим для предсказания.
-
где <tex>\text{rank}_q</tex> — позиция первого релевантного документа для запроса <tex>q</tex>. Метрика проста и интерпретируема, но учитывает только первый релевантный результат.
+
Проблема в том, что масштаб коэффициента обратно пропорционален масштабу признака: если признак измерен в рублях с диапазоном значений порядка <tex>10^5</tex>–<tex>10^6</tex>, соответствующий ему коэффициент естественным образом окажется очень малым (порядка <tex>10^{-5}</tex>–<
 +
tex>10^{-6}</tex>) просто для того, чтобы вклад <tex>\beta_j x_j</tex> в предсказание оставался разумной величины. Признак же, измеренный в единицах (например, число визитов в месяц), потребует коэффициента на несколько порядков больше. Регуляризация в этом случае штрафует признаки неравномерно — не пропорционально их реальной значимости, а обратно пропорционально их естественному масштабу: крупномасштабные признаки получают заниженный (и потому слабо штрафуемый) коэффициент, тогда как мелкомасштабные — завышенный и, соответственно, сильнее подавляемый. Особенно чувствительно к этому L1-регуляризация: поскольку она способна обнулять коэффициенты полностью, отбор признаков при несогласованных масштабах оказывается смещённым в пользу признаков с большим численным диапазоном, а не в пользу признаков с наибольшей предсказательной силой.
-
'''MAP''' (Mean Average Precision) — среднее по запросам значение средней точности:
+
Именно поэтому стандартизация признаков перед обучением регуляризованных линейных моделей считается стандартной практикой: приведение всех признаков к единичной дисперсии уравнивает условия, при которых регуляризационный штраф применяется к каждому из них, и делает итоговые коэффициенты сопоставимыми как меры относительной значимости признаков.
-
:: <tex>\text{MAP} = \frac{1}{|Q|} \sum_{q \in Q} \frac{1}{R_q} \sum_{k=1}^{n_q} P_q(k) \cdot [\text{rel}_q(k) = 1]</tex>
+
== Сравнение методов ==
-
где <tex>P_q(k)</tex> — Precision на глубине <tex>k</tex>, <tex>\text{rel}_q(k)</tex> — индикатор релевантности документа на позиции <tex>k</tex>. MAP учитывает все релевантные документы и их позиции.
+
{| class="wikitable"
 +
! Метод !! Формула !! Диапазон результата !! Устойчивость к выбросам !! Основные плюсы !! Основные минусы
 +
|-
 +
| Min-Max || <tex>x'=\frac{x-x_{min}}{x_{max}-x_{min}}</tex> || <tex>[0,1]</tex> (настраиваемый) || Низкая || Фиксированный, интерпретируемый диапазон; сохраняет форму распределения || Сильно искажается единичными выбросами; новые данные вне обучающего диапазона выходят за границы
 +
|-
 +
| Z-score || <tex>x'=\frac{x-\mu}{\sigma}</tex> || Теоретически не ограничен (практически [-3,3]) || Умеренная || Стандарт для линейных моделей, SVM, PCA, нейросетей; интерпретация в единицах стандартного отклонения || Среднее и дисперсия чувствительны к выбросам
 +
|-
 +
| Robust || <tex>x'=\frac{x-Q_2}{Q_3-Q_1}</tex> || Не ограничен || Высокая || Устойчив к выбросам и асимметрии распределения || Не даёт единичной дисперсии; менее привычная интерпретация
 +
|-
 +
| MaxAbs || <tex>x'=\frac{x}{|x_{max}|}</tex> || <tex>[-1,1]</tex> || Низкая || Сохраняет разреженность данных (нули остаются нулями) || Чувствителен к выбросам, как и Min-Max
 +
|-
 +
| PowerTransformer || нелинейное степенное преобразование || Приближается к нормальному распределению || Умеренная || Снижает асимметрию, стабилизирует дисперсию || Box-Cox требует строго положительных значений; интерпретация затруднена
 +
|-
 +
| QuantileTransformer || преобразование по эмпирической функции распределения || <tex>[0,1]</tex> либо нормальное || Высокая || Полностью устраняет влияние выбросов и асимметрии || Нелинейно; может исказить взаимосвязи между признаками, риск переобучения на малых выборках
 +
|}
-
'''NDCG''' (Normalized Discounted Cumulative Gain) — нормализованный накопленный выигрыш с дисконтированием:
+
== Пример: подготовка данных для логистической регрессии в задаче прогнозирования оттока клиентов ==
-
:: <tex>\text{DCG}_q@k = \sum_{i=1}^{k} \frac{2^{\text{rel}_i} - 1}{\log_2(i + 1)}</tex>
+
Рассмотрим упрощённый набор данных телекоммуникационной компании для задачи прогнозирования оттока (churn) с двумя признаками — стажем обслуживания (в месяцах) и ежемесячным платежом (в рублях):
-
:: <tex>\text{NDCG}_q@k = \frac{\text{DCG}_q@k}{\text{IDCG}_q@k}</tex>
+
{| class="wikitable"
 +
! Клиент !! Стаж, мес. !! Платёж, руб./мес. !! Отток
 +
|-
 +
| 1 || 2 || 3 500 || 1
 +
|-
 +
| 2 || 34 || 1 200 || 0
 +
|-
 +
| 3 || 58 || 4 200 || 0
 +
|-
 +
| 4 || 4 || 900 || 1
 +
|-
 +
| 5 || 45 || 5 600 || 0
 +
|}
-
где <tex>\text{rel}_i</tex> — оценка релевантности (возможно, многозначная), IDCG DCG идеального ранжирования. NDCG учитывает как многоградационную релевантность, так и позицию документа, придавая больший вес верхним позициям списка.
+
Стаж имеет среднее <tex>\mu \approx 28{,}6</tex> и стандартное отклонение <tex>\sigma \approx 22{,}25</tex>; платёж среднее <tex>\mu \approx 3080</tex> и стандартное отклонение <tex>\sigma \approx 1792{,}65</tex>. После стандартизации по формуле <tex>x' = (x-\mu)/\sigma</tex>:
-
== Выбор метрики под задачу ==
+
{| class="wikitable"
 +
! Клиент !! Стаж (станд.) !! Платёж (станд.) !! Отток
 +
|-
 +
| 1 || −1,196 || 0,234 || 1
 +
|-
 +
| 2 || 0,243 || −1,049 || 0
 +
|-
 +
| 3 || 1,321 || 0,625 || 0
 +
|-
 +
| 4 || −1,106 || −1,216 || 1
 +
|-
 +
| 5 || 0,737 || 1,406 || 0
 +
|}
-
Выбор метрики определяется следующими факторами:
+
До масштабирования диапазон платежа (900–5600) на два порядка превышает диапазон стажа (2–58). При обучении [[Логистическая регрессия|логистической регрессии]] градиентными методами это означа
 +
ет, что частная производная функции потерь по коэффициенту при платеже на несколько порядков отличается по величине от производной по коэффициенту при стаже, и без индивидуальной настройки шага обучения для каждого признака сходимость существенно замедляется. Кроме того, при использовании L2- или L1-регуляризации коэффициент при платеже, обученный на исходных данных, будет иметь порядок <tex>10^{-4}</tex>, а коэффициент при стаже — порядок <tex>10^{-2}</tex>–<tex>10^{-1}</tex>; сравнение таких коэффициентов напрямую ничего не говорит об относительной значимости признаков. После стандартизации оба признака приведены к общему масштабу (нулевое среднее, единичная дисперсия), их вклад в предсказание и в регуляризационный штраф сопоставим, а абсолютные значения обученных коэффициентов допустимо интерпретировать как меру относительной важности признака при фиксированной силе регуляризации.
-
# '''Тип задачи.''' Классификация, регрессия или ранжирование задают семейство метрик.
+
<syntaxhighlight lang="python">
-
# '''Сбалансированность классов.''' При дисбалансе избегают Accuracy, предпочитая F1, AUC-PR или macro-F1.
+
from sklearn.preprocessing import StandardScaler
-
# '''Цена ошибок.''' При асимметричной стоимости ошибок ориентируются на Recall (высокая цена FN) или Precision (высокая цена FP).
+
from sklearn.linear_model import LogisticRegression
-
# '''Требования к интерпретируемости.''' Для коммуникации с заказчиком часто выбирают метрики в абсолютных величинах (RMSE в рублях, Recall в процентах обнаруженных дефектов).
+
from sklearn.pipeline import Pipeline
-
# '''Наличие нескольких классов.''' Выбирают micro- (важна общая эффективность) или macro-усреднение (важен каждый класс).
+
-
Рекомендуется использовать не единственную метрику, а батарею взаимодополняющих показателей для всесторонней оценки модели.
+
pipeline = Pipeline([
 +
("scaler", StandardScaler()),
 +
("model", LogisticRegression(penalty="l2", C=1.0))
 +
])
 +
pipeline.fit(X_train, y_train)
 +
</syntaxhighlight>
-
== Пример: медицинская диагностика редкого заболевания ==
+
Существен методический момент: параметры масштабирования (<tex>\mu</tex>, <tex>\sigma</tex>, <tex>x_{min}</tex>, <tex>x_{max}</tex>, <tex>Q_1</tex>, <tex>Q_2</tex>, <tex>Q_3</tex>) должны вычисляться исключительно на обучающей выборке методом <tt>fit</tt> и затем применяться к валидационной и тестовой выборкам методом <tt>transform</tt>, без повторного вычисления статистик на них. Нарушение этого правила приводит к утечке информации из тестовой выборки в процесс обучения (data leakage) и завышенной оценке качества модели.
-
Рассмотрим задачу скрининга заболевания с распространённостью 0.1% (один случай на тысячу пациентов). Разрабатывается классификатор, предсказывающий наличие болезни по лабораторным показателям.
+
== Практические рекомендации ==
-
'''Характеристики задачи:'''
+
* Для '''линейных и логистических моделей с регуляризацией''' — стандартизация (z-score); при наличии выраженных выбросов — робастное масштабирование.
-
* Сильный дисбаланс классов (1:999).
+
* Для '''метода опорных векторов, метода ближайших соседей, k-средних и метода главных компонент''' — стандартизация практически обязательна, поскольку эти методы напрямую оперируют расстояниями или дисперсией.
-
* Критически высокая цена ложноотрицательного результата: пропуск заболевания может привести к летальному исходу.
+
* Для '''деревьев решений, случайного леса и градиентного бустинга''' — масштабирование, как правило, не требуется, поскольку эти алгоритмы инвариантны к монотонным преобразованиям отдельных признаков.
-
* Ложноположительный результат также нежелателен (назначается ненужное дорогостоящее обследование), но его цена ниже.
+
* Для '''нейронных сетей''' — стандартизация или min-max scaling к диапазону <tex>[0,1]</tex> либо <tex>[-1,1]</tex>, в зависимости от функций активации; для сверточных сетей, работающих с изображениями, min-max к <tex>[0,1]</tex> — стандартная практика.
-
 
+
* При '''наличии выбросов''', которые не являются ошибками измерения и должны быть сохранены в выборке, — робастное масштабирование или QuantileTransformer вместо min-max и z-score.
-
'''Анализ метрик:'''
+
* Для '''разреженных данных''' (например, TF-IDF, one-hot представления с большим числом признаков) — MaxAbsScaler, не разрушающий разреженность, в отличие от методов, включающих центрирование.
-
 
+
* При '''сильной асимметрии распределения''' признака (доход, время ожидания, количество событий) — PowerTransformer перед стандартизацией.
-
* '''Accuracy''' неприемлема. Модель, всегда предсказывающая «здоров», имеет Accuracy = 0.999, но не обнаруживает ни одного больного.
+
* Параметры масштабирования всегда вычисляются на обучающей выборке и фиксируются для последующего применения к новым данным; включение шага масштабирования в единый [[Конвейер обработки данных|конвейер]] (<tt>sklearn.pipeline.Pipeline</tt>) снижает риск утечки данных при кросс-валидации.
-
* '''Precision''' важна для оценки нагрузки на систему здравоохранения: низкая точность означает, что большинство направленных на доп. обследование окажутся здоровы.
+
-
* '''Recall''' — ключевая метрика. Необходимо максимизировать долю обнаруженных больных, возможно, ценой снижения Precision.
+
-
* '''F1''' или '''F2-мера''' (с <tex>\beta = 2</tex>) дают сбалансированную оценку с повышенным приоритетом полноты.
+
-
* '''ROC-AUC''' может дать завышенно оптимистичную картину из-за доминирования TN. Предпочтительнее использовать '''AUC-PR''', которая непосредственно оценивает способность модели находить редкий положительный класс.
+
-
 
+
-
Рекомендуемый набор метрик для данной задачи: Recall (основная), Precision (контролируемая), AUC-PR (интегральная оценка ранжирования), F2-мера (агрегированная).
+
== См. также ==
== См. также ==
-
* [[Матрица ошибок]]
+
* [[Ослабление и усиление шкал признаков]]
-
* [[Точность и полнота]]
+
* [[Предобработка данных]]
-
* [[F-мера]]
+
* [[Регуляризация]]
-
* [[Классификационный порог]]
+
* [[Логистическая регрессия]]
-
* [[Дисбаланс классов]]
+
* [[Метод главных компонент]]
-
* [[ROC-кривая]]
+
== Литература ==
== Литература ==
-
# Powers D. M. W. Evaluation: From Precision, Recall and F-Measure to ROC, Informedness, Markedness & Correlation // Journal of Machine Learning Technologies. — 2011. — Vol. 2, no. 1. — P. 37–63.
+
* Hastie T., Tibshirani R., Friedman J. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. — 2nd ed. — Springer, 2009.
-
# Davis J., Goadrich M. The Relationship Between Precision-Recall and ROC Curves // Proceedings of the 23rd International Conference on Machine Learning (ICML). — 2006. — P. 233–240.
+
* Bishop C. M. Pattern Recognition and Machine Learning. — Springer, 2006.
-
# Fawcett T. An Introduction to ROC Analysis // Pattern Recognition Letters. — 2006. — Vol. 27, no. 8. — P. 861–874.
+
* Géron A. Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. — 3rd ed. — O'Reilly, 2022.
-
# Saito T., Rehmsmeier M. The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets // PLOS ONE. — 2015. — Vol. 10, no. 3. — e0118432.
+
* Zheng A., Casari A. Feature Engineering for Machine Learning.
-
# Järvelin K., Kekäläinen J. Cumulated Gain-Based Evaluation of IR Techniques // ACM Transactions on Information Systems. — 2002. — Vol. 20, no. 4. — P. 422–446.
+
Microsoft Azure Web App - Error 404
-
# Груздев А. В. Прогнозное моделирование в IBM SPSS Statistics, R и Python. Метод деревьев решений и случайный лес. — М.: ДМК Пресс, 2018. — Гл. 4: Оценка качества моделей.
+
pipeline.fit
 +
O'Reilly, 2018.
 +
* Box G. E. P., Cox D. R. An Analysis of Transformations // Journal of the Royal Statistical Society, Series B. — 1964. — Vol. 26, No. 2.
 +
* Yeo I.-K., Johnson R. A. A New Family of Power Transformations to Improve Normality or Symmetry // Biometrika. — 2000. — Vol. 87, No. 4.
 +
* Ioffe S., Szegedy C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift // Proceedings of the 32nd International Conference on Machine Learning (ICML). — 2015.
 +
* Scikit-learn developers. Preprocessing data // Scikit-learn User Guide. — [https://scikit-learn.org/stable/modules/preprocessing.html scikit-learn.org/stable/modules/preprocessing.html]
 +
 
 +
[[Категория:Машинное обучение]]
 +
[[Категория:Предобработка данных]]
 +
```

Текущая версия

```

Статья написана с использованием LLM Claude Sonnet 5 и проверена участником Imil Baltaniazov 15:56, 10 июля 2026 (MSD)


Нормализация признаков и стандартизация признаков (обобщённо — масштабирование признаков, англ. feature scaling) — методы предварительной обработки данных, приводящие числовые признаки к сопоставимому диапазону значений или к сопоставимой статистической форме распределения. Масштабирование не меняет информативность признака в статистическом смысле (взаимную связь с целевой переменной), но существенно влияет на поведение многих алгоритмов машинного обучения — от скорости сходимости градиентных методов до корректности работы регуляризации и методов, основанных на расстояниях между объектами.

В литературе термины употребляются не вполне единообразно. В узком смысле нормализацией называют приведение признака к фиксированному диапазону, чаще всего [0,1] (min-max scaling), а стандартизацией — приведение к нулевому среднему и единичной дисперсии (z-score). В широком смысле оба термина нередко используются как синонимы для обозначения любого масштабирования признаков; в данной статье эти понятия разграничиваются в узком, более строгом смысле. Наряду с ними рассматривается робастное масштабирование и ряд специализированных преобразований (MaxAbsScaler, PowerTransformer, QuantileTransformer), реализованных, в частности, в модуле sklearn.preprocessing библиотеки scikit-learn.

Содержание

Постановка задачи

Признаки, описывающие объекты реального мира, как правило, измерены в разных единицах и имеют разные диапазоны значений. Рассмотрим задачу классификации клиентов банка, где каждый объект описывается двумя признаками — возрастом (в годах) и месячным доходом (в рублях):

Клиент Возраст, лет Доход, руб./мес.
Иванов 25 45 000
Петров 45 47 000

Возраст изменяется в диапазоне единиц-десятков, доход — в диапазоне десятков тысяч. Если вычислить евклидово расстояние между объектами без предварительного масштабирования:

d = \sqrt{(45-25)^2 + (47000-45000)^2} = \sqrt{400 + 4\,000\,000} \approx 2000{,}1

признак «возраст» практически не вносит вклада в итоговое расстояние: его слагаемое (400) на четыре порядка меньше слагаемого дохода (4 000 000). Для любого метода, опирающегося на расстояния между объектами — метода ближайших соседей, метода опорных векторов, кластеризации методом k-средних, метода главных компонент — это означает, что признак с большим численным диапазоном будет доминировать в решении независимо от его действительной значимости для задачи.

Аналогичная проблема возникает при обучении моделей градиентными методами. Функция потерь как функция параметров модели образует в пространстве весов некоторую поверхность; при сильно различающихся масштабах признаков линии уровня этой поверхности превращаются в вытянутые эллипсы с большим числом обусловленности гессиана. Градиентный спуск на такой поверхности движется зигзагообразно, и для достижения минимума требуется существенно больше итераций либо очень малый шаг обучения. После масштабирования признаков линии уровня приближаются по форме к окружностям, направление антиградиента указывает более точно на минимум, и сходимость ускоряется — этот эффект хорошо задокументирован для линейной и логистической регрессии, а также для нейронных сетей.

Нормализация (min-max scaling)

Min-max scaling линейно преобразует признак так, чтобы его значения попали в заданный диапазон, чаще всего [0,1]:

x' = \frac{x - x_{min}}{x_{max} - x_{min}}

где x_{min} и x_{max} — минимальное и максимальное значен ия признака на обучающей выборке. Для произвольного целевого диапазона [a,b] формула обобщается:

x' = a + \frac{(x - x_{min})(b-a)}{x_{max} - x_{min}}

Метод сохраняет форму исходного распределения (все относительные расстояния между значениями пропорционально сжимаются или растягиваются), что удобно, когда диапазон признака имеет содержательный смысл — например, для признаков, ограниченных по своей природе (доля, вероятность, пиксельная интенсивность 0–255), а также при подготовке входов для нейронных сетей с сигмоидными или иными ограниченными функциями активации.

Существенный недостаток — высокая чувствительность к выбросам, поскольку x_{min} и x_{max} определяются единственными экстремальными наблюдениями. Продемонстрируем это на выборке значений дохода (тыс. руб.): 30, 45, 50, 55, 60, 65, 400, где последнее значение — аномально высокий доход.

Здесь x_{min}=30, x_{max}=400, диапазон равен 370. После min-max масштабирования:

Исходное значение После Min-Max
30 0,000
45 0,041
50 0,054
55 0,068
60 0,081
65 0,095
400 (выброс) 1,000

Единственный выброс растянул диапазон настолько, что все «типичные» значения оказались сжаты в узкий интервал [0;\,0{,}095] и стали практически неразличимы для алгоритма. Это ключевое ограничение метода: перед его применением рекомендуется отдельно проверить данные на наличие выбросов (см. выбросы).

В scikit-learn метод реализован классом MinMaxScaler:

<syntaxhighlight lang="python"> from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1)) X_scaled = scaler.fit_transform(X) </syntaxhighlight>

Стандартизация (z-score)

Стандартизация (z-score normalization) центрирует признак относительно среднего и масштабирует его по стандартному отклонению:

x' = \frac{x - \mu}{\sigma}

где

\mu = \frac{1}{n}\sum_{i=1}^{n} x_i, \qquad \sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2}

После преобразования признак имеет нулевое среднее и единичную дисперсию: \mathbb{E}[x']=0, \mathrm{Var}[x']=1. Величина x' показывает, на сколько стандартных отклонений исходное значение отстоит от среднего, что делает интерпретацию наглядной при приближённо нормальном распределении признака: согласно правилу «трёх сигм» около 68 % значений попадают в интервал [-1,1], около 95 % — в [-2,2]. При этом сама по себе стандартизация не делает распределение нормальным — она лишь центрирует и масштабирует его, сохраняя исходную форму (асимметрию, эксцесс).

Продолжим пример с доходом. Для выборки {30, 45, 50, 55, 60, 65, 400} среднее \mu \approx 100{,}71, стандартное отклонение \sigma \approx 122{,}63. После стандартизации:

Исходное значение После Z-score
30 −0,577
45 −0,454
50 −0,414
55 −0,373
60 −0,332
65 −0,291
400 (выброс) 2,441

По сравнению с min-max масштабированием типичные значения распределены несколько шире (интервал [-0{,}58;\,-0{,}29] против [0;\,0{,}095]), однако среднее и стандартное отклонение по-прежнему вычисляются с учётом выброса, а значит, остаются им искажены.

Стандартизация — метод по умолчанию для линейных и логистических моделей с регуляризацией, метода опорных векторов, метода главных компонент и линейного дискриминантного анализа, а также для большинства архитектур нейронных сетей. В отличие от min-max scaling, результат не ограничен фиксированным диапазоном, что не создаёт проблем при появлении на этапе применения модели значений, выходящих за пределы диапазона обучающей выборки.

<syntaxhighlight lang="python"> from sklearn.preprocessing import StandardScaler

scaler = StandardSca ler() X_scaled = scaler.fit_transform(X) </syntaxhighlight>

Стоит отметить, что StandardScaler в scikit-learn по умолчанию вычисляет смещённую (population) дисперсию, то есть делит сумму квадратов отклонений на n, а не на n-1.

Робастное масштабирование

Робастное масштабирование (robust scaling) использует вместо среднего и стандартного отклонения статистики, устойчивые к выбросам, — медиану и межквартильный размах (IQR):

x' = \frac{x - Q_2}{Q_3 - Q_1}

где Q_2 — медиана (второй квартиль), Q_1 и Q_3 — первый и третий квартили, а разность Q_3-Q_1 — межквартильный размах (IQR), охватывающий центральные 50 % наблюдений.

Медиана и квартили — порядковые статистики, устойчивые к экстремальным значениям: смещение одного выброса в область бесконечности практически не меняет положение медианы или границ IQR, поскольку эти величины определяются не самими значениями, а их рангом в отсортированной выборке.

Завершим сквозной пример с доходом. Для выборки {30, 45, 50, 55, 60, 65, 400}: медиана Q_2=55, Q_1=45, Q_3=65, IQR =20. Сведём все три метода в одну таблицу:

Исходное значение Min-Max Z-score Robust
30 0,000 −0,577 −1,25
45 0,041 −0,454 −0,50
50 0,054 −0,414 −0,25
55 0,068 −0,373 0,00
60 0,081 −0,332 0,25
65 0,095 −0,291 0,50
400 (выброс) 1,000 2,441 17,25

Различие хорошо видно: под min-max и z-score основная масса «нормальных» значений сжата в узкий интервал из-за влияния выброса на x_{max}, \mu и \sigma. Робастное масштабирование, напротив, не изменило относительное расположение типичных значений (интервал [-1{,}25;\,0{,}5] пропорционален исходным различиям), а выброс получил большое по модулю, но не искажающее остальные данные значение — 17,25, что само по себе может служить сигналом об аномалии. Ценой этой устойчивости является то, что робастное масштабирование не гарантирует единичной дисперсии преобразованного признака и хуже подходит там, где важна именно эта статистическая интерпретация.

<syntaxhighlight lang="python"> from sklearn.preprocessing import RobustScaler

scaler = RobustScaler(quantile_range=(25.0, 75.0)) X_scaled = scaler.fit_transform(X) </syntaxhighlight>

Другие методы

Помимо трёх базовых подходов, в scikit-learn реализован ряд специализированных преобразований.

MaxAbsScaler делит значения признака на максимальный модуль:

x' = \frac{x}{|x_{max}|}

Результат попадает в диапазон [-1,1]. Важное свойство — преобразование не сдвигает данные (не вычитает среднее или минимум), поэтому нулевые значения остаются нулевыми. Это делает MaxAbsScaler предпочтительным для разреженных матриц (например, TF-IDF представлений текста), где сохранение разреженности критично для памяти и скорости вычислений.

PowerTransformer — семейство нелинейных степенных преобразований, приближающих распределение признака к нормальному и стабилизирующих дисперсию. Преобразование Бокса — Кокса (Box-Cox) определено только для строго положительных значений:

x^{(\lambda)} = \begin{cases} \dfrac{x^{\lambda} - 1}{\lambda}, & \lambda \neq 0 \\[4pt] \ln x, & \lambda = 0 \end{cases}

Параметр \lambda подбирается по данным (обычно методом максимального правдоподобия). Преобразование Йео — Джонсона (Yeo-Johnson) — обобщение, допускающее нулевые и отрицательные значения:

x^{(\lambda)} = \begin{cases} \dfrac{(x+1)^{\lambda} - 1}{\lambda}, & \lambda \neq 0,\ x \geq 0 \\[4pt] \ln(x+1), & \lambda = 0,\ x \geq 0 \\[4pt] -\dfrac{(-x+1)^{2-\lambda} - 1}{2-\lambda}, & \lambda \neq 2,\ x < 0 \\[4pt] -\ln(-x+1), & \lambda = 2,\ x < 0 \end{cases}

Оба преобразования полезны для сильно асимметричных признаков (доход, число визитов, время ожидания), особенно для моделей, чувствительных к форме распределения.

QuantileTransformer строит нелинейное отображение на основе эмпирической функции распределения признака, приводя его к равномерному либо нормальному распределению. Метод наиболее агрессивно устраняет влияние выбросов и асимметрии, поскольку опирается только на ранги наблюдений, но может исказить взаимосвязи между признаками (нелинейное преобразование не сохраняет корреляции) и чувствителен к объёму обучающей выборки.

<syntaxhighlight lang="python"> from sklearn.preprocessing import MaxAbsScaler, PowerTransformer, QuantileTransformer

pt = PowerTransformer(method="yeo-johnson") X_pt = pt.fit_transform(X)

qt = QuantileTransformer(output_distribution="normal") X_qt = qt.fit_transform(X) </syntaxhighlight>

Влияние на алгоритмы

Чувствительность к масштабу признаков существенно различается между семействами алгоритмов.

Чувствительность алгоритмов машинного обучения к масштабу признаков
Алгоритм Чувствительность Обоснование
Линейная / логистическая регрессия с регуляризацией Высокая Регуляризационный штраф зависит от масштаба коэффициентов, который, в свою очередь, зависит от масштаба признаков
Метод опорных векторов (SVM) Высокая Построение разделяющей гиперплоскости и ядровые функции опираются на евклидово расстояние между объектами
Метод ближайших соседей (KNN) Высокая Классификация непосредственно основана на расстояниях между объектами в признаковом пространстве
Метод главных компонент (PCA) Высокая Направления максимальной дисперсии определяются абсолютным масштабом признаков, а не их относительной значимостью
Кластеризация методом k-средних Высокая Формирование кластеров основано на расстояниях до центроидов
Нейронные сети (градиентное обучение) Высокая (влияет на скорость и устойчивость сходимости) Разномасштабные входы приводят к вытянутому рельефу функции потерь и неравномерным градиентам по слоям
Деревья решений Низкая Разбиения строятся по пороговым значениям одного признака независимо от масштаба остальных
Случайный лес Низкая Ансамбль деревьев решений, наследует их инвариантность к монотонным преобразованиям признаков
Градиентный бустинг (XGBoost, LightGBM, CatBoost) Низкая Также опирается на пороговые разбиения по отдельным признакам
Наивный байесовский классификатор Низкая / умеренная Оценивает распределение каждого признака отдельно; масштаб не влияет на итоговую разделяющую способность

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

Влияние на регуляризацию

L1- и L2-регуляризация штрафуют величину коэффициентов модели. Для линейной регрессии с L2-штрафом (гребневая регрессия) функционал имеет вид:

L(\beta) = \sum_{i=1}^{n}\left(y_i - \beta_0 - \sum_{j=1}^{p}\beta_j x_{ij}\right)^2 + \lambda \sum_{j=1}^{p}\beta_j^2

а для L1-регуляризации (лассо) — соответственно с штрафом \lambda\sum_{j}|\beta_j|. В обоих случаях величина штрафа зависит исключительно от численного значения коэффициента \beta_j, а не от того, насколько признак x_j в действительности значим для предсказания.

Проблема в том, что масштаб коэффициента обратно пропорционален масштабу признака: если признак измерен в рублях с диапазоном значений порядка 10^510^6, соответствующий ему коэффициент естественным образом окажется очень малым (порядка 10^{-5}–< tex>10^{-6}</tex>) просто для того, чтобы вклад \beta_j x_j в предсказание оставался разумной величины. Признак же, измеренный в единицах (например, число визитов в месяц), потребует коэффициента на несколько порядков больше. Регуляризация в этом случае штрафует признаки неравномерно — не пропорционально их реальной значимости, а обратно пропорционально их естественному масштабу: крупномасштабные признаки получают заниженный (и потому слабо штрафуемый) коэффициент, тогда как мелкомасштабные — завышенный и, соответственно, сильнее подавляемый. Особенно чувствительно к этому L1-регуляризация: поскольку она способна обнулять коэффициенты полностью, отбор признаков при несогласованных масштабах оказывается смещённым в пользу признаков с большим численным диапазоном, а не в пользу признаков с наибольшей предсказательной силой.

Именно поэтому стандартизация признаков перед обучением регуляризованных линейных моделей считается стандартной практикой: приведение всех признаков к единичной дисперсии уравнивает условия, при которых регуляризационный штраф применяется к каждому из них, и делает итоговые коэффициенты сопоставимыми как меры относительной значимости признаков.

Сравнение методов

Метод Формула Диапазон результата Устойчивость к выбросам Основные плюсы Основные минусы
Min-Max x'=\frac{x-x_{min}}{x_{max}-x_{min}} [0,1] (настраиваемый) Низкая Фиксированный, интерпретируемый диапазон; сохраняет форму распределения Сильно искажается единичными выбросами; новые данные вне обучающего диапазона выходят за границы
Z-score x'=\frac{x-\mu}{\sigma} Теоретически не ограничен (практически [-3,3]) Умеренная Стандарт для линейных моделей, SVM, PCA, нейросетей; интерпретация в единицах стандартного отклонения Среднее и дисперсия чувствительны к выбросам
Robust x'=\frac{x-Q_2}{Q_3-Q_1} Не ограничен Высокая Устойчив к выбросам и асимметрии распределения Не даёт единичной дисперсии; менее привычная интерпретация
MaxAbs x'=\frac{x}{|x_{max}|} [-1,1] Низкая Сохраняет разреженность данных (нули остаются нулями) Чувствителен к выбросам, как и Min-Max
PowerTransformer нелинейное степенное преобразование Приближается к нормальному распределению Умеренная Снижает асимметрию, стабилизирует дисперсию Box-Cox требует строго положительных значений; интерпретация затруднена
QuantileTransformer преобразование по эмпирической функции распределения [0,1] либо нормальное Высокая Полностью устраняет влияние выбросов и асимметрии Нелинейно; может исказить взаимосвязи между признаками, риск переобучения на малых выборках

Пример: подготовка данных для логистической регрессии в задаче прогнозирования оттока клиентов

Рассмотрим упрощённый набор данных телекоммуникационной компании для задачи прогнозирования оттока (churn) с двумя признаками — стажем обслуживания (в месяцах) и ежемесячным платежом (в рублях):

Клиент Стаж, мес. Платёж, руб./мес. Отток
1 2 3 500 1
2 34 1 200 0
3 58 4 200 0
4 4 900 1
5 45 5 600 0

Стаж имеет среднее \mu \approx 28{,}6 и стандартное отклонение \sigma \approx 22{,}25; платёж — среднее \mu \approx 3080 и стандартное отклонение \sigma \approx 1792{,}65. После стандартизации по формуле x' = (x-\mu)/\sigma:

Клиент Стаж (станд.) Платёж (станд.) Отток
1 −1,196 0,234 1
2 0,243 −1,049 0
3 1,321 0,625 0
4 −1,106 −1,216 1
5 0,737 1,406 0

До масштабирования диапазон платежа (900–5600) на два порядка превышает диапазон стажа (2–58). При обучении логистической регрессии градиентными методами это означа ет, что частная производная функции потерь по коэффициенту при платеже на несколько порядков отличается по величине от производной по коэффициенту при стаже, и без индивидуальной настройки шага обучения для каждого признака сходимость существенно замедляется. Кроме того, при использовании L2- или L1-регуляризации коэффициент при платеже, обученный на исходных данных, будет иметь порядок 10^{-4}, а коэффициент при стаже — порядок 10^{-2}10^{-1}; сравнение таких коэффициентов напрямую ничего не говорит об относительной значимости признаков. После стандартизации оба признака приведены к общему масштабу (нулевое среднее, единичная дисперсия), их вклад в предсказание и в регуляризационный штраф сопоставим, а абсолютные значения обученных коэффициентов допустимо интерпретировать как меру относительной важности признака при фиксированной силе регуляризации.

<syntaxhighlight lang="python"> from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.pipeline import Pipeline

pipeline = Pipeline([

   ("scaler", StandardScaler()),
   ("model", LogisticRegression(penalty="l2", C=1.0))

]) pipeline.fit(X_train, y_train) </syntaxhighlight>

Существен методический момент: параметры масштабирования (\mu, \sigma, x_{min}, x_{max}, Q_1, Q_2, Q_3) должны вычисляться исключительно на обучающей выборке методом fit и затем применяться к валидационной и тестовой выборкам методом transform, без повторного вычисления статистик на них. Нарушение этого правила приводит к утечке информации из тестовой выборки в процесс обучения (data leakage) и завышенной оценке качества модели.

Практические рекомендации

  • Для линейных и логистических моделей с регуляризацией — стандартизация (z-score); при наличии выраженных выбросов — робастное масштабирование.
  • Для метода опорных векторов, метода ближайших соседей, k-средних и метода главных компонент — стандартизация практически обязательна, поскольку эти методы напрямую оперируют расстояниями или дисперсией.
  • Для деревьев решений, случайного леса и градиентного бустинга — масштабирование, как правило, не требуется, поскольку эти алгоритмы инвариантны к монотонным преобразованиям отдельных признаков.
  • Для нейронных сетей — стандартизация или min-max scaling к диапазону [0,1] либо [-1,1], в зависимости от функций активации; для сверточных сетей, работающих с изображениями, min-max к [0,1] — стандартная практика.
  • При наличии выбросов, которые не являются ошибками измерения и должны быть сохранены в выборке, — робастное масштабирование или QuantileTransformer вместо min-max и z-score.
  • Для разреженных данных (например, TF-IDF, one-hot представления с большим числом признаков) — MaxAbsScaler, не разрушающий разреженность, в отличие от методов, включающих центрирование.
  • При сильной асимметрии распределения признака (доход, время ожидания, количество событий) — PowerTransformer перед стандартизацией.
  • Параметры масштабирования всегда вычисляются на обучающей выборке и фиксируются для последующего применения к новым данным; включение шага масштабирования в единый конвейер (sklearn.pipeline.Pipeline) снижает риск утечки данных при кросс-валидации.

См. также

Литература

  • Hastie T., Tibshirani R., Friedman J. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. — 2nd ed. — Springer, 2009.
  • Bishop C. M. Pattern Recognition and Machine Learning. — Springer, 2006.
  • Géron A. Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. — 3rd ed. — O'Reilly, 2022.
  • Zheng A., Casari A. Feature Engineering for Machine Learning.

Microsoft Azure Web App - Error 404 pipeline.fit — O'Reilly, 2018.

  • Box G. E. P., Cox D. R. An Analysis of Transformations // Journal of the Royal Statistical Society, Series B. — 1964. — Vol. 26, No. 2.
  • Yeo I.-K., Johnson R. A. A New Family of Power Transformations to Improve Normality or Symmetry // Biometrika. — 2000. — Vol. 87, No. 4.
  • Ioffe S., Szegedy C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift // Proceedings of the 32nd International Conference on Machine Learning (ICML). — 2015.
  • Scikit-learn developers. Preprocessing data // Scikit-learn User Guide. — scikit-learn.org/stable/modules/preprocessing.html

```

Личные инструменты