Нормализация (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