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

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

Но знаем ли мы, как работают эти модели? Каковы их цели? И если библиотечная реализация конкретной модели не соответствует нашим потребностям, знаем ли мы, как ее изменить?

Размышляя над этими вопросами, я понял, что мотивация написать серию постов пришла ко мне.

Из этого поста вы узнаете:

  1. Что такое линейная регрессия?
  2. Что такое градиентный спуск?
  3. Как реализовать линейную регрессию с нуля только с помощью NumPy.

Введение

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

Итак, чтобы начать эту серию сообщений, я начну показывать вам, как вы можете построить свою модель линейной регрессии с нуля, используя только Python Numpy.

Линейная регрессия

В линейной регрессии мы хотим спрогнозировать непрерывное значение, используя в качестве входных данных некоторые значения «X».

Формула простой линейной регрессии:

Y = aX + b

«Y» - зависимая переменная, «X» - независимая переменная, «b» - наклон линии, «a» - переменная пересечения, другими словами, значение «Y», когда «X» равно нулю. В линейной регрессии мы хотим найти значения «a» и «b», которые минимизируют ошибки прогнозирования.

Как я узнаю, что могу использовать линейную регрессию?

Один из самых простых способов проверить, подходит ли линейная регрессия для использования, - это построить диаграмму рассеяния данных. Диаграмма рассеяния - это простой график, на котором для рисования точек (X, Y) используются декартовы координаты.

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

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

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

Функция затрат

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

Но если наше значение «» меньше, чем значение «y», ошибка уменьшится, и это будет не то поведение, которое нам нужно. Итак, чтобы избежать такого поведения, мы можем получить абсолютное значение уравнения или возвести уравнение в квадрат.

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

Эта формула называется среднеквадратической ошибкой (MSE).

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

Градиентный спуск

Градиентный спуск - это метод, используемый для нахождения минимума функции. В линейной регрессии мы будем использовать градиентный спуск, чтобы найти значения «a» и «b», которые минимизируют функцию стоимости.

Градиентный спуск описан на изображении ниже. Сначала мы начинаем со случайных значений «a» и «b», а начальная ошибка - это место, где вытаскивается мяч.

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

Кроме того, мы не хотим делать крошечные шаги, которые потребуют слишком много времени для достижения дна. Итак, нам нужна ступенька как раз подходящего размера. Этот размер шага регулируется фактором, называемым скоростью обучения (L). Обычно L представляет собой небольшое значение, например 0,0001.

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

1- Замените ÿ на ax + b

2- Вычислить частную производную по «а»

3- Рассчитайте частную производную по «b»

4- Обновляйте значения «a» и «b» на каждой итерации.

5- Наконец, повторите этот процесс m раз или до тех пор, пока ошибка не станет меньше некоторого допуска.

Реализация на Python

Импорт необходимых библиотек.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from warnings import warn

Функция для реализации линейной регрессии

Чтобы реализовать линейную регрессию, мы

  1. Начните с установки «a» и «b» на ноль и получения количества точек «n».
  2. Получите прогнозы
  3. Получите производные от «a» и «b»
  4. Обновите коэффициенты «a» и «b».
  5. Получите ошибку
  6. Повторяйте этот процесс до тех пор, пока i не станет меньше эпохи или пока ошибка не станет меньше допуска.
  7. Вернуть обновленные «a» и «b»

Этот фрагмент кода проверяет, расходится ли градиентный спуск.

Чтобы проверить, работает ли этот код должным образом, я использовал Погодные условия в наборе данных Kaggle времен Второй мировой войны, чтобы посмотреть, могу ли я подобрать линейную регрессию для объяснения взаимосвязи между MinTemp и MaxTemp.

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

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

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

Https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931