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

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

(Различия между версиями)
Перейти к: навигация, поиск
 
(2 промежуточные версии не показаны)
Строка 1: Строка 1:
 +
```
{{well|Статья написана с использованием LLM Claude Sonnet 5 и проверена участником Imil Baltaniazov 15:56, 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]].
-
 
+
-
Многие алгоритмы [[Машинное обучение|машинного обучения]] чувствительны к масштабу входных признаков. Если один признак измеряется в единицах порядка десятков тысяч, а другой — в единицах порядка нескольких единиц, алгоритмы, основанные на вычислении расстояний, скалярных произведений или градиентной оптимизации, начинают неявно придавать больший вес признаку с большим числовым разбросом — вне зависимости от его реальной информативности. Это приводит к смещённым, плохо интерпретируемым и медленно обучающимся моделям.
+
-
 
+
-
Нормализация и стандартизация решают эту проблему, приводя признаки к единой шкале до подачи в модель. Несмотря на то, что оба термина в бытовом употреблении нередко смешиваются, в строгом смысле они обозначают разные преобразования: нормализация переносит значения в фиксированный диапазон (чаще всего <tex>[0,1]</tex>), а стандартизация центрирует признак и приводит его дисперсию к единице. Выбор конкретного метода зависит от природы данных, наличия выбросов и используемого алгоритма.
+
== Постановка задачи ==
== Постановка задачи ==
-
Рассмотрим датасет с двумя признаками: возраст клиента (лет) и годовой доход (в рублях).
+
Признаки, описывающие объекты реального мира, как правило, измерены в разных единицах и имеют разные диапазоны значений. Рассмотрим задачу [[Классификация|классификации]] клиентов банка, где каждый объект описывается двумя признаками — возрастом (в годах) и месячным доходом (в рублях):
{| class="wikitable"
{| class="wikitable"
 +
! Клиент !! Возраст, лет !! Доход, руб./мес.
|-
|-
-
! Клиент !! Возраст, лет !! Доход, руб./год
+
| Иванов || 25 || 45 000
|-
|-
-
| 1 || 25 || 450 000
+
| Петров || 45 || 47 000
-
|-
+
-
| 2 || 40 || 1 200 000
+
-
|-
+
-
| 3 || 60 || 3 000 000
+
|}
|}
-
Возраст изменяется в диапазоне примерно 25–60 (разброс порядка десятков), доход — в диапазоне 450 000–3 000 000 (разброс порядка миллионов). Если такие данные подать, например, в [[Метод k ближайших соседей|метод k ближайших соседей]], евклидово расстояние между объектами будет практически полностью определяться разницей в доходе вклад возраста окажется пренебрежимо мал, хотя с содержательной точки зрения оба признака могут быть одинаково важны. Аналогичная проблема возникает при обучении [[Линейная регрессия|линейных моделей]] градиентными методами: поверхность функции потерь становится сильно вытянутой вдоль направления признака с малым масштабом, что замедляет сходимость [[Градиентный спуск|градиентного спуска]].
+
Возраст изменяется в диапазоне единиц-десятков, доход — в диапазоне десятков тысяч. Если вычислить евклидово расстояние между объектами без предварительного масштабирования:
 +
 
 +
:: <tex>d = \sqrt{(45-25)^2 + (47000-45000)^2} = \sqrt{400 + 4\,000\,000} \approx 2000{,}1</tex>
 +
 
 +
признак «возраст» практически не вносит вклада в итоговое расстояние: его слагаемое (400) на четыре порядка меньше слагаемого дохода (4 000 000). Для любого метода, опирающегося на расстояния между объектами — [[Метод ближайших соседей|метода ближайших соседей]], [[Метод опорных векторов|метода опорных векторов]], кластеризации методом k-средних, [[Метод главных компонент|метода главных компонент]] это означает, что признак с большим численным диапазоном будет доминировать в решении независимо от его действительной значимости для задачи.
 +
 
 +
Аналогичная проблема возникает при обучении моделей [[Градиентный спуск|градиентными методами]]. Функция потерь как функция параметров модели образует в пространстве весов некоторую поверхность; при сильно различающихся масштабах признаков линии уровня этой поверхности превращаются в вытянутые эллипсы с большим числом обусловленности гессиана. Градиентный спуск на такой поверхности движется зигзагообразно, и для достижения минимума требуется существенно больше итераций либо очень малый шаг обучения. После масштабирования признаков линии уровня приближаются по форме к окружностям, направление антиградиента указывает более точно на минимум, и сходимость ускоряется — этот эффект хорошо задокументирован для [[Линейная регрессия|линейной]] и [[Логистическая регрессия|логистической регрессии]], а также для [[Нейронная сеть|нейронных сетей]].
== Нормализация (min-max scaling) ==
== Нормализация (min-max scaling) ==
-
'''Нормализация''' (min-max scaling) линейно переносит значения признака в заданный диапазон, обычно <tex>[0,1]</tex>. Для признака <tex>x</tex> преобразование задаётся формулой:
+
'''Min-max scaling''' линейно преобразует признак так, чтобы его значения попали в заданный диапазон, чаще всего <tex>[0,1]</tex>:
:: <tex>x' = \frac{x - x_{min}}{x_{max} - x_{min}}</tex>
:: <tex>x' = \frac{x - x_{min}}{x_{max} - x_{min}}</tex>
-
где <tex>x_{min}</tex> и <tex>x_{max}</tex> — минимальное и максимальное значения признака на обучающей выборке. Для приведения к произвольному диапазону <tex>[a, b]</tex> используется обобщённая формула:
+
где <tex>x_{min}</tex> и <tex>x_{max}</tex> — минимальное и максимальное значен
 +
ия признака на обучающей выборке. Для произвольного целевого диапазона <tex>[a,b]</tex> формула обобщается:
-
:: <tex>x' = a + \frac{(x - x_{min})(b - a)}{x_{max} - x_{min}}</tex>
+
:: <tex>x' = a + \frac{(x - x_{min})(b-a)}{x_{max} - x_{min}}</tex>
-
'''Числовой пример.''' Возьмём признак «возраст» из таблицы выше: значения 25, 40, 60. Тогда <tex>x_{min}=25</tex>, <tex>x_{max}=60</tex>:
+
Метод сохраняет форму исходного распределения (все относительные расстояния между значениями пропорционально сжимаются или растягиваются), что удобно, когда диапазон признака имеет содержательный смысл — например, для признаков, ограниченных по своей природе (доля, вероятность, пиксельная интенсивность 0–255), а также при подготовке входов для нейронных сетей с сигмоидными или иными ограниченными функциями активации.
-
* для 25: <tex>x' = (25-25)/(60-25) = 0{,}00</tex>
+
Существенный недостаток — высокая чувствительность к выбросам, поскольку <tex>x_{min}</tex> и <tex>x_{max}</tex> определяются единственными экстремальными наблюдениями. Продемонстрируем это на выборке значений дохода (тыс. руб.): 30, 45, 50, 55, 60, 65, 400, где последнее значение — аномально высокий доход.
-
* для 40: <tex>x' = (40-25)/(60-25) = 0{,}43</tex>
+
-
* для 60: <tex>x' = (60-25)/(60-25) = 1{,}00</tex>
+
-
'''Когда применять.''' Min-max scaling полезен, когда требуется строго ограниченный диапазон значений — например, для входов [[Нейронная сеть|нейронных сетей]] с сигмоидными или tanh-активациями, для алгоритмов обработки изображений (пиксели естественно ограничены), а также когда распределение признака заведомо не является нормальным и не имеет тяжёлых выбросов.
+
Здесь <tex>x_{min}=30</tex>, <tex>x_{max}=400</tex>, диапазон равен 370. После min-max масштабирования:
-
'''Чувствительность к выбросам.''' Основной недостаток метода — сильная зависимость от экстремальных значений <tex>x_{min}</tex> и <tex>x_{max}</tex
+
{| class="wikitable"
-
>. Единственный аномальный объект способен «сжать» основную массу данных в узкий поддиапазон. Например, если среди клиентов появится доход в 50 000 000 руб., все остальные значения дохода после нормализации окажутся сосредоточены вблизи нуля, потеряв различимость.
+
! Исходное значение !! После Min-Max
 +
|-
 +
| 30 || 0,000
 +
|-
 +
| 45 || 0,041
 +
|-
 +
| 50 || 0,054
 +
|-
 +
| 55 || 0,068
 +
|-
 +
| 60 || 0,081
 +
|-
 +
| 65 || 0,095
 +
|-
 +
| 400 (выброс) || 1,000
 +
|}
 +
 
 +
Единственный выброс растянул диапазон настолько, что все «типичные» значения оказались сжаты в узкий интервал <tex>[0;\,0{,}095]</tex> и стали практически неразличимы для алгоритма. Это ключевое ограничение метода: перед его применением рекомендуется отдельно проверить данные на наличие выбросов (см. [[Выброс|выбросы]]).
 +
 
 +
В scikit-learn метод реализован классом <tt>MinMaxScaler</tt>:
 +
 
 +
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import MinMaxScaler
-
В библиотеке scikit-learn метод реализован классом <code>MinMaxScaler</code>.
+
scaler = MinMaxScaler(feature_range=(0, 1))
 +
X_scaled = scaler.fit_transform(X)
 +
</syntaxhighlight>
== Стандартизация (z-score) ==
== Стандартизация (z-score) ==
-
'''Стандартизация''' (standardization, z-score normalization) центрирует признак относительно среднего и масштабирует его так, чтобы [[Дисперсия случайной величины|дисперсия]] стала равна единице. Формула преобразования:
+
'''Стандартизация''' (z-score normalization) центрирует признак относительно среднего и масштабирует его по стандартному отклонению:
:: <tex>x' = \frac{x - \mu}{\sigma}</tex>
:: <tex>x' = \frac{x - \mu}{\sigma}</tex>
-
где <tex>\mu</tex> — выборочное среднее признака, <tex>\sigma</tex> — выборочное [[Среднеквадратичное отклонение|стандартное отклонение]]:
+
где
:: <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>\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>E[x']=0</tex>, <tex>Var(x')=1</tex>. Полученные значения называют '''z-оценками''' (z-scores) — они показывают, на сколько стандартных отклонений конкретное наблюдение отстоит от среднего.
+
После преобразования признак имеет нулевое среднее и единичную дисперсию: <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>. При этом сама по себе стандартизация не делает распределение нормальным — она лишь центрирует и масштабирует его, сохраняя исходную форму (асимметрию, эксцесс).
-
'''Числовой пример.''' Для того же признака «возраст» (25, 40, 60): <tex>\mu = 41{,}67</tex>, <tex>\sigma \approx 14{,}36</tex>. Тогда:
+
Продолжим пример с доходом. Для выборки {30, 45, 50, 55, 60, 65, 400} среднее <tex>\mu \approx 100{,}71</tex>, стандартное отклонение <tex>\sigma \approx 122{,}63</tex>. После стандартизации:
-
* для 25: <tex>x' = (25-41{,}67)/14{,}36 \approx -1{,}16</tex>
+
{| class="wikitable"
-
* для 40: <tex>x' = (40-41{,}67)/14{,}36 \approx -0{,}12</tex>
+
! Исходное значение !! После Z-score
-
* для 60: <tex>x' = (60-41{,}67)/14{,}36 \approx 1{,}28</tex>
+
|-
 +
| 30 || −0,577
 +
|-
 +
| 45 || −0,454
 +
|-
 +
| 50 || −0,414
 +
|-
 +
| 55 || −0,373
 +
|-
 +
| 60 || −0,332
 +
|-
 +
| 65 || −0,291
 +
|-
 +
| 400 (выброс) || 2,441
 +
|}
-
'''Когда применять.''' Стандартизация — наиболее универсальный выбор для большинства алгоритмов, использующих градиентную оптимизацию ([[Логистическая регрессия|логистической регрессии]], [[Метод опорных векторов|SVM]], нейронных сетей), а также для методов, опирающихся на предположения о нормальном распределении данных или на разложение [[Ковариационная матрица|ковариационной матрицы]], в первую очередь для [[Метод главных компонент|метода главных компонент]] (PCA). В отличие от min-max scaling, стандартизация не привязана к жёсткому диапазону, поэтому она устойчивее к добавлению новых наблюдений и мягче реагирует на умеренные выбросы, хотя среднее и стандартное отклонение сами по себе также чувствительны к экстремальным значениям.
+
По сравнению с min-max масштабированием типичные значения распределены несколько шире (интервал <tex>[-0{,}58;\,-0{,}29]</tex> против <tex>[0;\,0{,}095]</tex>), однако среднее и стандартное отклонение по-прежнему вычисляются с учётом выброса, а значит, остаются им искажены.
-
Важно подчеркнуть: стандартизация не делает распределение признака нормальным она лишь центрирует и масштабирует его, сохраняя исходную форму распределения (асимметрию, эксцесс).
+
Стандартизация метод по умолчанию для линейных и логистических моделей с регуляризацией, [[Метод опорных векторов|метода опорных векторов]], [[Метод главных компонент|метода главных компонент]] и линейного дискриминантного анализа, а также для большинства архитектур нейронных сетей. В отличие от min-max scaling, результат не ограничен фиксированным диапазоном, что не создаёт проблем при появлении на этапе применения модели значений, выходящих за пределы диапазона обучающей выборки.
-
В scikit-learn метод реализован классом <code>StandardScaler</code>.
+
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import StandardScaler
 +
 
 +
scaler = StandardSca
 +
ler()
 +
X_scaled = scaler.fit_transform(X)
 +
</syntaxhighlight>
 +
 
 +
Стоит отметить, что <tt>StandardScaler</tt> в scikit-learn по умолчанию вычисляет смещённую (population) дисперсию, то есть делит сумму квадратов отклонений на <tex>n</tex>, а не на <tex>n-1</tex>.
== Робастное масштабирование ==
== Робастное масштабирование ==
-
'''Робастное масштабирование''' (robust scaling) — метод, использующий устойчивые к выбросам статистики: [[Медиана|медиану]] и [[Интерквартильный размах|межквартильный размах]] (IQR) вместо среднего и стандартного отклонения. Формула:
+
'''Робастное масштабирование''' (robust scaling) использует вместо среднего и стандартного отклонения статистики, устойчивые к выбросам, — [[Медиана|медиану]] и [[Квартиль|межквартильный размах]] (IQR):
:: <tex>x' = \frac{x - Q_2}{Q_3 - Q_1}</tex>
:: <tex>x' = \frac{x - Q_2}{Q_3 - Q_1}</tex>
-
где <tex>Q_2</tex> — медиана (второй квартиль), <tex>Q_1</tex> и <tex>Q_3</tex> — первый и третий квартили, а разность <tex>Q_3 - Q_1 = IQR</tex> — межквартильный размах, охватывающий центральные 50% наблюдений.
+
где <tex>Q_2</tex> — медиана (второй квартиль), <tex>Q_1</tex> и <tex>Q_3</tex> — первый и третий квартили, а разность <tex>Q_3-Q_1</tex> — межквартильный размах (IQR), охватывающий центральные 50 % наблюдений.
-
'''Устойчивость к выбросам.''' Поскольку медиана и квартили являются робастными статистиками их значение определяется порядком наблюдений, а не их абсолютной величиной, — единичные аномальные значения практически не влияют на результат преобразования. Это ключевое отличие от min-max scaling и стандартизации, где выброс напрямую входит в вычисление масштабирующих параметров (<tex>x_{max}</tex>, <tex>\mu</tex>, <tex>\sigma</tex>).
+
Медиана и квартили — порядковые статистики, устойчивые к экстремальным значениям: смещение одного выброса в область бесконечности практически не меняет положение медианы или границ IQR, поскольку эти величины определяются не самими значениями, а их рангом в отсортированной выборке.
-
'''Пример влияния выброса.''' Пусть к выборке дохода (450 000, 1 200 000, 3 000 000) добавлено аномальное значение 50 000 000. При min-max scaling три «нормальных» наблюдения сожмутся в диапазон около 0–0,05. При робастном масштабировании медиана и IQR практически не изменятся, и относительное положение исходных наблюдений останется информативным.
+
Завершим сквозной пример с доходом. Для выборки {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>. Сведём все три метода в одну таблицу:
-
Метод рекомендуется использовать при работе с данными, содержащими выбросы, которые нежелательно удалять (например, в финансовых или медицинских данных, где экстремальные значения могут быть содержа
+
{| class="wikitable"
-
тельно важны).
+
! Исходное значение !! 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
 +
|}
-
В scikit-learn метод реализован классом <code>RobustScaler</code>.
+
Различие хорошо видно: под min-max и z-score основная масса «нормальных» значений сжата в узкий интервал из-за влияния выброса на <tex>x_{max}</tex>, <tex>\mu</tex> и <tex>\sigma</tex>. Робастное масштабирование, напротив, не изменило относительное расположение типичных значений (интервал <tex>[-1{,}25;\,0{,}5]</tex> пропорционален исходным различиям), а выброс получил большое по модулю, но не искажающее остальные данные значение — 17,25, что само по себе может служить сигналом об аномалии. Ценой этой устойчивости является то, что робастное масштабирование не гарантирует единичной дисперсии преобразованного признака и хуже подходит там, где важна именно эта статистическая интерпретация.
-
== Другие методы масштабирования ==
+
<syntaxhighlight lang="python">
 +
from sklearn.preprocessing import RobustScaler
-
* '''MaxAbsScaler''' — делит значения признака на максимум по модулю: <tex>x' = x / \max(|x|)</tex>. Результат лежит в диапазоне <tex>[-1, 1]</tex>, при этом сохраняется знак и разреженность данных (нулевые значения остаются нулевыми), поэтому метод удобен для разреженных матриц.
+
scaler = RobustScaler(quantile_range=(25.0, 75.0))
 +
X_scaled = scaler.fit_transform(X)
 +
</syntaxhighlight>
-
* '''PowerTransformer''' — семейство степенных преобразований (Бокса—Кокса и Йео—Джонсона), приближающих распределение признака к нормальному. Преобразование Бокса—Кокса применимо только к строго положительным значениям:
+
== Другие методы ==
-
:: <tex>x^{(\lambda)} = \begin{cases} \dfrac{x^\lambda - 1}{\lambda}, & \lambda \neq 0 \\ \ln(x), & \lambda = 0 \end{cases}</tex>
+
Помимо трёх базовых подходов, в scikit-learn реализован ряд специализированных преобразований.
-
Преобразование Йео—Джонсона обобщает эту формулу на случай отрицательных и нулевых значений. Параметр <tex>\lambda</tex> подбирается по максимуму правдоподобия. Метод полезен для сильно скошенных распределений (доход, цены, время ожидания), после которых применение стандартизации даёт более симметричные признаки.
+
'''MaxAbsScaler''' делит значения признака на максимальный модуль:
-
* '''QuantileTransformer''' — непараметрическое преобразование, отображающее эмпирическую функцию распределения признака на равномерное или нормальное распределение. Метод наиболее устойчив к выбросам среди перечисленных, поскольку явно «сжимает» хвосты распределения, но является нелинейным и может исказить взаимные расстояния между близкими наблюдениями.
+
:: <tex>x' = \frac{x}{|x_{max}|}</tex>
-
== Влияние на алгоритмы машинного обучения ==
+
Результат попадает в диапазон <tex>[-1,1]</tex>. Важное свойство — преобразование не сдвигает данные (не вычитает среднее или минимум), поэтому нулевые значения остаются нулевыми. Это делает MaxAbsScaler предпочтительным для разреженных матриц (например, TF-IDF представлений текста), где сохранение разреженности критично для памяти и скорости вычислений.
-
Чувствительность алгоритмов к масштабу признаков определяется тем, используют ли они расстояния, скалярные произведения или величину коэффициентов в функции потерь.
+
'''PowerTransformer''' — семейство нелинейных степенных преобразований, приближающих распределение признака к нормальному и стабилизирующих дисперсию. Преобразование Бокса — Кокса (Box-Cox) определено только для строго положительных значений:
 +
 
 +
:: <tex>x^{(\lambda)} = \begin{cases} \dfrac{x^{\lambda} - 1}{\lambda}, & \lambda \neq 0 \\[4pt] \ln x, & \lambda = 0 \end{cases}</tex>
 +
 
 +
Параметр <tex>\lambda</tex> подбирается по данным (обычно методом максимального правдоподобия). Преобразование Йео — Джонсона (Yeo-Johnson) — обобщение, допускающее нулевые и отрицательные значения:
 +
 
 +
:: <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>
 +
 
 +
Оба преобразования полезны для сильно асимметричных признаков (доход, число визитов, время
 +
ожидания), особенно для моделей, чувствительных к форме распределения.
 +
 
 +
'''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) || Высокая || Построение разделяющей гиперплоскости и ядровые функции опираются на евклидово расстояние между объектами
|-
|-
-
| [[Метод опорных векторов|SVM]] || Высокая || Оптимизация зазора и ядровые функции зависят от геометрии пространства признаков
+
| [[Метод ближайших соседей|Метод ближайших соседей]] (KNN) || Высокая || Классификация непосредственно основана на расстояниях между объектами в признаковом пространстве
|-
|-
-
| [[Метод k ближайших соседей|KNN]] || Высокая || Классификация напрямую основана на евклидовом (или ином) расстоянии
+
| [[Метод главных компонент|Метод главных компонент]] (PCA) || Высокая || Направления максимальной дисперсии определяются абсолютным масштабом признаков, а не их относительной значимостью
|-
|-
-
| [[Метод главных компонент|PCA]] || Высокая || Направления максимальной дисперсии определяются масштабом признаков
+
| Кластеризация методом k-средних || Высокая || Формирование кластеров основано на расстояниях до центроидов
|-
|-
-
| [[Нейронные сети|Нейронные сети]] || Высокая || Влияет на скорость и устойчивость сходимости градиентного спуска
+
| [[Нейронная сеть|Нейронные сети]] (градиентное обучение) || Высокая (влияет на скорость и устойчивость сходимости) || Разномасштабные входы приводят к вытянутому рельефу функции потерь и неравномерным градиентам по слоям
|-
|-
-
| [[K-means|Метод k-средних]] || Высокая || Кластеризация основана на расстояниях между объектами
+
| [[Дерево решений|Деревья решений]] || Низкая || Разбиения строятся по пороговым значениям одного признака независимо от масштаба остальных
|-
|-
-
| [[Дерево решений|Деревья решений]] || Низкая || Разбиения строятся по пороговым значениям отдельного признака, монотонные преобразования не меняют порядок
+
| [[Случайный лес|Случайный лес]] || Низкая || Ансамбль деревьев решений, наследует их инвариантность к монотонным преобразованиям признаков
|-
|-
-
| [[Случайный лес]] || Низкая || Ансамбль деревьев, наследует их нечувствительность к масштабу
+
| [[Градиентный бустинг|Градиентный бустинг]] (XGBoost, LightGBM, CatBoost) || Низкая || Также опирается на пороговые разбиения по отдельным признакам
|-
|-
-
| [[Градиентный бустинг]] || Низкая || Базовые модели — деревья решений, разбиения не зависят от абсолютного масштаба
+
| Наивный байесовский классификатор || Низкая / умеренная || Оценивает распределение каждого признака отдельно; масштаб не влияет на итоговую разделяющую способность
-
|-
+
-
| [[Наивный байесовский классификатор]] || Низкая || Оценивает распределения по каждому признаку независимо
+
|}
|}
-
Таким образом, масштабирование признаков критично для всех методов, работающих с расстояниями, скалярными произведениями или градиентной оптимизацией, и практически не влияет на модели, основанные на древовидных разбиениях.
+
Общая закономерность: методы, основанные на пороговых разбиениях одного признака (деревья и их ансамбли), инвариантны к любому монотонному преобразованию масштаба, тогда как методы, использующие расстояния, скалярные произведения или градиентную оптимизацию, чувствительны к нему напрямую.
== Влияние на регуляризацию ==
== Влияние на регуляризацию ==
-
[[Регуляризация|Регуляризация]] штрафует величину коэффициентов модели, добавляя к функции потерь L1- или L2-норму вектора весов:
+
[[Регуляризация|L1- и L2-регуляризация]] штрафуют величину коэффициентов модели. Для линейной регрессии с L2-штрафом (гребневая регрессия) функционал имеет вид:
 +
 
 +
:: <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>L1: \; \lambda \sum_{j=1}^{p} |w_j|, \qquad L2: \; \lambda \sum_{j=1}^{p} w_j^2</tex>
+
а для L1-регуляризации (лассо) — соответственно с штрафом <tex>\lambda\sum_{j}|\beta_j|</tex>. В обоих случаях величина штрафа зависит исключительно от численного значения коэффициента <tex>\beta_j</tex>, а не от того, насколько признак <tex>x_j</tex> в действительности значим для предсказания.
-
Штраф применяется одинаково ко всем коэффициентам <tex>w_j</tex>, независимо от того, какому признаку они соответствуют. Если признаки измеряются в разных масштабах, коэффициенты, соответствующие признакам с малым разбросом значений, вынуждены принимать большие абсолютные значения, чтобы вносить сопоставимый вклад в предсказание, — и именно эти коэффициенты регуляризация штрафует сильнее всего, хотя содержательно признак может быть не менее важен, чем остальные.
+
Проблема в том, что масштаб коэффициента обратно пропорционален масштабу признака: если признак измерен в рублях с диапазоном значений порядка <tex>10^5</tex>–<tex>10^6</tex>, соответствующий ему коэффициент естественным образом окажется очень малым (порядка <tex>10^{-5}</tex>–<
 +
tex>10^{-6}</tex>) просто для того, чтобы вклад <tex>\beta_j x_j</tex> в предсказание оставался разумной величины. Признак же, измеренный в единицах (например, число визитов в месяц), потребует коэффициента на несколько порядков больше. Регуляризация в этом случае штрафует признаки неравномерно — не пропорционально их реальной значимости, а обратно пропорционально их естественному масштабу: крупномасштабные признаки получают заниженный (и потому слабо штрафуемый) коэффициент, тогда как мелкомасштабные завышенный и, соответственно, сильнее подавляемый. Особенно чувствительно к этому L1-регуляризация: поскольку она способна обнулять коэффициенты полностью, отбор признаков при несогласованных масштабах оказывается смещённым в пользу признаков с большим численным диапазоном, а не в пользу признаков с наибольшей предсказательной силой.
-
В результате без предварительной стандартизации регуляризация штрафует признаки не по их информ
+
Именно поэтому стандартизация признаков перед обучением регуляризованных линейных моделей считается стандартной практикой: приведение всех признаков к единичной дисперсии уравнивает условия, при которых регуляризационный штраф применяется к каждому из них, и делает итоговые коэффициенты сопоставимыми как меры относительной значимости признаков.
-
ативности, а по их исходному масштабу, что искажает как качество модели, так и интерпретацию значимости коэффициентов. По этой причине стандартизация признаков — обязательный шаг перед применением [[Гребневая регрессия|Ridge]] (L2), [[Лассо|Lasso]] (L1) и [[Эластичная сеть|Elastic Net]] регрессии.
+
== Сравнение методов ==
== Сравнение методов ==
{| class="wikitable"
{| class="wikitable"
 +
! Метод !! Формула !! Диапазон результата !! Устойчивость к выбросам !! Основные плюсы !! Основные минусы
|-
|-
-
! Метод !! Формула !! Диапазон результата !! Устойчивость к выбросам !! Типичное применение
+
| Min-Max || <tex>x'=\frac{x-x_{min}}{x_{max}-x_{min}}</tex> || <tex>[0,1]</tex> (настраиваемый) || Низкая || Фиксированный, интерпретируемый диапазон; сохраняет форму распределения || Сильно искажается единичными выбросами; новые данные вне обучающего диапазона выходят за границы
|-
|-
-
| Min-max scaling || <tex>(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, нейросетей; интерпретация в единицах стандартного отклонения || Среднее и дисперсия чувствительны к выбросам
|-
|-
-
| Стандартизация (z-score) || <tex>(x-\mu)/\sigma</tex> || не ограничен, <tex>\mu=0,\sigma=1</tex> || Средняя || Линейные модели, SVM, PCA
+
| Robust || <tex>x'=\frac{x-Q_2}{Q_3-Q_1}</tex> || Не ограничен || Высокая || Устойчив к выбросам и асимметрии распределения || Не даёт единичной дисперсии; менее привычная интерпретация
|-
|-
-
| Робастное масштабирование || <tex>(x-Q_2)/(Q_3-Q_1)</tex> || не ограничен || Высокая || Данные с выбросами
+
| MaxAbs || <tex>x'=\frac{x}{|x_{max}|}</tex> || <tex>[-1,1]</tex> || Низкая || Сохраняет разреженность данных (нули остаются нулями) || Чувствителен к выбросам, как и Min-Max
|-
|-
-
| MaxAbsScaler || <tex>x/\max(|x|)</tex> || <tex>[-1,1]</tex> || Низкая || Разреженные данные
+
| PowerTransformer || нелинейное степенное преобразование || Приближается к нормальному распределению || Умеренная || Снижает асимметрию, стабилизирует дисперсию || Box-Cox требует строго положительных значений; интерпретация затруднена
|-
|-
-
| PowerTransformer || Бокс—Кокс / Йео—Джонсон || не ограничен, приближается к нормальному || Средняя || Скошенные распределения
+
| QuantileTransformer || преобразование по эмпирической функции распределения || <tex>[0,1]</tex> либо нормальное || Высокая || Полностью устраняет влияние выбросов и асимметрии || Нелинейно; может исказить взаимосвязи между признаками, риск переобучения на малых выборках
-
|-
+
-
| QuantileTransformer || отображение по квантилям || <tex>[0,1]</tex> или нормальное || Высокая || Сильно неоднородные, многомодальные признаки
+
|}
|}
-
Общий недостаток всех перечисленных методов — параметры преобразования (минимум, максимум, среднее, медиана и т. д.) должны вычисляться исключительно на обучающей выборке и затем применяться к валидационной и тестовой выборкам без пересчёта, иначе возникает утечка данных ([[Data Leakage|data leakage]]).
+
== Пример: подготовка данных для логистической регрессии в задаче прогнозирования оттока клиентов ==
-
 
+
-
== Пример: прогнозирование оттока клиентов ==
+
-
Рассмотрим упрощённую задачу [[Бинарная классификация|бинарной классификации]] — прогноз оттока клиентов телекоммуникационной компании с помощью [[Логистическая регрессия|логистической регрессии]]. Используются два признака: количество месяцев обслуживания (tenure) и ежемесячный платёж (monthly charges, руб.).
+
Рассмотрим упрощённый набор данных телекоммуникационной компании для задачи прогнозирования оттока (churn) с двумя признаками — стажем обслуживания (в месяцах) и ежемесячным платежом (в рублях):
{| class="wikitable"
{| class="wikitable"
 +
! Клиент !! Стаж, мес. !! Платёж, руб./мес. !! Отток
|-
|-
-
! Клиент !! tenure, мес. !! monthly charges, руб. !! Отток
+
| 1 || 2 || 3 500 || 1
|-
|-
-
| A || 2 || 1 800 || 1
+
| 2 || 34 || 1 200 || 0
|-
|-
-
| B || 34 || 950 || 0
+
| 3 || 58 || 4 200 || 0
|-
|-
-
| C || 58 || 2 400 || 0
+
| 4 || 4 || 900 || 1
|-
|-
-
| D || 4 || 3 100 || 1
+
| 5 || 45 || 5 600 || 0
|}
|}
-
До масштабирования диапазон tenure — [2, 58], диапазон monthly charges — [950, 3100]. При обучении логистической регрессии без предобработки градиентный спуск будет крайне медленно двигаться вдоль оси tenure, а L2-регуляризация станет несоразмерно штрафовать коэффициент при tenure, поскольку для компенсации малого масштаба этот коэффициент должен быть на порядок больше коэффициента при monthly charges.
+
Стаж имеет среднее <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>:
-
 
+
-
После стандартизации (<tex>\mu_{tenure}=24{,}5</tex>, <tex>\sigma_{tenure}\approx23{,}0</tex>; <tex>\mu_{charges}=2062{,}5</tex>, <tex>\sigma_{charges}\approx811{,}0</tex>) значения принимают вид:
+
{| class="wikitable"
{| class="wikitable"
 +
! Клиент !! Стаж (станд.) !! Платёж (станд.) !! Отток
|-
|-
-
! Клиент !! tenure' !! charges'
+
| 1 || −1,196 || 0,234 || 1
|-
|-
-
| A || -0,98 || -0,32
+
| 2 || 0,243 || −1,049 || 0
|-
|-
-
| B || 0,41 || -1,37
+
| 3 || 1,321 || 0,625 || 0
|-
|-
-
| C || 1,46 || 0,42
+
| 4 || −1,106 || −1,216 || 1
|-
|-
-
| D || -0,89 || 1,28
+
| 5 || 0,737 || 1,406 || 0
|}
|}
-
Теперь оба признака имеют сопоставимый масштаб, градиентный спуск сходится быстрее, а величина коэффициентов при регуляризации отражает реальный вклад признака в предсказание, а не его исходную единицу измерения. На практике преобразование выполняется методом <code>fit_transform</code> объекта <code>StandardScaler</code> на обучающей выборке и методом <code>transform</code> — на тестовой:
+
До масштабирования диапазон платежа (900–5600) на два порядка превышает диапазон стажа (2–58). При обучении [[Логистическая регрессия|логистической регрессии]] градиентными методами это означа
 +
ет, что частная производная функции потерь по коэффициенту при платеже на несколько порядков отличается по величине от производной по коэффициенту при стаже, и без индивидуальной настройки шага обучения для каждого признака сходимость существенно замедляется. Кроме того, при использовании L2- или L1-регуляризации коэффициент при платеже, обученный на исходных данных, будет иметь порядок <tex>10^{-4}</tex>, а коэффициент при стаже — порядок <tex>10^{-2}</tex><tex>10^{-1}</tex>; сравнение таких коэффициентов напрямую ничего не говорит об относительной значимости признаков. После стандартизации оба признака приведены к общему масштабу (нулевое среднее, единичная дисперсия), их вклад в предсказание и в регуляризационный штраф сопоставим, а абсолютные значения обученных коэффициентов допустимо интерпретировать как меру относительной важности признака при фиксированной силе регуляризации.
-
<pre>
+
<syntaxhighlight lang="python">
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import LogisticRegression
 +
from sklearn.pipeline import Pipeline
-
scaler = StandardScaler()
+
pipeline = Pipeline([
-
X_train_scaled = scaler.fit_transform(X_train)
+
("scaler", StandardScaler()),
-
X_test_scaled = scaler.transform(X_test)
+
("model", LogisticRegression(penalty="l2", C=1.0))
 +
])
 +
pipeline.fit(X_train, y_train)
 +
</syntaxhighlight>
-
model = LogisticRegression()
+
Существен методический момент: параметры масштабирования (<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) и завышенной оценке качества модели.
-
model.fit(X_train_scaled, y_train)
+
-
</pre>
+
== Практические рекомендации ==
== Практические рекомендации ==
-
* Для алгоритмов, основанных на расстояниях (KNN, k-means, SVM с ядрами), а также для PCA использовать стандартизацию (<code>StandardScaler</code>) в качестве метода по умолчанию.
+
* Для '''линейных и логистических моделей с регуляризацией''' — стандартизация (z-score); при наличии выраженных выбросов — робастное масштабирование.
-
* Для нейронных сетей и данных с известным ограниченным диапазоном (например, пиксели изображений) — использовать min-max scaling (<code>MinMaxScaler</code>).
+
* Для '''метода опорных векторов, метода ближайших соседей, k-средних и метода главных компонент''' — стандартизация практически обязательна, поскольку эти методы напрямую оперируют расстояниями или дисперсией.
-
* При наличии выбросов, которые нежелательно удалять из выборки, — использовать роба
+
* Для '''деревьев решений, случайного леса и градиентного бустинга''' масштабирование, как правило, не требуется, поскольку эти алгоритмы инвариантны к монотонным преобразованиям отдельных признаков.
-
стное масштабирование (<code>RobustScaler</code>).
+
* Для '''нейронных сетей''' — стандартизация или min-max scaling к диапазону <tex>[0,1]</tex> либо <tex>[-1,1]</tex>, в зависимости от функций активации; для сверточных сетей, работающих с изображениями, min-max к <tex>[0,1]</tex> — стандартная практика.
-
* Для сильно скошенных распределений (доходы, цены) перед стандартизацией целесообразно применить <code>PowerTransformer</code>, чтобы приблизить распределение к симметричному.
+
* При '''наличии выбросов''', которые не являются ошибками измерения и должны быть сохранены в выборке, — робастное масштабирование или QuantileTransformer вместо min-max и z-score.
-
* Для разреженных матриц (например, после [[TF-IDF|TF-IDF]] векторизации) — использовать <code>MaxAbsScaler</code>, не нарушающий разреженность.
+
* Для '''разреженных данных''' (например, TF-IDF, one-hot представления с большим числом признаков) — MaxAbsScaler, не разрушающий разреженность, в отличие от методов, включающих центрирование.
-
* Для древовидных моделей (деревья решений, случайный лес, градиентный бустинг) масштабирование, как правило, не требуется.
+
* При '''сильной асимметрии распределения''' признака (доход, время ожидания, количество событий) — PowerTransformer перед стандартизацией.
-
* Параметры масштабирования всегда обучаются только на обучающей выборке и затем применяются к валидационной и тестовой выборкам без повторного вычисления.
+
* Параметры масштабирования всегда вычисляются на обучающей выборке и фиксируются для последующего применения к новым данным; включение шага масштабирования в единый [[Конвейер обработки данных|конвейер]] (<tt>sklearn.pipeline.Pipeline</tt>) снижает риск утечки данных при кросс-валидации.
-
* Перед применением L1- или L2-регуляризации признаки необходимо стандартизировать в обязательном порядке.
+
== См. также ==
== См. также ==
Строка 237: Строка 326:
* Hastie T., Tibshirani R., Friedman J. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. — 2nd ed. — Springer, 2009.
* 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.
* 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 Media, 2022.
+
* Géron A. Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. — 3rd ed. — O'Reilly, 2022.
-
* Box G. E. P., Cox D. R. An Analysis of Transformations // Journal of the Royal Statistical Society, Series B. — 1964. — Vol. 26, No. 2. — P. 211—252.
+
* Zheng A., Casari A. Feature Engineering for Machine Learning.
-
* Yeo I.-K., Johnson R. A. A New Family of Power Transformations to Improve Normality or Symmetry // Biometrika. — 2000. — Vol. 87, No. 4. — P. 954—959.
+
Microsoft Azure Web App - Error 404
-
* Документация scikit-learn: preprocessing — [https://scikit-learn.org/stable/modules/preprocessing.html scikit-learn.org/stable/modules/preprocessing.html]
+
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

```

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