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-