В текущем блоге мы увидим, как применить линейную регрессию к набору данных с нуля.
Для текущей реализации мы будем использовать метод градиентного спуска.
Итак, приступим прямо к реализации. Теоретическое и математическое объяснение линейной регрессии можно найти в моих предыдущих блогах.
Изначально импортируйте все необходимые библиотеки
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.
Спасибо за чтение.