线性回归
本文介绍最经典的监督学习问题——线性回归,包括单变量线性回归和多变量线性回归
线性回归是回归任务,输入是带有标签的数据,根据数据关系,拟合出一个线性函数,并利用该函数进行预测等操作。线性回归分为单变量(只有一个影响因素)和多变量(多个影响因素)
单变量线性回归
它探讨的是一个自变量(也称为解释变量或预测变量)与一个因变量(也称为响应变量或预测目标)之间的线性关系。一元线性回归的基本模型定义为:
y = β 0 + β 1 x + ε y=\beta_0+\beta_1x+\varepsilon y=β0+β1x+ε
误差项ε是随机变量反映了除 x 和 y 之间的线性关系之外的随机因素对 y 的影响,是不能由 x 和 y 之间的线性关系所解释的变异性。
假定误差项ε是一个期望值为0的随机变量,即E(ε)=0。对于一个给定的 x 值,y 的期望值为E (y ) =β0+ β1x
我们的目标是根据训练样本得到最合适的参数β0和β1,让所有训练样本点到拟合直线函数的距离最小,使用的方法是最小二乘法
最小二乘法(Ordinary Least Squares, OLS):让实际值和估计值(拟合函数)之间的距离总和最小为要求得到估计参数,为了方便及不让正负符号抵消,使用残差平方和表示距离,即
R S S ( β 0 , β 1 ) = ∑ i = 1 n ( y i − ( β 0 + β 1 x i ) ) 2 \mathrm{RSS}(\beta_0,\beta_1)=\sum_{i=1}^n(y_i-(\beta_0+\beta_1x_i))^2 RSS(β0,β1)=i=1∑n(yi−(β0+β1xi))2
目标是让上述函数取到最小值,因为这个函数是在凸优化问题,任何局部最小值都是全局最小值,通过微分并令其等于零来找到极小值点就是全局最小值点。对于一元线性回归问题,可以直接推导出闭式解:
β 1 ^ = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 \hat{\beta_1}=\frac{\sum_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^n(x_i-\bar{x})^2} β1^=∑i=1n(xi−xˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
然后,利用估计出的β1计算出β0
β 0 ^ = y ˉ − β 1 ^ x ˉ \hat{\beta_0}=\bar{y}-\hat{\beta_1}\bar{x} β0^=yˉ−β1^xˉ
sklearn是一个机器学习库,其中为我们封装好了很多机器法学系方法,可以让我们直接调用,非常方便,在开发中也是直接调用库而不需要手写算法,但是手写算法可以帮助我们理解算法的底层逻辑。
【示例】手动实现单变量的线性回归并且进行可视化展示
# 一元线性回归分析
import numpy as np
import matplotlib.pyplot as plt# 准备训练样本数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 3, 2, 3, 5])
# 计算第一个参数,用a保存
d, m = 0, 0
for x_i, y_i in zip(x, y):d += (x_i - x.mean()) * (y_i - y.mean())m += (x_i - x.mean()) ** 2
a = d / m
# 计算第二个参数,用b保存
b = y.mean() - a * x.mean()
# y_hat作为使用计算出的a和b作为参数得到的拟合函数的估计值
y_hat = a * x + b
# 可视化
plt.scatter(x, y)
plt.plot(x, y_hat, color='r')
plt.axis([0, 6, 0, 6])plt.show()
运行结果:
【示例】使用sklearn中的方法实现线性回归
# 导入包含回归方法的类:
from sklearn.linear_model import LinearRegression# 将上面的数据转换为列向量使用
x = x.reshape(-1,1)
y = y.reshape(-1,1)# 创建该类的一个对象:
LR = LinearRegression()# 训练模型拟合数据,并预测:
LR = LR.fit(x, y)
y_predict = LR.predict(x)# 可视化
plt.scatter(x, y)
plt.plot(x, y_predict, color='r')
plt.axis([0, 6, 0, 6])plt.show()
拟合优度与检验
在得到一个模型结果之后,我们需要一些方法或者指标来判断这个模型是否有效,即得到的模型是否能够有效的反映训练样本所表达的关系。
要检验样本和估计值之间的关系,我们经常会使用距离来进行衡量,如果所有的训练样本点到估计值的距离都很小,我们就可以说这个拟合的模型结果很好。
回归平方和: S S R = ∑ ( y ^ i − y ˉ ) 2 SSR=\sum(\hat{y}_i-\bar{y})^2 SSR=∑(y^i−yˉ)2
SSR反映了回归模型对数据的解释能力,SSR越大,说明模型能够解释更多的数据变异。当模型完美拟合数据时,SSR等于SST(总平方和),而SSE(残差平方和)则为0。
残差平方和: S S E = ∑ ( y i − y ^ i ) 2 SSE=\sum(y_i-\hat{y}_i)^2 SSE=∑(yi−y^i)2
SSE越小,说明模型的预测值与实际观测值越接近,模型的拟合效果越好。在上一小节的最小二乘法中,目标就是找到使SSE最小化的模型参数。
总平方和: S S T = ∑ ( y i − y ˉ ) 2 = S S R + S S E SST=\sum(y_i-\bar{y})^2 = SSR + SSE SST=∑(yi−yˉ)2=SSR+SSE
SST它衡量了观测值与其平均值之间的差异的平方和,提供了因变量总变异性的一个度量。残差平方和(SSE)代表了模型未能解释的变异部分,回归平方和(SSR)则表示了模型成功解释的变异部分。
判定系数R^2: R 2 = 1 − S S E S S T R^2=1-\frac{SSE}{SST} R2=1−SSTSSE
是在回归分析中衡量模型拟合优度的一个统计量。它表示模型解释的变异占总变异的比例,取值范围从0到1。一个较高的 R^2 值表明模型对数据的解释能力较好,反之则较差。
判定系数等于相关系数的平方,即R2=(*r*)2
上述的很多参数中,常用的只有判定系数R2,其余的定义都是为了最终计算出这个值,只需要掌握这个的计算即可。使用sklear包中提供的工具即可实现计算R2,因为底层设计的数据计算比较多,手写容易出错,所以在这里我也直接调用相关方法。
【示例】使用sklearn计算上面例子中的R^2
# 计算R^2和F统计量
# 导入相关工具
from sklearn.metrics import r2_score
# 传入标签值和估计值进行计算
r2 = r2_score(y, y_predict)
print(f"R² Score: {r2}")
输出结果:
R² Score: 0.7272727272727273
多变量线性回归
多元线性回归(Multiple Linear Regression)用于研究一个因变量(dependent variable)与两个或更多个自变量(independent variables)之间的线性关系。相比于一元线性回归,多元线性回归模型允许考虑多个影响因素,这些因素共同作用于预测目标变量。多元线性回归可以写成如下形式:
y = β 0 + β 1 x 1 + β 2 x 2 + . . . + β p x p + ϵ y=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_px_p+\epsilon y=β0+β1x1+β2x2+...+βpxp+ϵ
利用最小二乘法的思想,对各个参数求偏导,令其等于0,得出估计参数值
使用skelearn实现多变量线性回归和上面单变量的用法相同,都是使用LinearRegression,不同的就是此时传入的x变成了多个维度的数组,以此来表示多个变量。