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

Простая линейная регрессия

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

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

Приведенное выше уравнение называется простым линейным уравнением. Он называется простым, потому что выход зависимой переменной y является функцией только одной независимой переменной x. В то время как m и b являются константами, обычно называемыми наклоном и точкой пересечения. В терминах машинного обучения y называются метками, а x называются функциями. Когда вы передаете значение как функцию x, метка y будет давать значение, которое линейно пропорционально x, оно будет взвешено по наклону m, умноженному на x, плюс точка пересечения b. Вы можете рассматривать перехват b как значение y по умолчанию, если в функцию не было никакой функции x (x равно нулю). Если вы поднимете x, то y будет расти линейно, если вы уменьшите x, произойдет обратное, то y уменьшится линейно.

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

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

Вам может быть интересно, а какой будет балл за тест, если студент потратил на обучение 3,5 часа, а может быть, 10 часов обучения? Это тип вопросов, простая линейная регрессия готова ответить… или предсказать. Проще говоря, задачи простой линейной регрессии таковы:

Простая линейная регрессия – это попытка подогнать наборы данных к простому линейному уравнению, найдя оптимальный наклон m и точку пересечения b по известным функциям. x и известные метки y.

После определения оптимального значения наклона m и точки пересечения b прогнозируемые метки для всех наборов данных yi в зависимости от признаков xi равны

Затем будут даны ответы на вопросы о том, что такое тестовый балл учащегося y за любое количество часов, потраченных на обучение x. .

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

Чтобы найти оптимальное значение наклона m и точки пересечения b, вам нужно понять градиентный спуск. Градиентный спуск – это метод оптимизации, основанный на функции стоимости. Существует много типов функций стоимости, вы собираетесь использовать эту функцию:

где;

J = функция стоимости

ш=вес

б = смещение

y=фактическое значение (известная метка)

y (шляпа) = предсказанное значение (предсказанная метка)

Это среднее значение квадрата различий между известными (y) и прогнозируемыми метками (y hat), обычно называемое среднеквадратичными ошибками — MSE.

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

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

В исчислении минимальное значение функции — это когда ее градиент равен нулю, или, в геометрическом смысле, градиент с самой плоской линией наклона кривой (см. рисунок выше). Итак, чтобы вычислить оптимальный вес и смещение, вам нужен градиент функции стоимости относительно веса и смещения:

для простого линейного уравнения

Теперь, когда вы нашли градиенты функции стоимости, чтобы достичь минимального значения функции стоимости, вам придется настраивать вес и смещение от начального значения до тех пор, пока вы не достигнете оптимального значения, которое дает минимальное значение функции стоимости. Это означает, что вам нужно будет изменять значение веса и смещения итеративно. Но насколько изменились вес и уклон? У вас есть градиенты, но как градиенты связаны с весом и смещением?

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

Теперь вам может быть интересно, сойдутся ли эти приближения? другими словами, будут ли найдены вес и смещение до определенного числа итераций?

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

где альфа — скорость обучения.

Выполнение

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

import numpy as np
class LinearRegression:
    def __init__(self):
        pass
    def fit(self,X,y):
        pass
    def predict(self,X):
        pass

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

## Set the learning rate and number of iterations
def __init__(self,learning_rate=0.01,iter=1000):
    self.learning_rate=learning_rate
    self.iter=iter

Затем метод подгонки, именно здесь будет реализован градиентный спуск с помощью следующих шагов (см. комментарии к коду ниже):

def fit(self,X,y):
    #set the initial value for weights and bias
    self.weights=0
    self.bias=0
    #get number of samples features X
    n_samples=length(X)
    #start the iteration
    for i in range(self.iter):
        #predict the known label y
        y_predict=self.weights*X + self.bias
        #calculate the gradients of weights and bias
        grad_w=(2/n_samples)*np.sum(X*(y_predict-y))
        grad_b=(2/n_samples)*np.sum(y_predict-y)
        #update the weights and bias
        self.weight-=grad_w*self.learning_rate
        self.bias-=grad_b*self.learning_rate

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

def predict(self,X):
    return self.weights*X + self.bias

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

X=np.array([1.,2.,3.,4.,5.,6.,7.,8.,9.])
y=np.array([40,43,55,60,68,77,82,86,94])

создать экземпляр и подогнать набор данных

linreg=LinearRegression()
linreg.fit(X,y)

Настройте новые функции и прогнозируйте

new_hours=np.array([1.5,2.3,3.2,4.3,5.1,6.4,7.5,8.2])
predict=linreg.predict(new_hours)

Давайте узнаем, насколько хороша ваша модель, определим функцию для расчета функции стоимости (MSE)

def mean_squared_error(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)
existing=c.predict(X)
mse=mean_squared_error(y,existing)
print(mse)

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

import matplotlib.pyplot as plt
plt.scatter(X,y)
plt.scatter(new_hours,predict)
plt.plot(X,existing)

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

Заключение

В этой статье вы узнали

  1. Важность линейной регрессии в машинном обучении
  2. Основная концепция градиентного спуска
  3. Реализация на Python

Пожалуйста, поделитесь этим постом и похлопайте, если он вам понравился. Для множественной линейной регрессии вы можете проверить этот пост: