← Назад к вопросам

Как нормализовать и стандартизировать признаки? В чём разница?

1.0 Junior🔥 181 комментариев
#Pandas и обработка данных#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Нормализация и стандартизация признаков

Это два фундаментальных метода масштабирования признаков в машинном обучении, которые преобразуют данные для приведения их к сопоставимому масштабу. Несмотря на частое использование этих терминов как синонимов, они имеют существенные различия.

Определения

Стандартизация (Standardization) — это процесс преобразования данных так, чтобы они имели среднее значение (mean) = 0 и стандартное отклонение (std) = 1. Формула:

z = (x - mean) / std

Этот метод часто называют Z-score normalization. Данные после стандартизации распределены примерно нормально вокруг нуля.

Нормализация (Normalization) — это масштабирование признаков в диапазон [0, 1] или [-1, 1]. Самый распространённый метод — Min-Max scaling:

x_normalized = (x - min) / (max - min)

Результат находится в диапазоне [0, 1].

Ключевые различия

АспектСтандартизацияНормализация
Диапазон(-∞, +∞)[0, 1]
Среднее значение0Зависит от данных
Стд. отклонение1Зависит от данных
Формула(x - mean) / std(x - min) / (max - min)
Чувствительность к выбросамСредняяВысокая
Когда использоватьБольшинство алгоритмовКогда нужен фиксированный диапазон

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

Используй стандартизацию для:

  • Алгоритмов, основанных на расстояниях (KNN, K-means)
  • Методов с регуляризацией (Ridge, Lasso, Elastic Net)
  • Нейронных сетей
  • PCA
  • Линейной и логистической регрессии (важно для интерпретации коэффициентов)

Используй нормализацию для:

  • Алгоритмов, чувствительных к масштабу признаков (SVM с RBF ядром)
  • Когда нужен интуитивный диапазон [0, 1]
  • Нейронных сетей с активациями типа sigmoid/tanh
  • Когда выбросы могут сильно исказить данные

Практические примеры

import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# Исходные данные
X = np.array([[1, 100],
              [2, 200],
              [3, 300],
              [4, 400]])

# Стандартизация
scaler_std = StandardScaler()
X_standardized = scaler_std.fit_transform(X)
print("Стандартизированные данные:")
print(X_standardized)
print(f"Mean: {X_standardized.mean(axis=0)}")
print(f"Std: {X_standardized.std(axis=0)}")

# Нормализация
scaler_norm = MinMaxScaler()
X_normalized = scaler_norm.fit_transform(X)
print("\nНормализированные данные:")
print(X_normalized)
print(f"Min: {X_normalized.min(axis=0)}")
print(f"Max: {X_normalized.max(axis=0)}")

Важные замечания

  1. Fit на тренировочных данных: Масштабирование должно быть обучено только на тренировочном наборе, затем применено к тестовому. Это избегает data leakage.
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # Fit + Transform
X_test_scaled = scaler.transform(X_test)         # Только Transform!
  1. Выбросы: Стандартизация более устойчива к выбросам, чем нормализация, потому что не использует абсолютные минимум/максимум.

  2. Дерево-подобные алгоритмы: Random Forest, XGBoost, Decision Trees НЕ требуют масштабирования, так как они инвариантны к монотонным трансформациям.

  3. Категориальные признаки: Масштабирование применяется ТОЛЬКО к числовым признакам.

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