В этом уроке вы можете узнать, как работает алгоритм линейной регрессии, и реализовать его с нуля на python, используя Gradient Descent.

В статистике линейная регрессия — это линейный подход к моделированию взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. Пусть X — независимая переменная, а Y — зависимая переменная. Основная цель линейной регрессии — найти линию/плоскость, которая лучше всего соответствует точкам данных.

мы знаем уравнение прямой y=mx+c, аналогично уравнение плоскости можно записать в виде

для простоты возьмем Wt=m и W0=c,

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

но мы предпочитаем использовать среднеквадратичную ошибку (MSE), а не SSE, в которой мы берем среднее значение суммы квадратов ошибок по следующим причинам:

  1. MSE можно использовать для сравнения производительности модели в наборах данных разного размера (обучение, тест и т. д.). SSE сильно зависит от размера данных (более высокое n, более высокое SSE) и поэтому не может использоваться для сравнения производительности между различными n размеры.
  2. обратите внимание, что по мере роста N функция стоимости SSE тоже растет, как и ее градиент. И наоборот, хотя значение функции стоимости MSE также может возрастать с увеличением N, она не растет так быстро, как функция стоимости SSE, поэтому ее градиенты также растут медленно.

следовательно, функция потерь для линейной регрессии получается:

Здесь yᵢ — фактическое значение, а ȳᵢ — прогнозируемое значение. Подставим значение ȳᵢ:

здесь, в уравнении, мы видим, что yᵢ и xᵢ зависят от данных, поэтому для оптимизации уравнения мы должны минимизировать m и c, чтобы найти наилучшую линию соответствия.

Чтобы найти лучшие m и c, мы используем градиентный спуск.

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

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

Шаги и реализация линейной регрессии с нуля

Инициализируйте веса и смещение до 0

обратите внимание, что в коде мы берем m =w (веса) и c=b(смещение)

def initialize_weights(shape):
  
 b = 0
 w = np.zeros_like(X_train[0])
 return w,b

Определите функцию потерь

def MSE(y_actual,y_pred):
  """This function calculates the loss of the target columns using log loss function
     y_actual:actual target value
     y_pred:Predicted target value
  """
  loss=np.square(np.subtract(y_actual,y_pred)).mean() 
  return loss

Определите функцию, которая возвращает дифференцированные значения w и b

def gradient_wrtb(X,y,w,b,n):
"""This function return a the value of logloss differentiated with respect to the bias
     X:value of independent variables
     y:value of target
     w:weight 
     b:bias
     n: number of records
     """
  
  gradient_db =(-2/n)*(y-(np.dot(w.T,X)+b))
  return gradient_db

def gradient_wrtw(X,y,w,b,n):
  
  """This function returna the value of logloss differentiated with respect to the weight
     X:value of independent variables
     y:value of target
     w:weight 
     b:bias
     n:number of records
     """
  gradient_dw = (-2/n)*X*(y-(np.dot(w.T, X )+ b))
  return gradient_dw

Определите функцию прогнозирования

def prediction(X,w,b):
  """This function returns the Predicted value of y 
     X:value of independent variables
     w:weight 
     b:bias
  """
  predictions = []
  for i in range(len(X)):
    z = np.dot(w, X[i]) + b
    predictions.append(z)
  return predictions   

Основная функция линейной регрессии

def linear_regression(X_train,y_train,X_test,y_test,epochs,LR,batch_size = 1):
    
    ''' In this function, we will implement linear regression
    X_train:Training Input Dataset
    y_train:Training Output Dataset
    X_test:Testing Input Dataset
    y_test:Testing Output Dataset
    epochs:No of epochs or iterations to fit the best weights
    LR:Learning Rate for Gradient Descent
    batch_size:Batch Size to implement SGD 
    '''
    N = float(len(X_train))
    train_loss = []
    test_loss = []
    w, b = initialize_weights(X_train[0])
    for i in range(epochs):
      
      for i in range(0,len(X_train),batch_size):
          dw = gradient_wrtw(X_train[i],y_train[i],w,b,len(X_train))
          db = gradient_wrtb(X_train[i],y_train[i],w,b,len(X_train))
          w = w - (LR * dw)
          b = b - (LR * db)
      y_pred_train=prediction(X_train,w,b)
      train_loss.append(MSE(y_train,y_pred_train))
      y_pred_test=prediction(X_test,w,b)
      test_loss.append(MSE(y_test,y_pred_test))
    return w,b,train_loss,test_loss

Пример кода для запуска кода линейной регрессии

import pandas as pd
from sklearn import datasets
from sklearn import model_selection
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report ,plot_confusion_matrix
import numpy as np
import math
import matplotlib.pyplot as plt


salary_data = pd.read_csv("Salary_Data.csv")
X = salary_data['YearsExperience'].tolist()
Y= salary_data['Salary'].tolist()
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=15)

N=len(X_train)
epochs=100000
LR=0.0001
w,b,train_loss,test_loss = linear_regression(X_train,y_train,X_test,y_test,epochs,LR)
y_pred_train = prediction(X_train,w,b)
y_pred_test = prediction(X_test,w,b)
y_pred=prediction(X,w,b)

После запуска модели мы видим, что модель работает хорошо.

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

Найдите набор данных и код здесь: GitHub Project

Есть вопросы? Нужна помощь? Свяжитесь со мной!

Электронная почта: [email protected]

LinkedIn: Ваншика Бансал | LinkedIn