ML с нуля - полиномиальная регрессия с использованием PyTorch

Полное руководство по кодированию модели полиномиальной регрессии и математике, стоящей за ней

Когда дело доходит до прогнозного анализа, регрессионные модели оказываются одним из самых экономичных методов. Хотя модель линейной регрессии может обеспечить некоторые хорошие прогнозы, в некоторых случаях модели полиномиальной регрессии могут значительно превосходить простые линейные модели. В следующем проекте мы рассмотрим, как создать модель полиномиальной регрессии в PyTorch с нуля.

Цели проекта

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

Мы создадим модель полностью с нуля, используя базовые тензорные операции PyTorch.

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

Импорт зависимостей проекта

Прежде чем мы начнем работу над проектом, давайте импортируем все необходимые библиотеки и функции.

Теперь давайте импортируем набор данных.

Вот ссылка на набор данных, если вы планируете работать с ним самостоятельно.

Я также свяжу репозиторий GitHub с записной книжкой проекта и набором данных в конце этой статьи.

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

Преодоление данных

Теперь давайте проанализируем данные и посмотрим, нужно ли их очистить или изменить. Сначала давайте проверим тип данных каждого столбца фрейма данных.

* Следует отметить, что в наборе данных нет нулевых значений.

Как мы видим, некоторые данные относятся к типу «int64», а некоторые - к типу «float64». Поскольку мы будем работать с тензорами, нам может потребоваться единый тип данных во всем наборе функций. В результате мы преобразуем весь фрейм данных в «float64» на более позднем этапе.

Теперь мы посмотрим на описательный анализ фрейма данных.

Как видим, данные в разных столбцах существенно различаются по масштабу. В нашем наборе данных есть элементы порядка 1e + 0 в нижнем диапазоне и элементы порядка 1e + 3 в верхнем диапазоне. Возможно, мы захотим нормализовать данные. Мы разберемся с этим на более позднем этапе нашего проекта.

Выбор функции

Давайте сначала построим график каждой независимой переменной по отношению к целевой переменной (качество).

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

Из приведенного выше визуального анализа ясно видно, что размер двигателя (++ 0,87), снаряженная масса (+0,84) и лошадиные силы (+0,81) показывают очень сильную корреляцию с зависимой переменной ценой.

Показатели carwidth (0,76), citympg (-0,69), trafficmpg (-0,70) и carlength (0,68) относительно более сильная корреляция. Итак, в этом примере мы выберем эти 7 в качестве наших тренировочных функций.

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

Если мы внимательно рассмотрим графики, то заметим, что параметры размер двигателя, снаряженная масса, мощность, длина автомобиля и ширина автомобиля есть график типа y = x2.

С другой стороны, citympg и HighwayMPG имеют график типа y = 1 / x2.

Так что мы будем разбираться с этими функциями соответственно.

Создание модели с нуля

Ниже приведены формулы, по которым будет работать наша модель полиномиальной регрессии.

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

Здесь,

  • ŷ - прогнозируемые значения целевой переменной.
  • W - это матрица размером 1 x m, содержащая все веса, связанные с каждой полиномиально преобразованной зависимой переменной.
  • X - транспонирование матрицы, содержащей все полиномиально преобразованные переменные признаков.
  • B - матрица (1 x m), каждый элемент которой является значением смещения нашей функции.
  • m - количество строк в обучающем / тестовом наборе.
  • n - количество полиномиально преобразованных функций.

Давайте теперь преобразуем функцию (объект Pandas Dataframe) и цель (объект Pandas Series) в тензорные объекты, чтобы мы могли использовать их для обучения нашей модели с PyTorch.

Теперь для функций с функцией активации типа y = x2 мы сначала создаем функции x2, а затем присоединяем их к нашему тензорному объекту.

Теперь для функций с функцией активации типа y = 1 / x2 мы сначала создаем функции 1 / x2, а затем присоединяем их к нашему тензорному объекту.

Этим мы полиномиально трансформировали наши черты.

Теперь, наконец, мы объединим все преобразованные тензоры признаков в один тензорный объект.

Масштабирование функций

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

В этом проекте мы будем выполнять масштабирование от минимума до максимума. Нормализация min-max преобразует данные таким образом, что все значения находятся в диапазоне [0,1].

Математическая формула для нормализации min-max выглядит следующим образом:

Здесь,

  • X = наблюдаемое значение
  • X min = минимальное значение, наблюдаемое в столбце.
  • X max = максимальное значение, наблюдаемое в столбце.
  • X масштабированное = масштабированное значение

Теперь давайте выполним минимальную и максимальную нормализацию нашего набора функций.

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

Теперь давайте инициализируем случайное смещение для нашей модели.

Наконец, преобразуйте целевой массив в тензор.

Теперь давайте определим функцию регрессии.

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

После запуска функции MSE для нашей модели -

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

Оптимизация модели

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

Для получения дополнительной информации о SGD посетите эту ссылку.

В нашей модели мы будем использовать встроенные в PyTorch функции вычисления градиента для вычисления и обновления весов и смещений.

После всего этого мы, наконец, запустим функцию оптимизатора для нашей модели.

Теперь, чтобы проверить точность нашей модели, мы рассчитаем ее оценку r-квадрат. Ниже приводится формула для оценки r2.

Теперь давайте проверим производительность нашей модели. Мы будем использовать обновленные модели и веса, полученные нашей функцией оптимизатора.

Как мы видим, наша модель полиномиальной регрессии может объяснить около 83–84% дисперсии зависимой переменной. Это достаточно эффективная модель.

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

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

Из приведенных выше графиков мы видим, что наша модель работает довольно хорошо.

На этом мы подошли к концу нашего проекта. Чтобы увидеть больше интересных проектов, подобных этому, загляните в мой профиль.

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

Нажмите это, следите за новостями и следите за новостями о машинном обучении!

Ссылка на репозиторий GitHub для набора данных и записной книжки Jupyter-