Введение

Недавно я работал с набором данных из ML, в котором было несколько функций, охватывающих разные степени величины, диапазона и единиц измерения. Это серьезное препятствие, поскольку некоторые алгоритмы машинного обучения очень чувствительны к этим особенностям, т. е. большинство алгоритмов хорошо работают только при нормальном распределении. Итак, как мы можем использовать эти функции, когда они так сильно различаются с точки зрения того, что они представляют? Здесь я обратился к концепции масштабирования/перемасштабирования функций в машинном обучении. Это важная часть этапа предварительной обработки данных, но я видел, как многие новички упускают ее из виду (в ущерб своей модели машинного обучения).

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

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

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

Алгоритмы на основе градиентного спуска

Алгоритмы машинного обучения, такие как линейная регрессия, логистическая регрессия, нейронные сети, PCA (анализ основных компонентов) и т. д., использующие градиентный спуск в качестве метода оптимизации, требуют масштабирования данных. Взгляните на формулу. для градиентного спуска ниже:

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

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

Алгоритмы на основе расстояния

Алгоритмы расстояния, такие как KNN, кластеризация K-средних и SVM (машины опорных векторов), больше всего зависят от набора функций. Это связано с тем, что за кулисами они используют расстояния между точками данных, чтобы определить их сходство.

Например, предположим, что у нас есть данные, содержащие баллы учащихся старших классов по программе CGPA (от 0 до 5) и их будущие доходы (в тысячах рупий):

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

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

Эффект масштабирования заметен, когда мы сравниваем евклидово расстояние между точками данных для студентов A и B, а также между B и C до и после масштабирования, как показано ниже:

  • Расстояние AB до масштабирования =›

  • Расстояние до н.э. до масштабирования =›

  • Расстояние AB после масштабирования =›

  • Расстояние до н.э. после масштабирования =›

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

Древовидные алгоритмы

Алгоритм на основе дерева, с другой стороны, довольно нечувствителен к масштабу функций. Подумайте об этом, дерево решений разбивает узел только на основе одной функции. Дерево решений разбивает узел на функцию, которая увеличивает однородность узла. Другие функции не влияют на это разделение на функцию.

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

Что такое нормализация?

Нормализация – это метод масштабирования, при котором значения сдвигаются и масштабируются таким образом, что в конечном итоге они оказываются в диапазоне от 0 до 1. Этот метод также известен как масштабирование минимум-максимум.

Вот формула нормализации:

Здесь Xmax и Xmin — максимальное и минимальное значения признака соответственно.

  • Когда значение X является минимальным значением в столбце, числитель будет равен 0, и, следовательно, X' равно 0
  • С другой стороны, когда значение X является максимальным значением в столбце, числитель равен знаменателю, и, таким образом, значение X’ равно 1.
  • Если значение X находится между минимальным и максимальным значением, то значение X' находится между 0 и 1.

Что такое стандартизация?

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

Вот формула стандартизации:

является средним значением признаков и

- стандартное отклонение значений признаков. Обратите внимание, что в этом случае значения не ограничены определенным диапазоном.

Теперь у вас должен быть большой вопрос: когда мы должны использовать нормализацию и когда мы должны использовать стандартизацию? Давай выясним!

Большой вопрос — нормализовать или стандартизировать?

Нормализация или стандартизация — вечный вопрос среди новичков в области машинного обучения. Позвольте мне уточнить ответ в этом разделе.

  • Нормализация полезна, когда вы знаете, что распределение ваших данных не соответствует распределению Гаусса. Это может быть полезно в алгоритмах, которые не предполагают никакого распределения данных, таких как K-ближайшие соседи и нейронные сети.
  • Стандартизация, с другой стороны, может быть полезна в случаях, когда данные подчиняются распределению Гаусса. Однако это не обязательно должно быть правдой. Кроме того, в отличие от нормализации, стандартизация не имеет ограничивающего диапазона. Таким образом, даже если в ваших данных есть выбросы, стандартизация не повлияет на них.

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

Нормализация с использованием sklearn (sci-kit-learn)

Чтобы нормализовать ваши данные, вам нужно импортировать MinMaxScaler из библиотеки SkLearn и применить его к нашему набору данных. Итак, давайте сделаем это!

# нормализация данных с помощью sklearnfrom sklearn. preprocessing import MinMaxScaler # подгонка масштабера к обучающим данным norm = MinMaxScaler() fit(X_train) # преобразование обучающих данныхX_train_norm = norm transform(X_train) # преобразование данных тестированияabsX_test_norm = norm transform(X_test)

Давайте посмотрим, как нормализация повлияла на наш набор данных:

Все функции теперь имеют минимальное значение 0 и максимальное значение 1. Отлично!

Стандартизация с использованием sklearn

Чтобы стандартизировать ваши данные, вам нужно импортировать StandardScaler из библиотеки sklearn и применить его к нашему набору данных. Вот как это сделать:

# стандартизация данных с помощью sklearnfrom sklearn.preprocessing import StandardScaler # копия наборов данныхX_train_stand = X_train.copy()X_test_stand = X_test.copy() # числовые характеристикиnum_cols = ['Item_Weight','Item_Visibility','Item_MRP','Outlet_Establishment_Year'] # apply стандартизация числовых признаков для i в num_cols: # подходит для столбца данных обучения scale = StandardScaler().fit(X_train_stand[[i]]) # преобразует столбец данных обучения X_train_stand[i] = scale.transform(X_train_stand[[i]] ) # преобразовать столбец данных тестирования X_test_stand[i] = scale.transform(X_test_stand[[i]])

Вы бы заметили, что я применил стандартизацию только к своим числовым столбцам, а не к другим функциям горячего кодирования. Стандартизация функций, закодированных One-Hot, будет означать назначение распределения категориальным функциям. Вы не хотите этого делать!

Но почему я не сделал то же самое при нормализации данных? Потому что функции, закодированные One-Hot, уже находятся в диапазоне от 0 до 1. Таким образом, нормализация не повлияет на их значение.

Итак, давайте посмотрим, как стандартизация изменила наши данные:

Числовые характеристики теперь сосредоточены на среднем значении с единичным стандартным отклонением. Потрясающий!

Сравнение немасштабированных, нормализованных и стандартизированных данных

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

Подробнее о визуализации данных можно узнать здесь

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

Применение масштабирования к алгоритмам машинного обучения

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

K-ближайшие соседи

Как мы видели ранее, KNN — это алгоритм, основанный на расстоянии, на который влияет ряд функций. Давайте посмотрим, как это работает с нашими данными до и после масштабирования:

# обучение модели KNN из sklearn.neighbors import KNeighborsRegressor# измерение показателя RMSE из sklearn.metrics import mean_squared_error # knn knn = KNeighborsRegressor(n_neighbors=7) rmse = [] # необработанные, нормализованные и стандартизированные данные для обучения и тестированияtrainX = [X_train, X_train_norm, X_train_stand ]testX = [X_test, X_test_norm, X_test_stand] # подгонка модели и измерение RMSE для i в диапазоне (len(trainX)): # fit knn.fit(trainX[i],y_train) # Pred = knn.predict(testX[i ]) # RMSE rmse.append(np.sqrt(mean_squared_error(y_test,pred))) # визуализация результата df_knn = pd.DataFrame({'RMSE':rmse},index=['Исходный','Нормализованный','Стандартизированный '])df_knn

Вы можете видеть, что масштабирование функций снизило оценку RMSE нашей модели KNN. В частности, нормализованные данные работают немного лучше, чем стандартизированные данные.

Примечание. Я измеряю среднеквадратичную ошибку здесь, потому что это соревнование оценивает среднеквадратичную ошибку.

Заключение

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

Ключевые выводы:

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