Когда использовать 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. Спасибо читателям за обратную связь!***
Ресурсы для дополнительного изучения:
- Документация scikit-learn по предобработке данных.
- Ещё один документ о влиянии скалеров scikit-learn на выбросы.
- Прекрасное руководство о вероятностных распределениях за авторством Sean Owen.
- Еще одно руководство сравнивающее эти методы написанное Ben Alex Keen.
Оригинал статьи: Scale, Standardize, or Normalize with Scikit-Learn by Jeff Horn.