在Python中实现利用梯度下降优化的多变量线性回归
机器学习的大多数实际应用涉及目标结果所依赖的多个特征。类似地,在回归分析问题中,存在目标结果取决于许多特征的情况。多变量线性回归是解决此类问题的方案之一。在本文中,我将讨论利用Python来实现多变量(多特征)线性回归在实际问题上的应用和性能分析。
由于它是一种线性回归技术,因此在假设的框架中只会采用每个特征的线性项。设,X1,X2,... X_n是目标结果所依赖的特征。多变量线性回归的等式可以写成:
其中θ0,θ1,θ2,...,θn是参数
此外,上述假设也可以用Vector Algebra重新构建:
还存在与假设相关联的成本函数(或损失函数),其取决于参数θ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
=> 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
=> 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
现在,让我们继续讨论多变量线性回归在实际实践数据集中的应用。
让我们尝试解决一些住房价格数据集。它包含房屋的大小和卧室的数量作为房屋的特征,价格作为目标变量。
考虑到房屋的大小和卧室的数量,分析并预测房屋的可能价格
数据读入Numpy数组 :
data = np.loadtxt('data2.txt', delimiter=',') X_train = data[:,[0,1]] #feature set y_train = data[:,2] #label set
特征规范化或特征缩放:
这涉及到扩展特性以实现快速高效的计算。
标准特征缩放策略
其中u是平均值,sigma是标准偏差:
功能扩展的实现:
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]
- 房屋大小的平均值:2000.6808。
- 特征卧室数:3.1702。
- 标准偏差:7.86202619e + 02
- 标准偏差: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)
多变量线性回归后的θ
在批量梯度下降迭代过程中降低了成本。用曲线的显示了成本的降低。
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')
多元线性回归中使用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)
=>预测目标变量可视化:
# 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)
实际房价与预测房价
技术性能分析:
- 平均绝对误差:51502.7803(价格)
- 均方误差:4086560101.2158(价格)
- 均方根误差:63926.2082(价格)
- R-Square得分:0.7329
需要注意的一点是,平均绝对误差,均方误差和均方根误差不是没有单位的。为了使其无单位,在对模型进行训练之前,目标标签可以按照相同的方式进行缩放,特征也可以进行缩放。除此之外,还获得了0.7349的下降R-Square-Score。
这就是用梯度下降法在Python中实现多元线性回归的内容。