A. Что такое линейная регрессия?

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

Без лишних слов давайте начнем с вопроса — что такое модель линейной регрессии? Линейная модель делает прогноз, используя взвешенную сумму входных признаков и константу, называемую терминалом смещения (также называемым членом пересечения).

В нормальном виде оно имеет следующее уравнение:

Далее мы можем сократить уравнение до:

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

А.1 Нормальное уравнение

Существует прямое решение, которое дает ответ на вопрос, как минимизировать функцию стоимости. Оно называется нормальным уравнением и выглядит следующим образом:

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

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

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

Теперь, когда мы знаем тета, мы можем использовать ее для предсказаний.

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

A.2 Вычислительная сложность

Вычислительная сложность линейной регрессии с нормальным уравнением обычно составляет от O(n2,4) до O(n 3). Если мы получим очень большой набор функций, например, 100 000, нормальное уравнение станет очень медленным. На другом сайте уравнение является линейным, поэтому оно хорошо обрабатывает большие обучающие наборы при условии, что они могут поместиться в память. Кроме того, как только модель обучена, новые прогнозы выполняются очень быстро.

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

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

Хороший способ понять градиентный спуск — представить, что вы находитесь на вершине горы в густом тумане и хотите спуститься вниз. Вы можете чувствовать только наклон земли под ногами. Чтобы быстро добраться до дна долины, хорошей стратегией является спуск в направлении самого крутого склона. Это именно то, что делает градиентный спуск. Он измеряет локальный градиент функции ошибки относительно вектора параметров θ и движется в направлении убывающего градиента. Как только градиент равен нулю, вы достигли минимума.

Вы инициализируете θ как случайные значения, а затем улучшаете шаг за шагом, пытаясь уменьшить функцию стоимости.

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

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

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

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

B.1 Пакетный градиентный спуск

Чтобы рассчитать GD, нам нужно вычислить градиент функции стоимости по каждому параметру θj. Для этого нам нужны частные производные. Мы можем вычислять одну производную за раз, а можем вычислять их все за один раз.

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

Простая реализация на Python выглядит так:

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

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

B.2 Стохастический градиентный спуск

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

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

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

B.3 Мини-пакетный градиентный спуск

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

C. Полиномиальная регрессия

Есть один случай, когда данные на самом деле более сложны, чтобы вписаться в линейную регрессию. В этом случае мы должны использовать полиномиальную регрессию, которая добавляет мощности каждой функции как новой функции. В Scikt-learn есть класс PolynominalFeature, который позволяет использовать эту технику для данных. После того, как мы преобразовали данные, мы можем использовать линейную регрессию, чтобы идеально подогнать данные.