Предварительная обработка и нормализация данных становятся очень важными, когда дело доходит до реализации различных алгоритмов машинного обучения. Поскольку предварительная обработка данных может существенно повлиять на результат модели обучения, очень важно, чтобы все функции были в одном масштабе. Нормализация важна в таких алгоритмах, как k-NN, машины опорных векторов, нейронные сети, главные компоненты. Тип необходимой предварительной обработки и нормализации функций может зависеть от данных.

Типы предварительной обработки

Существует несколько различных методов масштабирования данных. На изображениях ниже показаны четыре наиболее распространенных, которые можно использовать в алгоритмах машинного обучения.

Первый график под исходными данными показывает набор данных синтетической классификации с двумя классами только с двумя функциями. Первая функция (значение оси X) находится в диапазоне от 10 до 15. Вторая функция (значение оси Y) находится между 1 и 9. Четыре графика справа показывают различные способы преобразования данных, которые позволяют получить более стандартные данные. диапазоны.

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

RobustScaler работает аналогично StandardScaler, но использует медиану и квартили вместо среднего и дисперсии. Это заставляет скейлер игнорировать точки данных, которые сильно отличаются от остальных (ошибки измерения).

Нормализатор масштабирует каждую точку данных таким образом, чтобы вектор признаков имел евклидову длину, равную 1. Каждая точка данных масштабируется другим числом (на величину, обратную ее длине). Эта нормализация используется, когда имеет значение только направление данных, а не длина вектора признаков.

MinMaxScaler преобразует все входные переменные, чтобы все они находились на одной шкале от нуля до единицы. Метод вычисляет минимальные и максимальные значения для каждой функции в обучающих данных, а затем применяет преобразование min - max для каждой функции.

Применение масштабирования в машинном обучении

В следующем примере показано, как применить MinMaxScaler к функциям. Сначала создайте скалярный объект, а затем вызовите метод подгонки, используя обучающие данные X_train. Это позволит вычислить минимальные и максимальные значения функций для каждой функции в этом наборе обучающих данных. Затем, чтобы применить скаляр, вызовите его метод преобразования и передайте данные, необходимые для масштабирования. Результатом будет масштабная версия входных данных. В этом случае мы хотим масштабировать данные обучения и сохранить их в новой переменной с именем X_train_scaled. И тестовые данные, сохраняющие их в новой переменной под названием X_test_scaled. Затем мы просто используем эти масштабированные версии данных функции вместо исходных данных функции.

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
clf = SVC().fit(X_test_scaled, y_train)
r2_score = clf.score(X_test_scaled, y_test)

Здесь есть две очень важные вещи. Во-первых, один и тот же скалярный объект должен применяться как для обучения, так и для тестирования. Во-вторых, этот скалярный объект должен быть обучен на обучающих данных, а не на тестовых данных.

При предварительной обработке данных в алгоритмах машинного обучения необходимо соблюдать важные аспекты:

  • Установите средство масштабирования, используя обучающий набор, затем примените тот же масштабатор, чтобы преобразовать набор тестов.
  • Не масштабируйте обучающие и тестовые наборы с использованием разных средств масштабирования: это может привести к случайному перекосу данных.
  • Не устанавливайте масштабатор, используя какую-либо часть тестовых данных: ссылка на тестовые данные может привести к утечке данных.

Влияние предварительной обработки на контролируемое обучение

Следующий пример демонстрирует важность предварительной обработки данных в реальном примере набора данных рака. Подгонка SVC к исходным данным:

# import SVC classifier
from sklearn.svm import SVC
# split data
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# initialize classifier and fit data
svm = SVC(C= 100)
svm.fit(X_train, y_train)
# checking accuracy for classifier
print("Test set accuracy: {:.2f}".format(svm.score(X_test, y_test)))
>>>>> Test set accuracy: 0.63

Следующий код представляет данные масштабирования с помощью MinMaxScaler перед установкой классификатора SVC:

# preprocessing using 0-1 scaling
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# learning an SVM on the scaled training data
svm.fit(X_train_scaled, y_train)
# checking accuracy for classifier
print("Test set accuracy: {:.2f}".format(svm.score(X_test_scaled, y_test)))
>>>>> Test set accuracy: 0.97

Как мы можем судить по результатам точности, эффект масштабирования данных весьма значителен.

Заключение

Преобразование данных очень важно для многих методов машинного обучения. Тип нормализации функций, который лучше всего применить, может зависеть от набора данных, задачи обучения и используемого алгоритма обучения. Не существует жесткого правила, определяющего, когда нормализовать или стандартизировать данные. Лучше начать с подгонки модели к необработанным данным, нормализованным и стандартизованным данным и сравнить производительность для достижения наилучших результатов.