MinMaxScaler – библиотека Scikit-learn, позволяющая произвести Нормализацию (Normalization) данных перед использованием в Модели (Model) Машинного обучения (ML), то есть приведение Числовых переменных (Numeric Variable) к диапазону от 0 до 1.
Многие Алгоритмы (Algorithm) Машинного обучения работают лучше, когда числовые входные переменные приводятся к определенному диапазону.
Двумя наиболее популярными методами масштабирования числовых данных перед моделированием являются нормализация и Стандартизация (Standartization). Нормализация масштабирует каждую входную переменную до диапазона от нуля до единицы – диапазон значений, где мы имеем наибольшую точность. Стандартизация масштабирует каждую входную переменную отдельно путем вычитания среднего значения (так называемое центрирование) и деления на Стандартное отклонение (Standard Deviation), чтобы Среднее значение (Average) равнялось нулю, а стандартное отклонение – единице.
Масштабирование данных является рекомендуемым этапом предварительной обработки при работе со многими алгоритмами машинного обучения.
Модели машинного обучения изучают сопоставление Предикторов (Predictor Variable) с Целевой (Target Variable).
Входные переменные – предикторы могут иметь разные единицы измерения (например, футы, километры и часы), что, в свою очередь означает разные масштабы. А это увеличивает сложность моделирования. Большие входные значения (например, разброс в сотни или тысячи единиц) могут привести к модели, которая изучает большие значения веса. Модель с большими значениями веса часто нестабильна, а это означает, что она может страдать от низкой производительности во время обучения и чувствительности к входным значениям, что приводит к более высокой ошибке обобщения.
Нормализация требует, чтобы вы знали или могли точно оценить минимальные и максимальные наблюдаемые значения. Возможно, вы сможете оценить эти значения по имеющимся у вас данным.
Например, для набора данных мы могли бы предположить минимальное и максимальное наблюдаемые значения как 30 и -10. Затем мы можем нормализовать любое значение, например 18,8, следующим образом:
y = (18.8 – (-10)) / (30 – (-10)) = 28.8 / 40 = 0.72
Вы можете нормализовать свой набор данных с помощью объекта MinMaxScaler библиотеки scikit-learn.
Набор данных Sonar
Набор данных Sonar — это стандартный набор данных для двоичной классификации. Он включает 60 столбцов-предикторов и целевую переменную с двумя классами. В наборе данных 208 примеров, и классы достаточно сбалансированы.
Это набор данных классификации гидроакустических сигналов. Задача состоит в том, чтобы научить Нейронную сеть (Neural Network) различать отраженные сигналы сонара.
Для начала импортируем необходимые библиотеки:
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()
Для каждой входной переменной создается Гистограмма (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 соответственно:
Создаются гистограммы переменных, хотя распределения не сильно отличаются от их исходных распределений, показанных в предыдущем разделе.
Графики гистограмм преобразованных 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.