Почему эти два слова постоянно смешивают
В разговорах о preprocessing слова «стандартизация» и «нормализация» часто используют как взаимозаменяемые. Из-за этого у новичков возникает ощущение, что речь идет об одном и том же действии: просто как-то привести данные в порядок перед моделью. На практике это разные преобразования с разной логикой. И путаница между ними может приводить к лишним привычкам: например, человек автоматически стандартизирует все подряд, не понимая, зачем именно делает это сейчас.
Полезнее всего развести эти понятия через вопрос: к чему именно мы хотим привести признак?
Что делает стандартизация
$$ z = \frac{x - \mu}{\sigma} $$Стандартизация центрирует признак и приводит его к единичному стандартному отклонению. После этого признак измеряется не в исходных единицах, а в отклонениях от среднего.
z— стандартизированное значениеx— исходное значение признака\mu— среднее по выборке\sigma— стандартное отклонение признака
Это особенно полезно там, где модель чувствительна к масштабу и где важно, чтобы признаки были сопоставимы по разбросу: линейные модели, PCA, SVM, KNN.
А что делает нормализация
Нормализация чаще означает приведение значений к ограниченному диапазону, например от 0 до 1. Здесь идея не в центрировании и не в стандартном отклонении, а в том, чтобы положить все значения в общую числовую рамку. Это может быть полезно, когда алгоритм или последующий слой системы ожидает именно такой диапазон, либо когда нужно сохранить относительный порядок внутри признака без акцента на распределение.
То есть стандартизация опирается на статистику распределения, а нормализация — на диапазон значений. Это разные вопросы к данным и, соответственно, разные ответы.
Как выбирать между ними
Если работаешь с алгоритмом, чувствительным к масштабу и распределению, чаще полезнее стандартизация. Если важно уложить значения в фиксированный интервал, например для нейросетевого входа или специфического preprocessing-пайплайна, может быть удобна нормализация. Но универсального правила «всегда делать X» нет. Всегда сначала стоит думать о модели и о геометрии данных, а не о ритуале preprocessing.
import pandas as pd # задаем один числовой признак для сравнения двух преобразований
from sklearn.preprocessing import StandardScaler, MinMaxScaler # берем стандартизацию и нормализацию из sklearn
frame = pd.DataFrame({'feature': [56, 70, 84, 91]}) # создаем исходный столбец значений
standardized = StandardScaler().fit_transform(frame[['feature']]) # переводим значения в z-оценки
normalized = MinMaxScaler().fit_transform(frame[['feature']]) # переводим значения в диапазон от 0 до 1
result = pd.DataFrame({ # собираем все версии признака в одну таблицу
'raw': frame['feature'], # исходные значения без изменений
'z_score': standardized.ravel(), # стандартизированные значения признака
'minmax': normalized.ravel(), # нормализованные значения в диапазоне 0..1
})
print(result.round(3)) # сравниваем, как одно и то же число выглядит после двух разных подходовКогда видишь обе колонки рядом, путаница обычно исчезает. Стандартизация отвечает на вопрос про положение значения внутри распределения, а нормализация — про его место внутри диапазона.