В этом уроке вы можете узнать, как работает алгоритм линейной регрессии, и реализовать его с нуля на python, используя Gradient Descent.
В статистике линейная регрессия — это линейный подход к моделированию взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. Пусть X — независимая переменная, а Y — зависимая переменная. Основная цель линейной регрессии — найти линию/плоскость, которая лучше всего соответствует точкам данных.
мы знаем уравнение прямой y=mx+c, аналогично уравнение плоскости можно записать в виде
для простоты возьмем Wt=m и W0=c,
чтобы найти линию наилучшего соответствия, мы пытаемся минимизировать общую ошибку между фактическим y и предсказанным y, поскольку мы видим, что точки данных могут быть выше и ниже линии, из-за чего разница может быть положительной и отрицательной, что может отменить ошибки, поэтому возводим ошибки в квадрат. это уравнение называется суммой квадратов ошибок:
но мы предпочитаем использовать среднеквадратичную ошибку (MSE), а не SSE, в которой мы берем среднее значение суммы квадратов ошибок по следующим причинам:
- MSE можно использовать для сравнения производительности модели в наборах данных разного размера (обучение, тест и т. д.). SSE сильно зависит от размера данных (более высокое n, более высокое SSE) и поэтому не может использоваться для сравнения производительности между различными n размеры.
- обратите внимание, что по мере роста 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