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

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

Проще говоря, регрессия - это метод, используемый для определения взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. Это позволяет вам понимать закономерности в данных.

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

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

Здесь y - зависимая переменная, theta1 - точка пересечения, theta2 - наклон, а x - независимая переменная. . Оба theta1 и theta2 являются коэффициентами регрессии.

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

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

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

Но что такое подход градиентного спуска?

Градиентный спуск - это итерационный алгоритм оптимизации первого порядка для поиска локального минимума дифференцируемой функции.

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

Наша цель - минимизировать эту функцию стоимости, чтобы мы могли получить наиболее точные значения theta1 и theta2.

Теперь, когда мы знакомы с основами, перейдем к кодированию !!

Не волнуйтесь, шаг за шагом.

Начнем с импорта необходимых библиотек.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

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

Вы можете получить набор данных здесь:



Вот как выглядят наши данные. Довольно просто, правда? В реальных данных нет ничего подобного 😛.

Это изменение заработной платы сотрудника в зависимости от количества лет опыта работы.

Замена имен столбцов на X и Y для удобства:

data=data.rename(columns={data.columns[0]:'X',data.columns[1]:'y'})

Разделение наших данных на обучение и тестирование с помощью train_test_split:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data.X, data.y, test_size=0.20, random_state=42)

Визуализация данных обучения

plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.title('Salary vs Experience (Training Set)')
plt.scatter(X_train,y_train)
plt.show()

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

Определение нашей функции стоимости:

def cost(y,ypred):
    return (1/len(y))*sum(y-ypred)**2

Инициализация параметров:

#Initialize parameters
n = float(len(X_train))
alpha=0.001                    #learning rate
b1=0                           #slope
b2=0                           #intercept

Теперь самое интересное - обучение данных.

epochs=20000
for itr in range(epochs):
       y_pred = b1*X_train + b2  # The current predicted value of y
       D1 = (-2/n) * sum(X_train * (y_train - y_pred)) #Derivative wrt b1
       D2 = (-2/n) * sum(y_train - y_pred)  # Derivative wrt b2
       b1 = b1 - alpha * D1  # Update b1
       b2 = b2 - alpha * D2  # Update b2
      
      error=cost(y_train,y_pred)
     
print("MSE: ",error,'\n')
print (b1,b2)

Посмотрите, какие значения мы получили после обучения данных за 20000 итераций!

Визуализация наших результатов !!

Поздравляю! Мы смогли спрогнозировать наиболее подходящую линию для данных и минимизировать функцию затрат.

Прогнозирование для конкретного тестового случая:

def predict(x):
     return b2+b1*x
predict(1.7)

Результат:

И, глядя на наши данные, есть смысл получить этот ответ.

Итак, мы закончили с нашей реализацией градиентного спуска, и уравнение наиболее подходящей линии, которое мы получили, выглядит следующим образом:

Вот и все. Мы сделали это!!

Надеюсь, эта статья была для вас полезной. Сообщите мне, если вы обнаружите какие-либо ошибки. Не стесняйтесь обращаться ко мне по любым вопросам. Удачного обучения !! 😊

Вы можете найти код в моем профиле Github:



Некоторые полезные ресурсы:

  1. Https://www.youtube.com/watch?v=sDv4f4s2SB8 (Градиентный спуск от StatQuest)
  2. Https://towardsdatascience.com/understanding-the-mat Mathematics-behind-gradient-descent-dde5dc9be06e
  3. Https://mubaris.com/posts/linear-regression/
  4. Https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931
  5. Https://www.coursera.org/learn/machine-learning (курс машинного обучения, автор Эндрю Нг)

Свяжитесь со мной:

LinkedIn: https://www.linkedin.com/in/somya22/

Почта: [email protected]