true
2 min read

Нормализация (Normalization)

Нормализация (Normalization)

Нормализация (Max-Min Normalization, Min-Max Scaling) – техника преобразования значений признака (Feature), масштабирующая значения таким образом, что они располагаются в диапазоне от 0 до 1. Вычисляется каждый нормализованный элемент признака с помощью формулы:

$$x_{i,norm} = \frac{x_i - x_{min}}{x_{max} - x_{min}}, где$$
$$x_{i,norm}\space{–}\space{нормализованный}\space{элемент}\space{признака,}$$
$$x_{min}\space{–}\space{наименьший}\space{элемент}\space{признака,}$$
$$x_i\space{–}\space{i-й}\space{непреобразованный}\space{элемент,}$$
$$x_{max}\space{–}\space{наибольший}\space{элемент}$$

Цель такого преобразования – изменить значения числовых столбцов в наборе данных так, чтобы сохранить различия их диапазонов. В Машинном обучении (Machine Learning) Датасет (Dataset) требует нормализации, когда признаки имеют разные диапазоны и тем самым способствуют искажению восприятия взаимоотношений между Переменными-предикторами (Predictor Variable) и Целевой переменной (Target Variable).

Нормализация и SkLearn

Нормализовать можно с помощью функции SkLearn. Импортируем MinMaxScaler библиотеки Scikit-learn:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

Загрузим наш игрушечный датасет и дополним команду: разделителем  является точка с запятой (sep = ';'):

# Импортируем датасет
df = pd.read_csv('https://www.dropbox.com/s/62xm9ymoaunnfg6/bank-full.csv?dl=1', sep = ';')
df.head()

Мы будем нормализовать Числовые переменные (Numeric Variable) датасета о клиентах банка – потребителях кредитных продуктов:

Определим, какие признаки являются числовыми, чтобы впоследствии их нормализовать:

df.dtypes
Возраст                                 int64
Работа                                 object
Семейный статус                        object
Образование                            object
Кредитный дефолт                       object
Ипотека                                object
Займ                                   object
Контакт                                object
Месяц                                  object
День недели                            object
Длительность                            int64
Кампания                                int64
День                                    int64
Предыдущий контакт                      int64
Доходность                             object
Колебание уровня безработицы          float64
Индекс потребительских цен            float64
Индекс потребительской уверенности    float64
Европейская межбанковская ставка      float64
Количество сотрудников в компании     float64
y                                      object
dtype: object

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

# Выберем встретившиеся числовые типы
numerics = ['int64', 'float64']

# Создадим копию датасета
newdf = df.select_dtypes(include = numerics)

Теперь приступим непосредственно к нормализации:

# Инициализация нормализатора
scaler = MinMaxScaler()

# Передача датасета и преобразование
scaler.fit(newdf)
scaled_features = scaler.transform(newdf)

# Конвертация в табличный формат.
df_MinMax = pd.DataFrame(data = scaled_features, 
columns = ["Возраст", 
          "Длительность",
          "Кампания",
          "День",
          "Предыдущий контакт", 
          "Колебание уровня безработицы", 
          "Индекс потребительских цен",
          "Индекс потребительской уверенности",
          "Европейская межбанковская ставка",
          "Количество сотрудников в компании"])

df_MinMax.head()

Результирующий нормализованный датасет приобрел следующий вид и готов к дальнейшей обработке и загрузке в Модель (Model):

Сравните, как повлияла нормализация на восприятие отношений между признаками "Возраст" и "Длительность [телефонного разговора с менеджером по продажам]". Это окажет существенное влияние на работу Метода k-ближайших соседей (kNN) и других его собратьев, учитывающих расстояние между точками. Мы отобразим на графике первые пять Наблюдений (Observation) датасета в исходном виде и преобразованном:

Нормализация и стандартизация

Стандартизация (Standartization) является разновидностью нормализации с использованием Стандартизованной оценки (Z-Score) и как бы центрирует наблюдения относительно нуля. Расстояние от нуля, то есть Дисперсия случайной величины (Variance) не превышает единицы:

# Исходные данные
[[0, 0], [0, 0], [1, 1], [1, 1]]

# Стандартизованные данные
[[-1, -1], [-1, -1], [1, 1], [1, 1]]

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

Фото: @bharathrajn89