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

Для текущей реализации мы будем использовать метод градиентного спуска.

Итак, приступим прямо к реализации. Теоретическое и математическое объяснение линейной регрессии можно найти в моих предыдущих блогах.

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as mpl
%matplotlib inline

Закодируйте Функцию стоимости для модели.

Функция стоимости — это мера того, насколько неверна модель с точки зрения ее способности оценивать взаимосвязь между X и Y.

Обычно это выражается как разница или расстояние между прогнозируемым значением и фактическим значением.

Таким образом, функция стоимости может быть записана в виде:

#Cost function for the linear regression
def costFunction(theta,xs,y):
  J = 0.
  for i in range(1,len(y)):
    J = J + (1/(2*len(y)))*((np.dot(xs,theta)-y[i]))**2
    return J

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

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

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

#Function to get the proper values of theta using gradient descent algorithm
def gradientDescent(xs, y, theta, alpha, m, iterations):
    xTrans = xs.transpose()
    for i in range(0, iterations):
        hypothesis = np.dot(xs, theta)
        loss = hypothesis - y
        #cost = np.sum(loss ** 2) / (2 * m)
        #print("Iteration %d | Cost: %f" % (i, cost))
        gradient = np.dot(xTrans, loss) / m
        theta = theta - alpha * gradient
    return theta

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

#Plot a line for the given slope and intercept
def drawLine(slope, intercept):
    axes = mpl.gca()
    x_vals = np.array(axes.get_xlim())
    y_vals = intercept + slope * x_vals
    mpl.plot(x_vals, y_vals, 'g--')

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

#Implementation according to the mathematical model
train_data=pd.read_csv("train.csv")
xs=pd.DataFrame({'x0':1.,'x':train_data.X})
x=train_data.X.values
y=train_data.Y.values
mpl.plot(x,y,'rx')

Затем мы должны использовать ранее написанную функцию стоимости и функцию градиентного спуска к нашим текущим обучающим данным, чтобы получить правильное значение тета, а затем подогнать к нему линию. Также была визуализирована с использованием сгенерированных параметров и функции drawLine(slope, intercept), которую мы написали ранее.

theta=pd.DataFrame({'theta':[0.]*2})
thetaT=theta.T
numIterations= 10000
m, n = np.shape(xs)
alpha = 0.0005
theta = np.ones(n)
theta = gradientDescent(xs, y, theta, alpha, m, numIterations)
print(theta)
drawLine(theta[1],theta[0])

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

test_data=pd.read_csv("test.csv")
xstest=pd.DataFrame({'x0':1.,'x':test_data.X})
m, n = np.shape(xstest)
xtest=test_data.X.values
ytest=test_data.Y.values
ycompute=np.dot(xstest,theta)
loss=ycompute-ytest
print("Average error in the test data is %f"%np.mean(loss))

Для текущих точек данных средняя ошибка оказывается 0,356289, что довольно много.

Итак, это реализация линейной регрессии. Для справки посетите github repo.

Спасибо за чтение.