在Python中实现利用梯度下降优化的多变量线性回归

机器学习的大多数实际应用涉及目标结果所依赖的多个特征。类似地,在回归分析问题中,存在目标结果取决于许多特征的情况。多变量线性回归是解决此类问题的方案之一。在本文中,我将讨论利用Python来实现多变量(多特征)线性回归在实际问题上的应用和性能分析。

由于它是一种线性回归技术,因此在假设的框架中只会采用每个特征的线性项。设,X1,X2,... X_n是目标结果所依赖的特征。多变量线性回归的等式可以写成:

在Python中实现利用梯度下降优化的多变量线性回归

其中θ0,θ1,θ2,...,θn是参数

此外,上述假设也可以用Vector Algebra重新构建:

在Python中实现利用梯度下降优化的多变量线性回归

还存在与假设相关联的成本函数(或损失函数),其取决于参数θ0,θ1,θ2,...,θn

成本函数与多项式回归[1]的情况相同

因此,这些参数θ0,θ1,θ2,...,θn必须假设成本函数达到其可能的最小值。也就是说必须找出成本函数的最小值。

在这种情况下,批量梯度下降可作为优化策略。

使用批量梯度下降(BGD)实现多变量线性回归:

通过创建3个模块来完成实现,每个模块用于在训练过程中执行不同的操作。

=> hypothesis():它是计算和输出目标变量的假设值的函数,给定θ(θ0,θ1,θ2,...,θn),矩阵中的特征,在X的维度中 [m X (n + 1)]中m是样本数,n是特征数。实现hypothesis()的方式为:

def hypothesis(theta, X, n):
 h = np.ones((X.shape[0],1))
 theta = theta.reshape(1,n+1)
 print(X[0].shape)
 for i in range(0,X.shape[0]):
 h[i] = float(np.matmul(theta, X[i]))
 h = h.reshape(X.shape[0])
 return h

在Python中实现利用梯度下降优化的多变量线性回归

=> BGD():它是执行批量梯度下降算法的函数,它采用θ的当前值(θ0,θ1,...,θn),学习率(α),迭代次数(num_iters),假设所有样本的值列表(h),特征集(X),目标变量集(y)和特征数(n)作为输入和输出优化的θ(θ0,θ1,...,θn)和成本函数在所有迭代中的值。BGD()的实现如下:

def BGD(theta, alpha, num_iters, h, X, y, n):
 cost = np.ones(num_iters)
 for i in range(0,num_iters):
 theta[0] = theta[0] - (alpha/X.shape[0]) * sum(h - y)
 for j in range(1,n+1):
 theta[j] = theta[j] - (alpha/X.shape[0]) * 
 sum((h-y) * X.transpose()[j])
 h = hypothesis(theta, X, n)
 cost[i] = (1/X.shape[0]) * 0.5 * sum(np.square(h - y_train))
 theta = theta.reshape(1,n+1)
 return theta, cost

在Python中实现利用梯度下降优化的多变量线性回归

=> linear_regression():它是主要函数,它将特征矩阵(X),目标变量向量(y),学习率(α)和迭代次数(num_iters)作为输入并输出最终优化的θ,即成本函数在批量梯度下降后几乎达到最小值的[ θ0,θ1,θ2,...,θn ] 的值,并存储每次迭代的成本值。

def linear_regression(X, y, alpha, num_iters):
 n = X.shape[1]
 one_column = np.ones((X.shape[0],1))
 X = np.concatenate((one_column, X), axis = 1)
 # initializing the parameter vector...
 theta = np.zeros(n+1)
 # hypothesis calculation....
 h = hypothesis(theta, X, n)
 # returning the optimized parameters by Gradient Descent...
 theta, cost = BGD(theta,alpha,num_iters,h,X,y,n)
 return theta, cost

在Python中实现利用梯度下降优化的多变量线性回归

现在,让我们继续讨论多变量线性回归在实际实践数据集中的应用。

让我们尝试解决一些住房价格数据集。它包含房屋的大小和卧室的数量作为房屋的特征,价格作为目标变量。

考虑到房屋的大小和卧室的数量,分析并预测房屋的可能价格

数据读入Numpy数组

data = np.loadtxt('data2.txt', delimiter=',')
X_train = data[:,[0,1]] #feature set
y_train = data[:,2] #label set

在Python中实现利用梯度下降优化的多变量线性回归

特征规范化或特征缩放

这涉及到扩展特性以实现快速高效的计算。

在Python中实现利用梯度下降优化的多变量线性回归

标准特征缩放策略

其中u是平均值,sigma是标准偏差:

在Python中实现利用梯度下降优化的多变量线性回归

功能扩展的实现:

mean = np.ones(X_train.shape[1])
std = np.ones(X_train.shape[1])

for i in range(0, X_train.shape[1]):
 mean[i] = np.mean(X_train.transpose()[i])
 std[i] = np.std(X_train.transpose()[i])
 for j in range(0, X_train.shape[0]):
 X_train[j][i] = (X_train[j][i] - mean[i])/std[i]

在Python中实现利用梯度下降优化的多变量线性回归

在Python中实现利用梯度下降优化的多变量线性回归

  1. 房屋大小的平均值:2000.6808。
  2. 特征卧室数:3.1702。
  3. 标准偏差:7.86202619e + 02
  4. 标准偏差:7.52842809e-01
# calling the principal function with learning_rate = 0.0001 and 
# num_iters = 300000
theta, cost = linear_regression(X_train, y_train,
 0.0001, 300000)

在Python中实现利用梯度下降优化的多变量线性回归

在Python中实现利用梯度下降优化的多变量线性回归

多变量线性回归后的θ

在批量梯度下降迭代过程中降低了成本。用曲线的显示了成本的降低。

import matplotlib.pyplot as plt
cost = list(cost)
n_iterations = [x for x in range(1,300001)]
plt.plot(n_iterations, cost)
plt.xlabel('No. of iterations')
plt.ylabel('Cost')

在Python中实现利用梯度下降优化的多变量线性回归

在Python中实现利用梯度下降优化的多变量线性回归

多元线性回归中使用BGD的成本最小化线性曲线表示

利用三维散点图对特征和目标变量的实际和预测进行并行可视化:

=>实际目标变量可视化:

from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D

sequence_containing_x_vals = list(X_train.transpose()[0])
sequence_containing_y_vals = list(X_train.transpose()[1])
sequence_containing_z_vals = list(y_train)

fig = pyplot.figure()
ax = Axes3D(fig)

ax.scatter(sequence_containing_x_vals, sequence_containing_y_vals,
 sequence_containing_z_vals)
ax.set_xlabel('Living Room Area', fontsize=10)
ax.set_ylabel('Number of Bed Rooms', fontsize=10)
ax.set_zlabel('Actual Housing Price', fontsize=10)

在Python中实现利用梯度下降优化的多变量线性回归

=>预测目标变量可视化:

# Getting the predictions...
X_train = np.concatenate((np.ones((X_train.shape[0],1)), X_train)
 ,axis = 1)
predictions = hypothesis(theta, X_train, X_train.shape[1] - 1)

from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D

sequence_containing_x_vals = list(X_train.transpose()[1])
sequence_containing_y_vals = list(X_train.transpose()[2])
sequence_containing_z_vals = list(predictions)

fig = pyplot.figure()
ax = Axes3D(fig)

ax.scatter(sequence_containing_x_vals, sequence_containing_y_vals,
 sequence_containing_z_vals)
ax.set_xlabel('Living Room Area', fontsize=10)
ax.set_ylabel('Number of Bed Rooms', fontsize=10)
ax.set_zlabel('Housing Price Predictions', fontsize=10)

在Python中实现利用梯度下降优化的多变量线性回归

在Python中实现利用梯度下降优化的多变量线性回归

实际房价与预测房价

技术性能分析:

  1. 平均绝对误差:51502.7803(价格)
  2. 均方误差:4086560101.2158(价格)
  3. 均方根误差:63926.2082(价格)
  4. R-Square得分:0.7329

需要注意的一点是,平均绝对误差,均方误差和均方根误差不是没有单位的。为了使其无单位,在对模型进行训练之前,目标标签可以按照相同的方式进行缩放,特征也可以进行缩放。除此之外,还获得了0.7349的下降R-Square-Score。

这就是用梯度下降法在Python中实现多元线性回归的内容。

相关推荐