Повысьте точность модели машинного обучения с помощью преобразования числовой переменной в Pytorch

Эта история представляет собой полное руководство по внедрению техники трансформации и повышению точности с помощью кода в Pytorch.

Обзор 📙

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

Некоторые из примеров предварительной обработки данных включают заполнение отсутствующего значения с помощью метода вменения [1] , преобразования или кодирования Категориальная переменная с использованием Кодировки [2] и преобразованием в Числовую переменную с помощью Стандартизации или Нормализации. [3]. Таким образом, в этой статье мы хотим сосредоточиться на предоставлении мощной методологии для преобразования числовой переменной, чтобы помочь модели машинного обучения улавливать значимую информацию внутри данных.

Техника трансформации 📄

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

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

Различные полезные методы, представленные в этой статье, можно использовать для преобразования переменной в гауссово распределение или, что более вероятно, в гауссово. Это квантильные преобразования, степенные преобразования и дискретные преобразования.

  • Квантильные преобразования [4] - это нелинейное преобразование, при котором исходное значение характеристики заменяется средним значением всех других функций того же ранга или квантиля. Звучит модно, но на самом деле очень просто. Как показано на рисунке ниже, во-первых, данные сортируются по их значениям. Затем вы вычисляете среднее значение по всем столбцам отсортированного набора данных и заменяете исходные значения средним. Наконец, верните набор данных в исходный порядок, но сохраните нормализованные значения.

  • Преобразование мощности [5] принадлежит к семейству параметрических монотонных преобразований, которые используются для стабилизации дисперсии и минимизации проблем асимметрии, связанных с гетероскедастичностью (непостоянной дисперсией) или другими ситуации, когда желательна нормальность. Гетероскедатичность, с другой стороны, возникает, когда дисперсия вокруг линии регрессии не одинакова для всех значений переменной-предиктора. Существует два популярных подхода для таких автоматических преобразований мощности: Преобразование Бокса-Кокса и Преобразование Йео-Джонсона. Лямбда известен как гиперпараметр, который используется для управления характером преобразования мощности, а также является лучшим подходом для преобразования переменной в гауссовское распределение вероятностей. Ниже приведены некоторые общие значения лямбда:

  • Процесс Преобразование дискретизации [6] преобразует количественные
    данные в качественные, то есть из числовых атрибутов
    в дискретные или номинальные атрибуты с конечным числом
    интервалов, получение неперекрывающегося раздела непрерывного домена. Как для пользователей, так и для экспертов отдельные функции легче понять, использовать и объяснить. На практике дискретизацию можно рассматривать как метод сокращения данных, поскольку он отображает данные из огромного спектра
    числовых значений в значительно сокращенное подмножество дискретных значений, что делает обучение более точным и быстрым. Методы дискретизации включают в себя множество методологий, таких как бининг, гистограмма, кластер, дерево решений, корреляция и т. Д. Примечание. В линейно неразделимых наборах данных дискретизация признаков увеличивает производительность модели линейных классификаторов. Однако в линейно разделяемом наборе данных дискретизация признаков снизит производительность модели линейных классификаторов (для получения дополнительной информации вы можете проверить здесь)

Экспериментируйте с набором данных Boston Housing

В этом руководстве я буду использовать набор данных Boston Housing, который содержит информацию о различных домах в Бостоне. Есть 506 образцов и 13 переменных характеристик. Цель состоит в том, чтобы спрогнозировать цены на дом, используя данные характеристики. Во-первых, это импорт и загрузка данных.

import pandas as pd 
DATASET_URL = "https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv"
# read data
DATA_FILENAME = "Boston_Housing.csv"
TARGET_COLUMN = 'medv' 
dataframe = pd.read_csv(DATASET_URL)
dataframe.head()

Проверить распределение входной функции

dataframe.drop('medv', axis=1).hist();

Базовая модель

Далее я создам простую линейную модель для прогнозирования цен на дом.

Затем я загружаю входные и выходные данные в набор данных PyTorch и обучаю модель.

После тренировки 10 эпох результат будет таким, как показано ниже.

Квантильные преобразования

Затем я воспользуюсь квантильными преобразованиями, чтобы сделать числовые переменные более гауссовскими. Я могу применить преобразование Quantile с помощью класса QuantileTransformer в sklearn и установить для аргумента output_distribution значение normal. Я также должен установить аргумент n_quantiles на значение, меньшее, чем количество наблюдений в обучающем наборе данных, в данном случае 100.

from sklearn.preprocessing import QuantileTransformer 
transformer = QuantileTransformer(n_quantiles=100, output_distribution='normal')
inputs = transformer.fit_transform(inputs_raw)

После преобразования входной переменной в нормальное распределение вероятностей с помощью квантильных преобразований входное распределение выглядит как на этом рисунке.

Затем я использую ту же линейную модель, что и выше, для прогнозирования цен на дом в Бостоне.

Примечание. После преобразования входных данных с помощью техники преобразования я могу установить более высокую скорость обучения (в данном случае скорость обучения = 1e-2), чтобы ускорить сходимость до глобального минимума. Для необработанных данных, если скорость обучения установлена ​​слишком высокой, мы столкнемся с ошибкой несходимости.

После тренировки 10 эпох результат будет таким, как показано ниже.

Преобразования мощности

В этой демонстрации я использовал технику Преобразования Бокса-Кокса из Силовых преобразований.

Примечание. Преобразование Бокса-Кокса предполагает, что значения входной переменной, к которой оно применяется, строго положительны. Это означает, что 0 и отрицательные значения использовать нельзя (в этом случае я могу использовать Преобразование Йео-Джонсона). Во входном наборе данных у меня есть отрицательные данные, поэтому я должен использовать преобразование MixMaxScaler перед подачей в преобразование Бокса-Кокса.

from sklearn.preprocessing import PowerTransformer, MinMaxScaler 
transformer = PowerTransformer(method='box-cox')
pipeline = Pipeline(steps=[('s', scaler),('t', transformer)])
scaler = MinMaxScaler(feature_range=(1, 2)) 
inputs = pipeline.fit_transform(inputs_raw)

Теперь входное распределение выглядит как на этом рисунке.

Опять же, я буду использовать ту же линейную модель, что и выше, с 10 эпохами.

Преобразование дискретизации

И последнее, но не менее важное: я применю мощную технику трансформации дискретное преобразование. Единое преобразование дискретизации сохранит распределение вероятностей каждой входной переменной, но сделает его дискретным с указанным количеством порядковых групп или меток. Я могу применить преобразование равномерной дискретизации с помощью класса KBinsDiscretizer и установить для аргумента strategy значение uniform. Я также установил количество ящиков, заданное аргументом n_bins, равным 10.

from sklearn.preprocessing import KBinsDiscretizer 
transformer = KBinsDiscretizer(n_bins=10, encode='ordinal', strategy='uniform')
inputs = transformer.fit_transform(inputs_raw)

Распределение входных данных изменится следующим образом

Наконец, я запускаю ту же линейную модель, описанную выше, с 10 эпохами.

Последняя мысль 📋

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

Мир!

использованная литература

[1] Стеф ванБюрен, Гибкое вменение отсутствующих данных, второе издание, CRC Press, 2018.

[2] Суреш Кумар Мухия Усман Ахмед, Практический исследовательский анализ данных с помощью Python: применение методов EDA для понимания, обобщения и исследования ваших данных, Packt Publishing Ltd, 2020.

[3] C.Y. Джоан Пэн, Анализ данных с помощью SAS, Глава 7 | Преобразование данных, 2009.

[4] Амаратунга, Д., Кабрера, Дж. Анализ данных с микрочипов вирусной ДНК. J Amer Statist Assoc 96, 2001.

[5] С. Глузман, В.И. Юкалов, Автомодельные степенные преобразования в задачах экстраполяции, Статистическая механика, 2006.

[6] Хуан Лю, Фархад Хуссейн, Чу Лим Тан и Маноранджан Даш, Дискретизация: способствующая техника, 2002.

[7] Сальвадор Гарсия; Хулиан Луенго; Хосе Антонио Саес; Виктория Лопес; Франсиско Эррера, Обзор методов дискретизации: таксономия и эмпирический анализ в обучении с учителем, 2013.