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