Машинное обучение — нормализация/нормализация

машинное обучение

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

Зачем нормализовать

  • После нормализации скорость градиентного спуска для поиска оптимального решения увеличивается;

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

  • Нормализация может повысить точность;

Некоторым классификаторам необходимо вычислять расстояние между образцами (например, евклидово расстояние), например KNN. Если диапазон диапазона признаков очень велик, расчет расстояния в основном зависит от этого признака, что противоречит фактической ситуации (например, фактическая ситуация такова, что признак с малым диапазоном значений более важен).

Когда нормализация не выполняется, решенная кривая:

没有做归一化时,求解的曲线.png

После нормализации данных решенная кривая:

归一化后的求解曲线.png

Какие алгоритмы машинного обучения не (не должны) выполнять нормализацию?

Вероятностные модели (деревовидные модели) не нуждаются в нормализации, поскольку их интересует не значение переменной, а распределение переменной и условная вероятность между переменными, например, деревья решений, RF. А задачи оптимизации вроде Adaboost, SVM, LR, Knn, KMeans требуют нормализации.

нормализованный метод

Стандартизация стандартного отклонения (стандартная шкала)

Нормализация среднего и дисперсии. И это делается для каждого измерения функции, а не для выборки.

Приведите обработанные данные в соответствие со стандартным нормальным распределением, то есть среднее значение равно 0, стандартное отклонение равно 1, а функция преобразования:

x*=xμоx^* = \frac {x - \mu} {\sigma}

где μ — среднее значение всех выборочных данных, а σ — стандартное отклонение всех выборочных данных.

Реализация Python:

использоватьnumpyстандартизировать стандартное отклонение матрицы

import numpy as np
 
x_np = np.array([[1.5, -1., 2.],
                [2., 0., 0.]])
mean = np.mean(x_np, axis=0)
std = np.std(x_np, axis=0)
print('矩阵初值为:{}'.format(x_np))
print('该矩阵的均值为:{}\n 该矩阵的标准差为:{}'.format(mean,std))
another_trans_data = x_np - mean
another_trans_data = another_trans_data / std
print('标准差标准化的矩阵为:{}'.format(another_trans_data))

Выходной результат:

矩阵初值为:[[ 1.5 -1.   2. ]
 [ 2.   0.   0. ]]
该矩阵的均值为:[ 1.75 -0.5   1.  ]
 该矩阵的标准差为:[0.25 0.5  1.  ]
标准差标准化的矩阵为:[[-1. -1.  1.]
 [ 1.  1. -1.]]

sklearn предоставляет API для стандартизации стандартного отклонения, а StandardScaler можно использовать для реализации вышеуказанных функций, реализованных с помощью numpy.

from sklearn.preprocessing import StandardScaler  # 标准化工具
import numpy as np
 
x_np = np.array([[1.5, -1., 2.],
                [2., 0., 0.]])
scaler = StandardScaler()
x_train = scaler.fit_transform(x_np)
print('矩阵初值为:{}'.format(x_np))
print('该矩阵的均值为:{}\n 该矩阵的标准差为:{}'.format(scaler.mean_,np.sqrt(scaler.var_)))
print('标准差标准化的矩阵为:{}'.format(x_train))

Выходной результат:

矩阵初值为:[[ 1.5 -1.   2. ]
            [ 2.   0.   0. ]]
该矩阵的均值为:   [ 1.75 -0.5   1.  ]
 该矩阵的标准差为:[0.25 0.5  1.  ]
标准差标准化的矩阵为:[[-1. -1.  1.]
                     [ 1.  1. -1.]]

Можно обнаружить, что инструмент стандартизации sklearn будет иметь два атрибута после создания экземпляра: один — mean_ (среднее) и один — var_ (дисперсия). Конечный результат такой же, как при использовании numpy.

Мин-макс нормализация

Также известная как нормализация дисперсии, это линейное преобразование исходных данных, так что результирующие значения отображаются между [0, 1]. Функция преобразования выглядит следующим образом:

x*=xminmaxminx^* = \frac {x - min} {max - min}

где max — максимальное значение выборочных данных, а min — минимальное значение выборочных данных. Недостатком этого метода является то, что при добавлении новых данных могут измениться значения max и min, которые необходимо будет переопределить.

Реализация кода в sklearn:


import numpy as np

X = np.array([[1., -1., 2.],

              [2., 0., 0.],

              [0., 1., -1.]])

min_max_scaler = preprocessing.MinMaxScaler()

X_minMax = min_max_scaler.fit_transform(X)


вывод:

array([[ 0.5 , 0. , 1. ], 
          [ 1. , 0.5 , 0.33333333], 
          [ 0. , 1. , 0. ]])

Способ найти размер - использовать np.max() и np.min() напрямую, старайтесь не использовать встроенные в python max() и min()