автор: Робби Альфардо Ирфан, Учимся на практике

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

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

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

Хорошо, давайте узнаем о нормализации и стандартизации в этой серии!

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

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

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

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

Вот формула градиентного спуска:

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

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

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

Вот формула расстояния на основе евклидова расстояния:

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

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

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

Введение в масштабирование функций

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

Существует два основных способа масштабирования функций, которые мы рассмотрим в оставшейся части этой статьи:

Нормализация данных

Нормализация относится к изменению масштаба числовых атрибутов с действительными значениями в диапазон от 0 до 1. Он также известен как масштабирование Min-Max.

Формула нормализации с использованием масштабирования Min-Max:

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

Стандартизация данных

Стандартизация означает смещение распределения каждого атрибута таким образом, чтобы оно имело среднее значение, равное нулю, и стандартное отклонение, равное единице (единичная дисперсия). Он также известен как масштабирование Z-оценки.

Формула стандартизации с использованием шкалы Z-score:

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

Советы: какой метод использовать

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

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

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

Реализация масштабирования функций

Загрузка набора данных

Мы будем использовать Диабетические данные от Kaggle. Он был создан в 2017 году. Кроме того, переменные со значениями NaN обрабатывались с использованием импутации (среднее и медиана). Давайте начнем с чтения наших данных как pandas DataFrame:

##Data Inputing and Describing
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
import pandas as pd
diabetes_data = pd.read_csv('.../input/diabetes.csv')
diabetes_data.info()
diabetes_data.head()
diabetes_data.describe()

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

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

Разделение нашего набора данных на обучающий и тестовый набор

Что ж, вот наша модель алгоритма, которая будет учиться на ваших данных, чтобы делать прогнозы. Как правило, мы разделяем набор данных на соотношение 70:30 или 80:20, что это значит, 70 процентов данных берутся в поезде, а 30 процентов — в тесте. . Однако это разделение может быть изменено в зависимости от формы и размера набора данных.

#Splitting training and testing data
diabetes_target = diabetes_data.Outcome
diabetes_predictors = diabetes_data.drop(['Outcome'], axis=1)
import numpy as np
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(diabetes_predictors,diabetes_target,test_size=0.2,random_state=0)

Как работает нормализация

Когда нам нужно нормализовать ваши данные, мы должны импортировать MinMaxScalar из библиотеки sklearn.

#Data Normalization
from sklearn.preprocessing import MinMaxScaler 
normalization = MinMaxScaler().fit(X_train)
X_train_norm = pd.DataFrame(normalization.transform(X_train), columns=['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age'])
X_test_norm = pd.DataFrame(normalization.transform(X_test), columns=['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age'])

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

Как работает стандартизация

#Data Standardization
from sklearn.preprocessing import StandardScaler
standardization = StandardScaler()
X_train_std = pd.DataFrame(standardization.fit_transform(X_train),
        columns=['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age'])
X_test_std = pd.DataFrame(standardization.fit_transform(X_test),
        columns=['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age'])

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

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

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

#Comparing BoxPlot
fig, axes = plt.subplots(3, 1, figsize=(12,12))
sns.boxplot(x="variable", y="value", data=pd.melt(X_train), ax=axes[0]).set(
    title='Original Data', xlabel='')
sns.boxplot(x="variable", y="value", data=pd.melt(X_train_norm), ax=axes[1]).set(
    title='Normalized Data', xlabel='')
sns.boxplot(x="variable", y="value", data=pd.melt(X_train_std), ax=axes[2]).set(
    title='Standardized Data', xlabel='')
plt.show()

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

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

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

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

K ближайших соседей (KNN)

В KNN K — это количество ближайших соседей. Количество соседей является основным решающим фактором. Это самый простой случай. Предположим, что P1 — это точка, для которой метка должна предсказать. Сначала вы находите ближайшую точку к P1, а затем метку ближайшей точки, назначенную P1.

Каждый объект голосует за свой класс, и класс с наибольшим количеством голосов принимается за прогноз. KNN имеет следующие основные шаги:

  1. Рассчитать расстояние
  2. Найдите ближайших соседей
  3. Голосовать за ярлыки
#KNN model
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import mean_squared_error
knn = KNeighborsClassifier(n_neighbors=6) 
rmse_knn = [] 
trainX = [X_train, X_train_norm, X_train_std]
testX = [X_test, X_test_norm, X_test_std]
for i in range(len(trainX)):
    knn.fit(trainX[i],y_train)
    pred = knn.predict(testX[i])
    rmse_knn.append(np.sqrt(mean_squared_error(y_test,pred)))
#result
df_knn = pd.DataFrame({'RMSE':rmse_knn},index=['Original','Normalized','Standardized'])
df_knn

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

Машина опорных векторов (SVM)

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

SVM ищет максимальную маргинальную гиперплоскость, выполнив следующие шаги:

  1. Создавайте гиперплоскости, которые наилучшим образом разделяют классы. На рисунке слева показаны три гиперплоскости черный, синий и оранжевый. Здесь синий и оранжевый имеют более высокие ошибки классификации, но черный правильно разделяет два класса.
  2. Выберите правую гиперплоскость с максимальной сегрегацией из любой ближайшей точки данных, как показано на рисунке справа.
#SVM model
from  sklearn import svm
from sklearn.metrics import mean_squared_error 
svm = svm.SVC(kernel='linear') 
rmse_svm = []
trainX = [X_train, X_train_norm, X_train_std]
testX = [X_test, X_test_norm, X_test_std]
for i in range(len(trainX)):
    svm.fit(trainX[i],y_train)
    pred = svm.predict(testX[i])
    rmse_svm.append(np.sqrt(mean_squared_error(y_test,pred)))
#result    
df_svm = pd.DataFrame({'RMSE':rmse_svm},index=['Original','Normalized','Standardized'])
df_svm

Стандартизированные данные показали лучшие результаты, чем нормализованные данные.

Дерево решений

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

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

#Decision Tree Model
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import mean_squared_error
dt = DecisionTreeClassifier()
rmse_dt = []
trainX = [X_train,X_train_norm,X_train_std]
testX = [X_test,X_test_norm,X_test_std]
for i in range(len(trainX)):
    dt.fit(trainX[i],y_train)
    pred = dt.predict(testX[i])
    rmse_dt.append(np.sqrt(mean_squared_error(y_test,pred)))
#result    
df_dt = pd.DataFrame({'RMSE':rmse_dt},index=['Original','Normalized','Standardized'])
df_dt

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

Резюме

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

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

До встречи в следующих сериях!!!