В машинном обучении очень важна нормализация данных, если нормализация данных не выполняется, модель может быть сломана или может быть обучена странная модель.
Зачем нужна нормализация данных
Теперь имеется обучающий набор данных, содержащий две выборки со следующим содержимым:
Размер опухоли (см) | Время обнаружения (сутки) | |
---|---|---|
Образец 1 | 1 | 200 |
Образец 2 | 5 | 100 |
Если взять в качестве примера алгоритм k-ближайших соседей, значение «времени обнаружения» намного больше, чем значение «размера опухоли», расстояние между выборками определяется «временем обнаружения», а на обученную модель в основном влияет «время обнаружения», даже «размер опухоли». Влияние размера «незначительно».
Решение состоит в том, чтобы отобразить данные в одном масштабе, что является нормализацией данных.
Два распространенных способа нормализации данных:нормализация наибольшего значенияинормализация средней дисперсии.
Нормализация максимального значения (нормализация)
Наиболее ценная нормализация — это сопоставление данных между 0 и 1, что подходит для ситуации, когда распределение данных имеет очевидные границы. Минимальное значение признака вычитается из значения признака выборки, а затем делится на диапазон значений признака Соответствующая математическая формула:
x s cal e =x −x m in x m ax −x m in
использоватьnp.random
Создайте массив 2D целых чисел 50 * 2 и преобразуйте его в число с плавающей запятой:
import numpy as np
X = np.random.randint(0, 100, size=(50, 2))
X = np.array(X, dtype=float)
Для первого столбца данных = np.min(X[:, 0])
, = np.max(X[:, 0])
:
X[:, 0] = (X[:, 0] - np.min(X[:, 0])) / (np.max(X[:, 0]) - np.min(X[:, 0]))
То же самое верно и для второго столбца данных:
X[:, 1] = (X[:, 1] - np.min(X[:, 1])) / (np.max(X[:, 1]) - np.min(X[:, 1]))
В этот момент все собственные значения выборки находятся в диапазоне от 0 до 1.
Нормализация средней дисперсии (стандартизация)
Нормализация средней дисперсии — это процесс нормализации всех данных к распределению со средним значением 0 и дисперсией 1. Это относится к распределениям данных с резкими границами или без них. Математическая формула:
x s cal e =x −x m ean s
: функция означает,: характерная дисперсия.
использовать то же самоеnp.random
Создайте массив 2D целых чисел 50 * 2 и преобразуйте его в число с плавающей запятой:
X2 = np.random.randint(0, 100, size=(50, 2))
X2 = np.array(X2, dtype=float)
Для первого столбца данных = np.mean(X2[:, 0])
, = np.std(X2[:, 0])
:
X2[:, 0] = (X2[:, 0] - np.mean(X2[:, 0])) / np.std(X2[:, 0])
То же самое верно и для второго столбца данных:
X2[:, 1] = (X2[:, 1] - np.mean(X2[:, 1])) / np.std(X2[:, 1])
Вы можете видеть, что среднее значение каждого столбца X2 очень близко к 0, а дисперсия очень близка к 1:
# np.mean(X2[:, 0])
-4.440892098500626e-18
# np.mean(X2[:, 1])
-1.2878587085651815e-16
# np.std(X2[:, 0])
0.9999999999999999
# np.std(X2[:, 1])
0.9999999999999999
Нормализуйте тестовый набор данных
Предыдущие нормализуют набор обучающих данных, но обработка нормализации набора тестовых данных отличается. Поскольку тестовые данные имитируют реальную среду, и трудно получить среднее значение и дисперсию всех тестовых данных в реальной среде, неправильно выполнять вышеуказанные операции с набором тестовых данных в это время.Правильный метод заключается в использовании набора обучающих данных, нормализованных данных.
Например, нормализация максимального значения набора тестовых данных:
t est s cal e =test −m in t ra i n m ax t ra i n −m in t ra i n
Нормализация средней дисперсии тестового набора данных:
t est s cal e =test −mean t ra i n s t ra i n
Взяв в качестве примера нормализацию средней дисперсии, Scikit Learn инкапсулирует класс StandardScaler для нормализации обучающих и тестовых наборов данных.
Возьмите данные диафрагмы в качестве примера:
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
Класс StandardScaler находится в модуле предварительной обработки:
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
Передайте обучающие данныеfit()
метод, который сохраняет дисперсию и среднее значение обучающих данных и возвращает сам экземпляр StandardScaler:
standardScaler.fit(X_train)
вmean_
,scale_
Свойства содержат среднее значение и дисперсию:
# standardScaler.mean_
array([5.83416667, 3.08666667, 3.70833333, 1.17 ])
# standardScaler.scale_
array([0.81019502, 0.44327067, 1.76401924, 0.75317107])
Тогда ты можешьtransform()
Данные обучения и тестовые данные передаются в метод для получения нормализованных данных:
X_train = standardScaler.transform(X_train)
X_test = standardScaler.transform(X_test)