一文读懂多元线性回归
一、什么是线性回归模型
1.1模型
h θ = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 h_\theta = \theta_0 + \theta_{1}x_1+ \theta_{2}x_2+ \theta_{3}x_3 hθ=θ0+θ1x1+θ2x2+θ3x3
1.2线性
θ i \theta_i θi表示 x i x_i xi属性对 h θ h_\theta hθ的影响,影响程度与 x i x_i xi的数值成正比,影响程度也可以称为贡献度。 θ 0 \theta_0 θ0表示了$h_\theta $本身的性质,中心化后这一项消失。
1.3回归
h θ h_\theta hθ是一个预测值,建立合适的线性模型可以使得真实值 y y y以预测值为中心波动(y是包含误差和随机扰动的),即残差的均值为0。
二、如何建立线性回归模型
2.1寻找 y y y和 x x x
y
y
y需要是稳定的、可预测的,
x
x
x需要与
y
y
y有逻辑上的关系。
模型是我们理解场景的手段,使用模型之前首先要根据领域经验确认场景是客观存在而且稳定的,这样才能让模型帮助我们更精确的理解场景,而不是成为一个数字游戏。能够发现客观的
y
y
y是数据挖掘工程师的核心价值,能够建立稳定的评价
y
y
y的
x
x
x需要经验和技巧。
2.2确定模型参数
2.2.1 拟合的角度
什么是拟合
狭义上的拟合是指寻找 x x x和 y y y的函数 f f f,广义上的拟合是寻找能够解释 y y y的 f f f和 x x x,使得 y = f ( x ) y=f(x) y=f(x)成立。理想的成立是指等号完全成立,但是实际上的拟合是指“尽可能”成立,即拟合的结果与实际的结果误差尽可能小。误差即损失函数,是预测值与真实值之间的差异,因此称之为损失(预测的损失),因此拟合就是一个最小化损失函数的过程。最小化损失函数一般是机器学习模型的目标,我们希望预测值与真实值尽可能接近,一般使用rmse、mse等衡量误差。
最小二乘法拟合线性回归模型
最小二乘法的定义包含两部分,二乘法即平方法,使用离差平方和作为误差的度量,损失函数为
J
(
w
)
=
∑
i
=
1
m
(
y
^
i
−
y
i
)
2
J(w)=\sum_{i=1}^{m}(\hat{y}^{i}-y^{i})^2
J(w)=∑i=1m(y^i−yi)2。使预测值与真实值误差最小即使二乘函数最小,因此最小二乘法可以用于拟合线性回归模型。
对于线性回归模型而言,二乘函数是一个关于系数的凸函数,可以使用驻点的必要条件求解极值点的系数。
2.2.2 统计的角度
什么是似然估计
似然估计的思想是已经出现的就是最有可能出现的。
模型的极大似然等价于误差的极大似然
如果模型是正确的,误差不含有有效信息,是一种白噪声。运用极大似然估计的思想,使得当前白噪声出现概率最大的参数就是正确参数。
L
(
w
)
=
∏
i
=
1
m
1
2
π
σ
e
−
(
y
i
−
y
^
i
)
2
2
σ
2
L(w)=\prod_{i=1}^{m}\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^i-\hat{y}^i)^2}{2\sigma^2}}
L(w)=∏i=1m2πσ1e−2σ2(yi−y^i)2
L
(
w
)
L(w)
L(w)的对数函数的极值点与
L
(
w
)
L(w)
L(w)相同,与最小二乘的公式相同,从而实现等价。
2.2.3 公式解
y
^
i
=
w
0
+
w
1
∗
x
1
i
+
w
2
∗
x
2
i
+
.
.
.
+
w
n
∗
x
n
i
\hat{y}^i=w_0+w_1*x_1^i+w_2*x_2^i+...+w_n*x_n^i
y^i=w0+w1∗x1i+w2∗x2i+...+wn∗xni
ω
=
(
w
0
,
w
1
,
w
2
,
.
.
.
,
w
n
)
T
\omega =( w_0,w_1,w_2,...,w_n)^T
ω=(w0,w1,w2,...,wn)T
X
i
=
(
1
,
x
1
i
,
x
2
i
,
.
.
.
,
x
n
i
)
T
X^i =(1,x_1^i,x_2^i,...,x_n^i)^T
Xi=(1,x1i,x2i,...,xni)T
y
i
=
(
y
1
i
,
y
2
i
,
.
.
.
,
y
n
i
)
T
y^i =(y_1^i,y_2^i,...,y_n^i)^T
yi=(y1i,y2i,...,yni)T
y
^
i
=
ω
∗
X
i
\hat{y}^i=\omega*X^i
y^i=ω∗Xi
ϵ
i
=
y
i
−
y
^
i
\epsilon^i=y^i-\hat{y}^i
ϵi=yi−y^i
[
ϵ
1
ϵ
2
ϵ
3
.
ϵ
m
]
=
[
y
1
−
y
^
1
y
2
−
y
^
2
y
3
−
y
^
3
.
y
m
−
y
^
m
]
=
[
y
1
y
2
y
3
.
y
m
]
−
[
ω
∗
X
1
ω
∗
X
2
ω
∗
X
3
.
ω
∗
X
m
]
=
y
⃗
−
y
^
⃗
\begin{bmatrix} \epsilon^1 \\ \epsilon^2 \\ \epsilon^3 \\. \\ \epsilon^m \end{bmatrix} = \begin{bmatrix} y^1-\hat{y}^1 \\ y^2-\hat{y}^2\\ y^3-\hat{y}^3 \\. \\ y^m-\hat{y}^m \end{bmatrix} = \begin{bmatrix} y^1\\ y^2\\y^3 \\. \\y^m \end{bmatrix}-\begin{bmatrix} \omega*X^1\\\omega*X^2 \\\omega*X^3 \\. \\\omega*X^m \end{bmatrix}=\vec{y}-\vec{\hat{y}}
⎣⎢⎢⎢⎢⎡ϵ1ϵ2ϵ3.ϵm⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡y1−y^1y2−y^2y3−y^3.ym−y^m⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡y1y2y3.ym⎦⎥⎥⎥⎥⎤−⎣⎢⎢⎢⎢⎡ω∗X1ω∗X2ω∗X3.ω∗Xm⎦⎥⎥⎥⎥⎤=y−y^
y
^
⃗
=
[
w
0
+
w
1
∗
x
1
1
+
w
2
∗
x
2
1
+
.
.
.
+
w
n
∗
x
n
1
w
0
+
w
1
∗
x
1
2
+
w
2
∗
x
2
2
+
.
.
.
+
w
n
∗
x
n
2
w
0
+
w
1
∗
x
1
3
+
w
2
∗
x
2
3
+
.
.
.
+
w
n
∗
x
n
3
.
w
0
+
w
1
∗
x
1
m
+
w
2
∗
x
2
m
+
.
.
.
+
w
n
∗
x
n
m
]
=
[
1
x
1
1
x
2
1
x
3
1
.
.
.
x
n
1
1
x
1
2
x
2
2
x
3
2
.
.
.
x
n
2
1
x
1
3
x
2
3
x
3
3
.
.
.
x
n
3
.
.
.
.
.
.
1
x
1
m
x
2
m
x
3
m
.
.
.
x
n
m
]
∗
[
w
0
w
1
w
2
.
w
n
]
=
X
∗
ω
\vec{\hat{y}}=\begin{bmatrix} w_0+w_1*x_1^1+w_2*x_2^1+...+w_n*x_n^1\\ w_0+w_1*x_1^2+w_2*x_2^2+...+w_n*x_n^2 \\w_0+w_1*x_1^3+w_2*x_2^3+...+w_n*x_n^3 \\. \\w_0+w_1*x_1^m+w_2*x_2^m+...+w_n*x_n^m \end{bmatrix}=\begin{bmatrix} 1 & x_1^1&x_2^1&x_3^1&...&x_n^1\\1&x_1^2&x_2^2&x_3^2&...&x_n^2 \\1&x_1^3&x_2^3&x_3^3&...&x_n^3 \\. &.&.&.&.&.\\1&x_1^m&x_2^m&x_3^m&...&x_n^m \end{bmatrix}*\begin{bmatrix} w_0\\ w_1 \\ w_2 \\. \\ w_n \end{bmatrix}=X*\omega
y^=⎣⎢⎢⎢⎢⎡w0+w1∗x11+w2∗x21+...+wn∗xn1w0+w1∗x12+w2∗x22+...+wn∗xn2w0+w1∗x13+w2∗x23+...+wn∗xn3.w0+w1∗x1m+w2∗x2m+...+wn∗xnm⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡111.1x11x12x13.x1mx21x22x23.x2mx31x32x33.x3m.............xn1xn2xn3.xnm⎦⎥⎥⎥⎥⎤∗⎣⎢⎢⎢⎢⎡w0w1w2.wn⎦⎥⎥⎥⎥⎤=X∗ω
J
(
ω
)
=
1
2
ϵ
2
=
1
2
ϵ
T
∗
ϵ
=
1
2
(
y
⃗
−
X
∗
ω
)
T
∗
(
y
⃗
−
X
∗
ω
)
J(\omega)=\frac{1}{2}\epsilon^2 = \frac{1}{2}\epsilon^T * \epsilon=\frac{1}{2}(\vec{y}-X*\omega)^T*(\vec{y}-X*\omega)
J(ω)=21ϵ2=21ϵT∗ϵ=21(y−X∗ω)T∗(y−X∗ω)
下面使用的矩阵的求导公式如下:
∂
A
x
⃗
∂
x
⃗
=
A
T
,
∂
A
x
⃗
∂
x
⃗
T
=
A
,
∂
x
⃗
T
A
∂
x
⃗
=
A
,
∂
(
x
⃗
T
A
x
⃗
)
∂
x
⃗
=
(
A
T
+
A
)
x
⃗
,
如
果
A
=
A
T
,
∂
(
x
⃗
T
A
x
⃗
)
∂
x
⃗
=
2
A
x
⃗
\frac{\partial{A\vec{x}}}{\partial{\vec{x}}}=A^T,\frac{\partial{A\vec{x}}}{\partial{\vec{x}^T}}=A,\frac{\partial{\vec{x}^TA}}{\partial{\vec{x}}}=A,\frac{\partial{(\vec{x}^TA\vec{x})}}{\partial{\vec{x}}}=(A^T+A)\vec{x},如果A=A^T,\frac{\partial{(\vec{x}^TA\vec{x})}}{\partial{\vec{x}}}=2A\vec{x}
∂x∂Ax=AT,∂xT∂Ax=A,∂x∂xTA=A,∂x∂(xTAx)=(AT+A)x,如果A=AT,∂x∂(xTAx)=2Ax
1
2
∂
∂
ω
⃗
(
y
⃗
T
y
⃗
−
y
⃗
T
X
ω
⃗
−
ω
⃗
T
X
T
y
⃗
+
ω
⃗
T
X
T
X
ω
⃗
)
=
0
\frac{1}{2}\frac{\partial{}}{\partial{\vec{\omega}}}(\vec{y}^T\vec{y}-\vec{y}^TX\vec{\omega}-\vec{\omega}^TX^T\vec{y}+\vec{\omega}^TX^TX\vec{\omega})=0
21∂ω∂(yTy−yTXω−ωTXTy+ωTXTXω)=0
ω
⃗
=
(
X
T
X
)
−
1
X
T
y
⃗
\vec{\omega}=(X^TX)^{-1}X^T\vec{y}
ω=(XTX)−1XTy
四、建模过程
使用线性回归模型建模,也是其他数据模型的一般步骤包括:
1.数据预处理
- 特征样本和标签样本对齐
- 异常数据处理,eg.nan值、inf值
- 离群点值处理
2.切分数据集
- 样本内数据集:拟合模型
- 样本外数据集:验证模型泛化能力
3.拟合模型
4.使用模型预测
- 使用样本外的特征预测样本外的标签
5.模型可视化
- 样本外的点是否在拟合的直线附近,是否与样本内的点位于同一包络内
- 只绘制预测值和真实值,比较两个的绝对数值的差异
- 绘制残差图
6.模型评价(目标函数、损失函数、代价函数)
- MAE:Mean Absolute Error->平均离差
离差的均值,公式为 1 m ∑ i = 1 m ∣ y ^ i − y i ) ∣ \frac{1}{m}\sum_{i=1}^{m}|\hat{y}^i-y^i)| m1∑i=1m∣y^i−yi)∣ - MSE:Mean Square Error->均方误差
MAE中各个样本的误差权重是等权重的,背后的假设是误差服从一个均匀分布。但是我们希望我们的模型是稳定的,即小误差出现概率高,大误差出现概率低。因此使用MSE度量误差考虑了模型的平稳性,衡量的是预测值与真实值误差的平均平方和,公式为 1 m ∑ i = 1 m ( y ^ i − y i ) 2 \frac{1}{m}\sum_{i=1}^{m}(\hat{y}^i-y^i)^2 m1∑i=1m(y^i−yi)2。 - RMSE:Root Mean Square Error->平方根均方误差
因为MSE的单位是平方,不利于理解误差的大小,因此产生了RMSE的度量,公式为 R M S E = M S E RMSE=\sqrt{MSE} RMSE=MSE。 -
R
2
R^2
R2:可决系数
MAE、MSE、RMSE衡量的误差都是有量纲的,而且无上界。 R 2 R^2 R2是无量纲而且有上下界的,值域为[0,1]。 R 2 R^2 R2反映的是模型对被解释变量波动的解释程度,预测能力与直接使用均值预测相比的准确程度,最差的情况是模型预测与使用均值预测无区别,最好的情况是模型预测了被解释变量的每一个波动。
TSS:total sum of squares->被解释变量的全部信息
RSS:residual sum of squares->模型没有解释的部分
ESS:explained sum of squares->模型解释的部分
y ˉ = 1 m ∑ i = 1 m y i \bar{y}=\frac{1}{m}\sum_{i=1}^{m}y^i yˉ=m1∑i=1myi
T S S = 1 m ∑ i = 1 m ( y i − y ˉ ) TSS=\frac{1}{m}\sum_{i=1}^{m}(y^i-\bar{y}) TSS=m1∑i=1m(yi−yˉ)
R S S = 1 m ∑ i = 1 m ( y ^ i − y i ) 2 RSS=\frac{1}{m}\sum_{i=1}^{m}(\hat{y}^i-y^i)^2 RSS=m1∑i=1m(y^i−yi)2
E S S = 1 m ∑ i = 1 m ( y ^ i − y ˉ ) ESS=\frac{1}{m}\sum_{i=1}^{m}(\hat{y}^i-\bar{y}) ESS=m1∑i=1m(y^i−yˉ)
T S S = E S S + R S S TSS = ESS+RSS TSS=ESS+RSS
R 2 = E S S T S S = T S S − R S S T S S = 1 − R S S T S S R^2=\frac{ESS}{TSS}=\frac{TSS-RSS}{TSS}=1-\frac{RSS}{TSS} R2=TSSESS=TSSTSS−RSS=1−TSSRSS
五、模型有效性分析的扩展
5.1.残差分析
OLS方法估计参数符合似然估计的前提是残差符合正态分布。建模过后可以通过对残差进行JB检验、qq图等检验残差的正态性。如果残差不符合正态分布,例如符合t分布,线性回归模型的参数受到离群点的影响较大,可以通过对似然函数分析得到这个结论。残差不满足正态分布的情况可以使用参考稳健估计的方法
5.2统计分析
从机器学习的角度来看OLS估计后建模结束,但是从统计学角度来看还要依次进行F检验检验因变量是否与自变量存在显著的相关性,进行t检验分别检验各自变量的系数是否显著,检验多重共线性(会导致回归参数不稳定,系数方差较大,而且影响对各个变量的分析, X T X X^TX XTX不可逆,使用PCA、主成分分析等方法解决),检验自相关性(估计的系数方差很大,影响t检验的有效性,使用差分法解决),检验异方差性质(估计的系数方差很大,影响t检验的有效性,使用WLS解决)。从高斯-马尔可夫定理的证明过程中可以看出,只有在同方差和非自相关性的条件下,OLS估计才具有最小方差性,后两者均不影响无偏性,影响有效性。
六、案例
6.1 波士顿房价预测
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
# 载入波士顿房价数据集
boston = load_boston()
# 自变量名称
boston['feature_names']
# CRIM:房屋所在镇犯罪率
# ZN:面积大于25000平方英尺住宅所占比例
# INDUS:房屋所在镇非零售区域所占比例
# CHAS:房屋位于河边,值为1,否则为0
# NOX:NO浓度
# RM:平均房间数
# AGE:1940年前建成房屋所占比例
# DIS:房屋距离波士顿五大就业中心的加权距离
# RAD:距离房屋最近公路编号
# TAX:财产税额度
# PTRATIO:房屋所在镇师生比
# B:计算公式为1000*(房屋所在镇非美籍人口所占比例-0.63)**2
# LSTAT:弱势群体人口所占比例
# target:房屋的平均价格
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
x,y = boston.data,boston.target
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
x_train,x_test,y_train,y_test = train_test_split(x,y.reshape(-1,1),test_size=0.25,random_state=0)
regression=LinearRegression()
# fit->拟合
# fit时,x是2D,y是2D
regression.fit(x_train,y_train)
# 查看模型训练结果
print('系数:',regression.coef_)
print('截距:',regression.intercept_)
系数: [[-1.17735289e-01 4.40174969e-02 -5.76814314e-03 2.39341594e+00
-1.55894211e+01 3.76896770e+00 -7.03517828e-03 -1.43495641e+00
2.40081086e-01 -1.12972810e-02 -9.85546732e-01 8.44443453e-03
-4.99116797e-01]]
截距: [36.93325546]
# predict->预测
out_sample_predicted_y=regression.predict(x_test)
# 评价
from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score
# 注意参数顺序
# 注意接口的定义。metrics提供的接口是对原数据和预测数据计算,预测类自带的是使用原始数据即可,因为预测的结果已经在模型里了。
print('MAE:',mean_absolute_error(y_test,out_sample_predicted_y))
print('MSE:',mean_squared_error(y_test,out_sample_predicted_y))
print('RMSE:',np.sqrt(mean_squared_error(y_test,out_sample_predicted_y)))
print('R2:',r2_score(y_test,out_sample_predicted_y))
print('训练集R2:',regression.score(x_train,y_train))
print('测试集R2:',regression.score(x_test,y_test))
MAE: 3.668330148135717
MSE: 29.782245092302485
RMSE: 5.457311159564066
R2: 0.6354638433202114
训练集R2: 0.7697699488741149
测试集R2: 0.6354638433202114