Когда использовать MinMaxScaler, RobustScaler, StandardScaler и Normalizer.

Многие алгоритмы машинного обучения работают лучше, когда признаки в даннных примерно одинакового масштаба и близки к нормальному распределению. MinMaxScaler, RobustScaler, StandardScaler, и Normalizer это методы из библиотеки scikit-learn подготовки данных для машинного обучения. Какой метод вам понадобится, и понадобится ли вообще, зависит от типа модели и значений признаков.

Это руководство подсветит различия и сходства между этими методами и поможет вам узнать, в каком случае какой инструмент лучше использовать.

Когда эти методы стали появляться в процессах решения задач машинного обучения, я испытывал сложности с нахождением информации о том, какой метод когда использовать. Комментаторы часто используют термины, масштабировать, стандартизирова и нормализовать взаимозаменяемо. Однако у них есть некоторые различия, и как мы выясним, 4 функции из scikit-learn делают разные вещи.

Для начала отмечу, что:

  • Тетрадка Jupyter на которой основана статья может быт найдена тут.
  • В этой статье мы не рассматриваем логарифические и иные преобразования, предназначенные для сокращение гетероскедастичности ошибок.
  • Это руководство основывается на scikit-learn v0.20.3.

Что эти термины обозначают?

Масштабирование обычно означает изменение диапазона значений. Форма распределения не меняется. Представьте модель здания, у нее те же пропорции, что и оригинал, только меньше. Вот почему мы говорим, что здание нарисовано в масштабе. Диапазон часто устанавливается от 0 до 1.

Стандартизация в общем обозначает изменение значений таким образом, чтобы стандартное отклонение распределения стало равно единице. Часто применяется и масштабирование.

Под нормализацией можно иметь ввиду оба из указанных выше терминов (и даже больше!). Я советую вам избегать термина нормализация, поскольку у него много определений и это может создавать путаницу.

Если вы используете любой из этих терминов, я советую вам давать им определения.

Для чего масштабировать, стандартизировать или нормализовать?

Многие алгоритмы машинного обучение работают лучше или сходятся быстрее когда признаки примерно одинакового масштаба и нормально или почти нормально распределены. Примеры семейств таких алгоритмов включают:

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

Масштабирование и стандартизация могут помочь придать признакам более удобоваримую для алгоритмов форму.

Четыре метода предобработки данных в scikit-learn которые мы рассматриваем следуют API показанному ниже. X_train и X_test это обычно массивы numpy или pandas DataFrames.

from sklearn import preprocessingmm_scaler = preprocessing.MinMaxScaler()
X_train_minmax = mm_scaler.fit_transform(X_train)
mm_scaler.transform(X_test)

Мы рассмотрим несколько распределений и применим к ним каждый из четырех методов из scikit-learn.

Исходные данные

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

  • beta — с отрицательным перекосом
  • exponential — с положительным перекосом
  • leptokurtic — с положительным эксцессом
  • platykurtic — с отрицательным эксцессом
  • bimodal — бимодальное

Значения все примерно одного масштаба, как мы можем видеть на оси x графика оценки плотности ядра (kdeplot) ниже.

Затем я добавил шестое с намного большими значениями (нормально распределенное) — normal

Сейчас наш kdeplot выглядит так:

Вглядевшись внимательно в монитор и вы можете заметите крошечную зелёную полоску больших значений справа. Ниже описательная статистика для наших признаков.

Хорошо, давайте начнём масштабировать!

MinMaxScaler

Из каждого значения признака, MinMaxScaler вычитает минимальное значение признака и делит на диапазон. Диапазон это разница между минимумом и максимумом этого признака.

MinMaxScaler сохраняет форму исходного распределения. Он не меняет содержательно информацию содержащуюся в исходных данных.

Заметьте, что MinMaxScaler не снижает важность выбросов.

Диапазон по умолчанию для признака после MinMaxScaler находится между 0 и 1.

Вот kdeplot после применения MinMaxScaler.

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

MinMaxScaler не самое плохое место для начала, если только вам не нужно, чтобы у вашего признака было нормальное распределение или у вас есть выбросы и вы хотите уменьшить их влияние.

RobustScaler

RobustScaler преобразует вектор признака вычитая медиану и деля на межквартильный размах (75% значение — 25% значение).

Как и в случае с MinMaxScaler, наш признак с большими значениями — normal-big — сейчас в похожем с другими признаками масштабе. Отметим, что RobustScaler не масштабирует данные в предопределенный интервал как MinMaxScaler. Он не удовлетворяет строгому определению масштабирования, которое я дал ранее.

Заметим, что диапазон для каждого признака после применения RobustScaler больше чем он был для MinMaxScaler.

Используйте RobustScaler если вы хотите уменьшить эффект от выбросов по сравнению с MinMaxScaler.

Теперь перейдём к StandardScaler.

StandardScaler

StandardScaler является популярным в отрасли алгоритмом. ?

StandardScaler стандартизирует признак вычитая среднее и затем масштабируя к единчной дисперсии. Единичная дисперсия значит деление все значений на стандартное отклонение. StandardScaler не удовлетворяет строгому определению масштаба которое я ввёл ранее.

В результате применения StandardScaler мы получаем распределение со стандартным отклонением равным 1. Дисперсия так же равна 1, так как дисперсия = квадрату стандартного отклонения. А 1 в квадрате = 1.

StandardScaler делает среднее распределения равным 0.

На графике выше вы можете видеть, что у всех шести распределений среднее равно нулю, и единичная дисперсия. Значения в похожем масштабе, но диапазон больше чем после MinMaxScaler.

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

Сейчас посмотрим на Normalizer.

Normalizer

Normalizer работает на строках, не на столбцах! Мне кажется это очень неинтуитивным. Легко упустить эту информацию в документации.

По умолчанию, к каждому наблюдению применяется L2 нормализация, так чтобы значения в строке имели единичную норму. Единичная норма в L2 значит, что если мы возведем в квадрат каждый элемент и просуммируем их, в результате получим 1. В качестве альтернативы L2 можно использовать, L1 (манхеттенскую) нормализацию.

Normalizer преобразует все признаки в значения между -1 и 1 (этот текст был обновлён в июле 2019). В нашем примере, в normal_big все значения преобразуются к .9999999.

Вам известны хорошие примеры использования Normalizer? Если так, пожалуйста сообщите мне в Twitter @discdiver.

В большинстве случаев один из предыдущих инструментов может быть более полезен.

И ещё раз, scikit-learn’s Normalizer работает на строках, не на столбцах.

Сравнение

Ниже все графики оригинальных распределений до и после применения MinMaxScaler, RobustScaler и StandardScaler.

Отметим, что после каждого и этих трех преобразования данные примерно в одинаковом масштабе. ?

Резюме

Масштабировать и стандартизирова данные часто хорошая идея. Я крайне рекомендую использовать StandardScaler до подачи данных в алгоритм глубокого обучения или в алгоритм зависящий от относительных расстояний наблюдений, или же использующий L2 регуляризацию. Заметим, что StandardScaling может усложнить интерпретацию коэффициентов регрессии. ?

Советы:

  • Используйте StandardScaler если вам нужно, чтобы у признака было нулевое среднее и единичное отклонение. Если вам нужны более нормально распределенных данные и допустимо преобразовывать данные, попробуйте метод scikit-learn QuantileTransformer(output_distribution='normal').
  • Используйте MinMaxScaler, если хотите легкого преобразования. Он не искажает.
  • Вы можете использовать RobustScaler если в данных есть выбросы и вы хотите уменьшить их влияние.
  • Используйте Normalizer аккуратно — он нормализует строки данных, а не признаки. Он может использовать L2 или L1 нормализацию.

Вот шпаргалка которая поможет вам быстро вспомнить использование методов.

В этой статье вы прочитали, как scikit-learn может помочь вам масштабировать, стандартизировать и нормализовать ваши данные. ***Я обновил изображения и некоторые тексты этой статьи в августе 2021. Спасибо читателям за обратную связь!***

Ресурсы для дополнительного изучения:

Оригинал статьи: Scale, Standardize, or Normalize with Scikit-Learn by Jeff Horn.