机器学习(第2版)
上QQ阅读APP看书,第一时间看更新

2.1.5 线性回归

线性回归(Linear Regression)是一种通过拟合自变量与因变量之间的最佳线性关系,来预测目标变量的方法。回归过程是给出一个样本集,用函数拟合这个样本集,使样本集与拟合函数间的误差最小。生物统计学家高尔顿研究父母和子女身高的关系时发现:即使父母的身高都“极端”高,其子女不见得会比父母高,而是有“衰退”(Regression)至平均身高的倾向。具体地说,回归分析包括以下内容。

(1)确定输入变量与目标变量间的回归模型,即变量间相关关系的数学表达式。

(2)根据样本估计并检验回归模型及未知参数。

(3)从众多的输入变量中,判断哪些变量对目标变量的影响是显著的。

(4)根据输入变量的已知值来估计目标变量的平均值并给出预测精度。

线性回归的类型包括简单线性回归和多元线性回归。简单线性回归使用一个自变量,通过拟合最佳线性关系来预测因变量。多元线性回归使用多个独立变量,通过拟合最佳线性关系来预测因变量。

如何获得回归模型的公式?一元线性回归本质上就是寻找一条直线y=ax+b,使所有样本点都尽量在这条直线上或靠近这条直线。每一个点对应(x,y)坐标,是实际的点,而通过回归公式预测的纵坐标值为y=ax+b,将所有点的预测值与实际值的差取平方后求和,就可以算出这条直线总的误差L(a,b):

(, )L ab =1=i [∑n iy- +iax b 2])(

要想求出公式中的ab值,只需要使得L(a,b)取极小值即可,式中的L(a,b)为关于ab的二元函数。

如何评价回归模型的好坏?通过统计学中的R2(Coefficient of Determination),也称为判定系数、拟合优度、决定系数等,来判断回归方程的拟合程度。R2是如何计算的?首先要明确以下几个概念。

总偏差平方和(Sum of Squares for Total,SST)是每个因变量的实际值(公式中的yi)与其平均值(公式中的)的差的平方和,反映了因变量取值的总体波动情况,其值越大说明原始数据本身具有越大的波动,其公式如下。

SST=n∑(y yi- )2 i=1

例如,用销售额与其平均销售额的差的平方和来表示销售额整体的波动情况,也就是说,这种波动情况是由单个销售额与均值之间的偏差指标SST来表示的。

回归平方和(Sum of Squares for Regression,SSR)是因变量的回归值(由回归方程计算取得,对应公式中的)与其均值(公式中的)的差的平方和,它反映回归直线的波动情况。

SSR=∑n (yˆ yi )2-i=1

例如,回归线表示广告费这个变量对于总销售额的影响,它只能解释广告费带来的影响,这种影响的偏差由SSR来表示。

残差平方和(Sum of Squares for Error,SSE)又称误差平方和,表示因变量的实际值与回归值的差的平方和,它反映了回归方程以外因素的影响,即回归直线无法解释的因素。

SSE=∑n ( i-i yˆ y 2) i=1

例如,广告费只是影响销售额的其中一个比较重要的因素,除了广告费之外,还有其他因素(如产品质量、客户服务水平等)会对销售额产生影响,因此销售额不能用回归线来解释的部分就由SSE来表示。

总的偏差可以用回归方程偏差加上残差偏差来表示,其公式如下,其中SST是总的偏差, SSR是回归平方和,即回归方程可以表示的偏差,SSE是回归方程不能表示的偏差。

SST = SSR + SSE

回归方程拟合程度的好坏是看这条回归线能够多大程度解释目标值(如销售额)的变化,一般采用R2指标来计算:

R =2 SST SSR 1= -SST SSE

R2的取值为[0,1],从其定义可见,其越接近1,拟合程度越好。当R2为1时表示回归方程可以完全解释因变量的变化。如果R2很低,说明因变量和目标变量之间可能并不存在线性关系。

调整R2是指对R2进行修正后的值,对非显著性变量给出惩罚,它没有R2的统计学意义,与实际样本的数值无关,与R2相比,其误差较少,是回归分析中重要的评价指标,其值越大说明模型效果越好。

因变量预测标准误差是指因变量的实际值与预测值的标准误差,其值越小说明模型的准确性越高,代表性越强,拟合性越好。

F 值在方差分析表中查看,用于检测回归方法的相关关系是否显著。如果显著性水平 Sig指标大于0.05,表示相关性较弱,没有实际意义。如果发现模型的Sig指标低于0.05,但是各自变量的Sig指标均超过0.05,就需要应用t检验查看回归系数表中各变量的显著性水平,可能是自变量之间出现了共线性问题,需要通过逐步回归的方法将显著性较差的自变量剔除。

假设n为实际样本数量,可能有部分数据为空值或其他异常值,导致模型的实际拟合样本数较少。如果发现其值较大,需要对数据重新进行预处理。

多元线性回归方程公式为:

y=β 0+β1x1+β2x2+…+βkxk+u

要求每个xi是相互独立的,其中βi表示回归系数,u为随机误差。

给定n个样本数据(x1i,x2i,…,xki;yi)代入多元线性回归方程:

1y y 0β β= +2 0β β= +x x 1 11 1 12+ x x 2 21β 1x x k kβ……+ + +1u 2 22β+2k kβ+ + +2u xny 0β β= +⋮1 1n nx2 2β+ …+ + xk knβ +nu

转换成矩阵表达形式:

Y =Xβ+u ×n n1y 2Y=⋮1y y X=n2n1x x1⋮ ⋮ ⋮2212 x x x x 1 1 2111………( 1)× +kn n kx⋮2k x x k1=β+ ×k (k 1) 1β⋮1 0β β ×n n1u u=⋮2 u u 1

由此矩阵方程容易得到回归系数βi的估计值(假设xi是相互独立的):

XY X XT β= T ˆβˆ (= X X XYT )-1 T

求出估计回归系数后,需要对回归方程进行显著性检验,以确保每个自变量都是对因变量有显著性的影响的。拟合优度R2同样适用于多元线性回归的假设检验。

在实际应用中,多个自变量 xi相互独立的条件很难满足,这就需要解决多重共线性的问题,常用的方法有岭回归、LASSO 回归和弹性网络回归等方法。这些回归方法的主要思想是在回归方程的损失函数上加上正则项,以减少自变量相关引起的回归方程过拟合的问题。

岭回归、LASSO回归和弹性网络回归方程的损失函数分别如下。

岭回归方程:

1=i∑n2=θL n1( ) i-θ yi )2( )h x( j j∑λ θ+ 2

LASSO回归方程:

1=in2 1=θ( )L n∑iθ yi )2-( )h x( j jλ θ| |∑+

弹性网络回归方程:

θL( ) (=n1 n2 1=i∑θ h x( )i -i y)2 +jj j∑2j1 λ θλ θ+2∑

式中θ表示回归系数,hθ(xi)表示回归方程对于样本xi的估计值,yi表示样本因变量的真实值, λ1λ2为正则化因子。当λ2=0时,弹性网络回归退化成岭回归;当λ1=0时,弹性网络回归退化成LASSO回归。

岭回归的Python调用代码如下:

from sklearn.linear_model import Ridge,RidgeCV
rigdeCV  =  RidgeCV(alphas=Lambdas,normalize=True,scoring='neg_mean_squared_error', cv=15)
rigdeCV.fit(X_train,Y_train)
predictedResult = rigdeCV.predict(X_test)

LASSO回归和弹性网络的Python代码类似。

线性回归只是自变量在局部取值范围内变量之间的一种近似关系,实际上变量之间更多的是非线性的关系。非线性模型是一个或多个自变量的非线性组合。

对于非线性回归分析,为了便于利用样本求出其中的回归系数,一般的做法是对变量进行转换,把非线性模型转换为线性模型,然后利用上述方法求解其中的回归系数。例如对双曲线函数需要进行线性变换:y1=1/y,x1=1/x,得到 y1=a+bx1。对于 y=axβ,需要做如下非线性变换:y 1=ln y,x 1=ln x,ln y=ln a+βln x,得到y 1=ln a+βx 1

如果多个自变量之间是相互独立或弱相关的,可以分别研究因变量与各个自变量的关系,然后加权求和,求出整个非线性回归方程。此外,分段函数求解或许是一种可行的选择。

【例2.1】 利用犯罪嫌疑人的足长和步幅预测其身高。

利用给定的足长、步幅和身高数据集,以足长、步幅为自变量,身高为因变量,采用二元线性回归获得预测身高的模型,对应的Python代码如下:

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 用Axes3D库画三维模型图
from sklearn.linear_model import LinearRegression
#读取数据
df = pd.read_excel("身高预测参照表.xlsx")
df.columns = ['足长', '步幅', '身高']
# 获取拆分后的数据x_data、y_data(其中x_data为数据集,y_data为标签)
def get_data(data):
    x_data = data.drop(columns=['身高'], axis=1)
    y_data = data['身高']
    return x_data, y_data
x_data, y_data = get_data(df)
# 训练模型
lr = LinearRegression()
lr.fit(x_data, y_data)
y_pred = lr.predict(x_data)
print(lr.coef_, lr.intercept_)
print(lr.score(x_data, y_data)) #显示拟合优度
x1_data = x_data.drop(columns=['步幅'], axis=1)
x2_data = x_data.drop(columns=['足长'], axis=1)
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体
fig = plt.figure(figsize=(8,6)) # 设置画布大小
ax3d = Axes3D(fig)
ax3d.scatter(x1_data,x2_data,y_data,color='b',marker='*',label='actual')  #实际样本可视化
ax3d.scatter(x1_data,x2_data,y_pred,color='r',label='predict') #预测数据可视化
ax3d.set_xlabel('足长',color='r',fontsize=16) # 设置x轴标签
ax3d.set_ylabel('步幅',color='r',fontsize=16) # 设置y轴标签
ax3d.set_zlabel('身高',color='r',fontsize=16) # 设置z轴标签
plt.suptitle("身高与足长、步幅关系模型",fontsize=20)
plt.legend(loc='upper left')
plt.show()

程序运行结果如图2-4所示,其中可以看到回归系数分别约为3.172、0.327和70.611,拟合优度R2约为0.983,可见可以接受使用二元线性回归。

图2-4 身高与足长、步幅的关系