Почему одинаково полезные признаки могут мешать друг другу только из-за единиц измерения
Представь два признака: возраст пользователя и годовой доход. Первый измеряется десятками, второй — сотнями тысяч. Если отдать их некоторым алгоритмам как есть, модель начнет воспринимать пространство неравномерно. Один признак станет визуально и численно доминировать просто из-за масштаба, а не потому, что он действительно важнее. Именно поэтому масштабирование — не косметическая обработка, а способ вернуть признакам честные геометрические отношения.
Особенно это заметно в моделях, где расстояния, градиенты или регуляризация зависят от масштаба координат. KNN, SVM, логистическая регрессия с регуляризацией, линейные модели, PCA — все они чувствуют разницу очень быстро.
Что меняет масштабирование в математическом смысле
$$ z = \frac{x - \mu}{\sigma} $$Стандартизация переводит признак в шкалу, где среднее становится нулем, а разброс — единичным. Благодаря этому признаки сравниваются в сопоставимом масштабе.
z— стандартизированное значение признакаx— исходное значение объекта\mu— среднее значение признака по выборке\sigma— стандартное отклонение признака
Интуитивно это значит, что модель начинает видеть не абсолютные числа, а относительное положение объекта внутри распределения признака. Один доход уже не «кричит» громче только потому, что записан большими числами.
Когда без масштабирования правда нельзя
Без него почти всегда плохо чувствуют себя методы, работающие через расстояния или через оптимизацию коэффициентов в чувствительном пространстве. Например, в KNN один крупномасштабный признак может полностью задавить остальные в евклидовом расстоянии. В линейных моделях с L1 и L2-регуляризацией коэффициенты начинают сравниваться некорректно, если признаки имеют разные масштабы. В PCA главные компоненты могут отражать не структуру данных, а просто размер единиц измерения.
Но важно помнить и обратное: деревья решений, случайный лес, бустинг на деревьях обычно гораздо менее чувствительны к масштабированию. Значит, preprocessing всегда должен соотноситься с типом модели.
Как это выглядит в Python
import pandas as pd # задаем небольшой пример с признаками разных масштабов
from sklearn.preprocessing import StandardScaler # используем стандартное масштабирование признаков
frame = pd.DataFrame({ # собираем таблицу с несопоставимыми единицами измерения
'age': [21, 28, 35, 42], # возраст измеряется десятками
'income': [45000, 70000, 120000, 160000], # доход записан числами на порядки больше
})
scaler = StandardScaler() # создаем объект масштабирования
scaled = scaler.fit_transform(frame) # переводим оба признака в общую шкалу со средним 0 и std 1
scaled_frame = pd.DataFrame(scaled, columns=['age_z', 'income_z']) # оформляем результат в читаемую таблицу
print(scaled_frame.round(3)) # смотрим, как признаки стали сопоставимыми по масштабуЭто маленькое преобразование часто меняет поведение модели сильнее, чем попытка сразу перейти к более сложному алгоритму. Именно поэтому хороший preprocessing почти всегда дешевле и полезнее беспорядочного усложнения.