Краткий обзор моделей, которым нужны предварительно обработанные данные

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

Что такое нормализация?

Нормализация — это общий термин, связанный с масштабированием переменных. Масштабирование преобразует набор переменных в новый набор переменных того же порядка величины. Обычно это линейное преобразование, поэтому оно не влияет на корреляцию или прогностическую силу признаков.

Почему нам нужно нормализовать наши данные? Потому что некоторые модели чувствительны к порядку величины признаков. Если функция имеет порядок величины, равный, например, 1000, а другая функция имеет порядок величины, равный 10, некоторые модели могут «думать», что первая функция важнее второй. Очевидно, что это предвзятость, потому что порядок величины не дает нам никакой информации о предсказательной способности. Итак, нам нужно устранить это смещение, преобразовав переменные, чтобы придать им один и тот же порядок величины. В этом заключается роль масштабирующих преобразований.

Такими преобразованиями могут быть нормализация (преобразующая каждую переменную в интервал 0–1) и стандартизация (преобразующая каждую переменную в переменную с нулевым средним и единичной дисперсией). Я подробно рассказываю об этих преобразованиях в другой статье. По моему опыту, стандартизация работает лучше, потому что она не уменьшает распределение вероятностей переменной, если есть выбросы, как, например, нормализация. Итак, я буду говорить о стандартизации на протяжении всей статьи.

Модели, требующие нормализации

Давайте посмотрим на некоторые модели, которые требуют масштабирования перед обучением. В следующих примерах я буду использовать код Python и объект конвейера scikit-learn, который выполняет последовательность преобразований перед применением модели и возвращает объект, который можно вызвать, поскольку он сам был моделью.

Функция масштабирования, которую я собираюсь использовать, — это стандартизация, выполняемая объектом StandardScaler.

Линейные модели

Все линейные модели, кроме линейной регрессии, требуют нормализации. Регрессии Lasso, Ridge и Elastic Net являются мощными моделями, но они требуют нормализации, поскольку штрафные коэффициенты одинаковы для всех переменных.

lasso = make_pipeline(StandardScaler(), Lasso()) 
ridge = make_pipeline(StandardScaler(), Ridge()) 
en = make_pipeline(StandardScaler(), ElasticNet())

Логистическая регрессия также требует нормализации, чтобы избежать проблемы исчезающего градиента на этапе обучения.

logistic = make_pipeline(StandardScaler(), LogisticRegression())

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

lr = make_pipeline(StandardScaler(), LinearRegression())

Опорные векторные машины

Методы опорных векторов — это мощные модели, основанные на расстояниях. Они пытаются найти гиперплоскость в векторном пространстве признаков, которая способна линейно разделить обучающие записи в соответствии со значением целевой переменной.

С некоторыми изменениями SVM можно использовать даже с нелинейными функциями и для целей регрессии.

Поскольку расстояния очень чувствительны к порядку величины признаков, необходимо применять масштабирующие преобразования и для SVM.

svm_c = make_pipeline(StandardScaler(), LinearSVC()) # For classification 
svm_r = make_pipeline(StandardScaler(), LinearSVR()) # For regression

k-ближайшие соседи

KNN — очень популярный алгоритм, основанный на расстояниях (обычно евклидово расстояние). Прогноз учитывает k ближайших соседей к данной точке в пространстве признаков.

Как и SVM, даже KNN требует работы с нормализованными данными.

knn_c = make_pipeline(StandardScaler(), KNeighborsClassifier()) # For classification 
knn_r = make_pipeline(StandardScaler(), KNeighborsRegressor()) # For regression

Нейронные сети

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

nn_c = make_pipeline(StandardScaler(), MLPClassifier()) # For classification 
nn_r = make_pipeline(StandardScaler(), MLPRegressor()) # For regression

Выводы

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

Если вам интересны модели, о которых я рассказываю в этой статье, я подробно рассказываю о них в своем онлайн-курсе Машинное обучение с учителем в Python.

Первоначально опубликовано на https://www.yourdatateacher.com 12 июня 2022 г.