Найти тему

MinMaxScaler в Машинном обучении простыми словами

Фото: Yomex Owo / Unsplash
Фото: Yomex Owo / Unsplash

MinMaxScaler – библиотека Scikit-learn, позволяющая произвести Нормализацию (Normalization) данных перед использованием в Модели (Model) Машинного обучения (ML), то есть приведение Числовых переменных (Numeric Variable) к диапазону от 0 до 1.

Многие Алгоритмы (Algorithm) Машинного обучения работают лучше, когда числовые входные переменные приводятся к определенному диапазону.

Двумя наиболее популярными методами масштабирования числовых данных перед моделированием являются нормализация и Стандартизация (Standartization). Нормализация масштабирует каждую входную переменную до диапазона от нуля до единицы – диапазон значений, где мы имеем наибольшую точность. Стандартизация масштабирует каждую входную переменную отдельно путем вычитания среднего значения (так называемое центрирование) и деления на Стандартное отклонение (Standard Deviation), чтобы Среднее значение (Average) равнялось нулю, а стандартное отклонение – единице.

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

Модели машинного обучения изучают сопоставление Предикторов (Predictor Variable) с Целевой (Target Variable).

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

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

-2

Например, для набора данных мы могли бы предположить минимальное и максимальное наблюдаемые значения как 30 и -10. Затем мы можем нормализовать любое значение, например 18,8, следующим образом:

y = (18.8 – (-10)) / (30 – (-10)) = 28.8 / 40 = 0.72

Вы можете нормализовать свой набор данных с помощью объекта MinMaxScaler библиотеки scikit-learn.

Набор данных Sonar

Набор данных Sonar — это стандартный набор данных для двоичной классификации. Он включает 60 столбцов-предикторов и целевую переменную с двумя классами. В наборе данных 208 примеров, и классы достаточно сбалансированы.

Это набор данных классификации гидроакустических сигналов. Задача состоит в том, чтобы научить Нейронную сеть (Neural Network) различать отраженные сигналы сонара.

-3

Для начала импортируем необходимые библиотеки:

import matplotlib.pyplot as plt

from numpy import mean, std

from pandas import read_csv, DataFrame

from pandas.plotting import scatter_matrix

from sklearn.model_selection import cross_val_score

from sklearn.model_selection import RepeatedStratifiedKFold

from sklearn.neighbors import KNeighborsClassifier

from sklearn.pipeline import Pipeline

from sklearn.preprocessing import LabelEncoder

from sklearn.preprocessing import MinMaxScaler

Теперь подгрузим датасет:

plt.rcParams["figure.figsize"] = (20, 20)

url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv"

dataset = read_csv(url, header = None)

dataset.hist()

pyplot.show()

-4

Для каждой входной переменной создается Гистограмма (Histogram). Многие переменные имеют асимметричное распределение.

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

Далее давайте подгоним и оценим модель на необработанном наборе данных. Разделим данные на предикторы и целевую переменную, назначим всем столбцам тип данных – число с плавающей запятой. Закодируем классы целевой переменной и инициируем модель K ближайших соседей. Проведем Кросс-валидацию (Cross Validation) и посмотрим точность:

data = dataset.values

X, y = data[:, :-1], data[:, -1]

X = X.astype('float32')

y = LabelEncoder().fit_transform(y.astype('str'))

model = KNeighborsClassifier()

cv = RepeatedStratifiedKFold(n_splits = 10, n_repeats = 3, random_state = 1)

n_scores = cross_val_score(model, X, y, scoring = 'accuracy', cv = cv, n_jobs = -1, error_score = 'raise')

print('Точность: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))

Модель показывает средние результаты Точности (Accuracy):

Точность: 0.797 (0.073)

Мы видим, что модель достигла средней точности классификации около 79,7 % и находится на уровне хорошей производительности.

Давайте теперь посмотрим, как на этот показатель повлияет нормализация сс MinMaxScaler. Инициализируем экземпляр класса MinMaxScaler и Мы вызываем функцию fit_transform(), передавая ей наш набор данных. Затем конвертируем массив обратно в Датафрейм (Dataframe).

data = dataset.values[:, :-1]

trans = MinMaxScaler()

data = trans.fit_transform(data)

dataset = DataFrame(data)

plt.rcParams["figure.figsize"] = (20, 20)

dataset.hist()

pyplot.show()

Мы видим, что распределения были скорректированы и что минимальное и максимальное значения для каждой переменной теперь равны 0 и 1 соответственно:

-5

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

Графики гистограмм преобразованных MinMaxScaler входных переменных для набора данных сонараГрафики гистограмм преобразованных MinMaxScaler входных переменных для набора данных сонара

Далее давайте оценим ту же модель KNN, что и в предыдущем разделе, но в данном случае с преобразованным набором данных:

trans = MinMaxScaler()

model = KNeighborsClassifier()

pipeline = Pipeline(steps = [('t', trans), ('m', model)])

cv = RepeatedStratifiedKFold(n_splits = 10, n_repeats = 3, random_state = 1)

n_scores = cross_val_score(pipeline, X, y, scoring = 'accuracy', cv = cv, n_jobs = -1, error_score = 'raise')

print('Точность: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))

Запустив пример, мы видим, что преобразование MinMaxScaler приводит к повышению производительности до 81,3%:

Точность: 0.813 (0.085)

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Поддержите нас, поделившись статьей в социальных сетях и подписавшись на канал. И попробуйте бесплатные курсы на YouTube.

Наука
7 млн интересуются