线性回归是回归分析中的一种,评估的自变量 X X X和因变量 Y Y Y之间是一种线性关系。但自变量只有一个时,称为简单线性回归;当自变量有多个时,称为多元线性回归。
1.一般线性回归
给定数据集
D
=
{
(
x
1
,
y
i
)
,
(
x
2
,
y
2
)
,
…
,
(
x
m
,
y
m
)
}
D=\left\{(x_{1},y_{i}),(x_{2},y_{2}),\dots,(x_{m},y_{m}) \right\}
D={(x1,yi),(x2,y2),…,(xm,ym)},其中
x
i
=
(
x
i
1
;
x
i
2
;
…
;
x
i
p
)
x_{i}=(x_{i1};x_{i2};\dots;x_{ip})
xi=(xi1;xi2;…;xip),
y
i
∈
R
y_{i}\in R
yi∈R。线性回归则试图找到一个通过属性的线性组合来进行预测的函数,即
f
(
x
)
=
w
0
+
w
1
x
1
+
w
2
x
2
+
⋯
+
w
p
x
p
+
ϵ
f(x)=w_{0}+w_{1}x_{1}+w_{2}x_{2}+\dots+w_{p}x_{p}+\epsilon
f(x)=w0+w1x1+w2x2+⋯+wpxp+ϵ其中,
y
y
y为因变量,是随机定量的观察值;
x
1
,
x
2
,
…
,
x
p
\boldsymbol{x_{1}},\boldsymbol{x_{2}},\dots, \boldsymbol{x_{p}}
x1,x2,…,xp为
p
p
p个自变量;
w
0
w_{0}
w0为常数项,
w
1
,
w
2
,
…
,
w
p
w_{1},w_{2},\dots,w_{p}
w1,w2,…,wp为偏回归系数。
w
i
(
i
=
1
,
2
,
…
,
p
)
w_{i}(i=1,2,\dots,p)
wi(i=1,2,…,p)表示在其他自变量固定不变的情况下,自变量每改变一个单位时,其单独引起因变量
y
y
y的平均改变量。
ϵ
\epsilon
ϵ为随机误差,又称残差,它是
y
y
y的变化中不能用自变量解释的部分,服从
N
(
0
,
σ
2
)
N(0,\sigma^{2})
N(0,σ2) 分布。
多元线性回归模型参数求解常用最小二乘法(Ordinary Least Squares,简称OLS)。
2.正则化线性回归模型
为了防止回归模型出现过拟合,通常是在损失函数后加上一个对参数的约束项,这个约束项即为正则化项。在线性回归模型中,通常有三种不同的正则化项:
- Lasso回归:Lasso回归的正则化项为
L
1
L1
L1范数,即所有参数(不包括常数项)的绝对值之和。其完整的损失函数如下:
J
(
w
)
=
1
2
m
∑
i
=
1
m
(
y
i
−
w
0
−
∑
k
=
1
p
w
i
x
i
k
)
)
2
+
λ
∑
k
=
1
p
∥
w
k
∥
J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y_{i}-w_{0}-\sum_{k=1}^{p}w_{i}x_{ik}))^2+\lambda \sum_{k=1}^{p} \|w_{k}\|
J(w)=2m1i=1∑m(yi−w0−k=1∑pwixik))2+λk=1∑p∥wk∥
sklearn中提供的类如下:
alpha: L1正则化项的参数。
fit_intercept:是否建立有截距的线性模型。
normalize:只有当fit_intercept为True时此参数也能发挥作用。当其为True时,会对X进行正则化。
precompute:是否使用Gram矩阵加速计算。
max_inter: 最大迭代次数
positive:当其为True时,所有参数均为正。 - Ridge回归(岭回归):Ridge回归的正则化项为
L
2
L2
L2范数,即所有参数(不包括常数项)的平方和。其完整的损失函数公式如下:
J
(
w
)
=
1
2
m
∑
i
=
1
m
(
y
i
−
w
0
−
∑
k
=
1
p
w
i
x
i
k
)
)
2
+
λ
2
∑
k
=
1
p
w
k
2
J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y_{i}-w_{0}-\sum_{k=1}^{p}w_{i}x_{ik}))^2+\frac{\lambda}{2}\sum_{k=1}^{p}w_{k}^{2}
J(w)=2m1i=1∑m(yi−w0−k=1∑pwixik))2+2λk=1∑pwk2
sklearn中的类为:
Ridge()中的很多参数与Lasso()中的参数意义相同,solver为其新增参数:
- 弹性网络:弹性网络是结合了岭回归和Lasso回归,由两者加权平均所得。其完整的损失函数如下:
J
(
w
)
=
1
2
m
∑
i
=
1
m
(
y
i
−
w
0
−
∑
k
=
1
p
w
i
x
i
k
)
)
2
+
1
−
λ
2
∑
k
=
1
p
w
k
2
+
λ
∑
k
=
1
p
∥
w
k
∥
J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y_{i}-w_{0}-\sum_{k=1}^{p}w_{i}x_{ik}))^2+\frac{1-\lambda}{2}\sum_{k=1}^{p}w_{k}^{2}+\lambda \sum_{k=1}^{p} \|w_{k}\|
J(w)=2m1i=1∑m(yi−w0−k=1∑pwixik))2+21−λk=1∑pwk2+λk=1∑p∥wk∥
sklearn中的类:
3.评估指标
常见的回归模型评估指标有MAE(Mean Absolute Error,平均绝对值误差)、MSE(Mean Square Error, 平均平方误差)、RMSE(Root Mean Square Error,平均平方误差的平方根)。下面来看另外两个评估指标:
R
2
R^{2}
R2和调整后的
R
2
R^{2}
R2。
(1)
R
2
R^{2}
R2
R
2
=
1
−
∑
i
=
1
m
(
y
i
−
y
^
i
)
2
∑
i
=
1
m
(
y
i
−
y
‾
)
2
=
1
−
S
S
E
S
S
T
R^{2}=1-\frac{\sum_{i=1}^{m}(y_{i}-\widehat y_{i})^{2}}{\sum_{i=1}^{m} (y_{i}-\overline y)^{2} } =1-\frac{SSE}{SST}
R2=1−∑i=1m(yi−y)2∑i=1m(yi−y
i)2=1−SSTSSE其中
y
i
y_{i}
yi为样本真实值,
y
^
i
\widehat y_{i}
y
i为模型预测值,
y
‾
=
1
m
∑
i
=
1
m
y
i
\overline y=\frac{1}{m}\sum_{i=1}^{m}y_{i}
y=m1∑i=1myi。
R
2
R^{2}
R2表示模型输入的各自变量在多大程度上可以解释目标变量的可变性,
R
2
R^{2}
R2的取值范围在
[
0
,
1
]
[0,1]
[0,1]之间,
R
2
R^{2}
R2越大,说明模型拟合越好。但当模型的自变量数逐渐增多时,
R
2
R^{2}
R2也随之逐步增大。所以需要对
R
2
R^{2}
R2的计算公式进行调整。
原因:当样本量保持固定不变时,
R
2
R^{2}
R2公式中的
S
S
T
SST
SST固定不变。假设当样本自变量为
k
k
k个时,记其模型
S
S
E
SSE
SSE为
S
S
E
k
SSE_{k}
SSEk。若在原
k
k
k个变量的基础上再增加一个新解释变量
x
k
+
1
x_{k+1}
xk+1时,记其模型的
S
S
E
SSE
SSE为
S
S
E
k
+
1
SSE_{k+1}
SSEk+1。根据OLS的思想,
S
S
E
k
SSE_{k}
SSEk可看作变量
x
k
+
1
x_{k+1}
xk+1的参数
w
k
+
1
=
0
w_{k+1}=0
wk+1=0条件下的极小值。而
S
S
E
k
+
1
SSE_{k+1}
SSEk+1为无条件下的极小值,所以
S
S
E
k
+
1
≤
S
S
E
k
SSE_{k+1}\le SSE_{k}
SSEk+1≤SSEk。
(2) 调整后的
R
2
R^{2}
R2
a
d
j
−
R
2
=
1
−
(
1
−
R
2
)
∗
(
m
−
1
)
/
(
m
−
p
−
1
)
adj-R^{2}=1-(1-R^{2})*(m-1)/(m-p-1)
adj−R2=1−(1−R2)∗(m−1)/(m−p−1)其中
p
p
p为模型变量个数。
4.案例
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score,mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Lasso,Ridge,ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
boston=load_boston()
X,y=boston.data,boston.target
X=pd.DataFrame(X,columns=boston.feature_names)
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0,
test_size=0.25)
lr=LinearRegression()
ridge=Ridge()
lasso=Lasso()
elasticnet=ElasticNet()
lr.fit(X_train,y_train)
y_pred_lr=lr.predict(X_test)
r2_lr=r2_score(y_test,y_pred_lr)
mse_lr=mean_squared_error(y_test, y_pred_lr)
print("多元线性回归:r2为{:.3f},MSE为{:.3f}".format(r2_lr,mse_lr))
ridge.fit(X_train,y_train)
y_pred_ridge=ridge.predict(X_test)
r2_ridge=r2_score(y_test,y_pred_ridge)
mse_ridge=mean_squared_error(y_test, y_pred_ridge)
print("岭回归:r2为{:.3f},MSE为{:.3f}".format(r2_ridge,mse_ridge))
lasso.fit(X_train,y_train)
y_pred_lasso=lasso.predict(X_test)
r2_lasso=r2_score(y_test,y_pred_lasso)
mse_lasso=mean_squared_error(y_test, y_pred_lasso)
print("Lasso回归:r2为{:.3f},MSE为{:.3f}".format(r2_lasso,mse_lasso))
elasticnet.fit(X_train,y_train)
y_pred_eln=lr.predict(X_test)
r2_eln=r2_score(y_test,y_pred_eln)
mse_eln=mean_squared_error(y_test,y_pred_eln)
print("弹性网络回归:r2为{:.3f},MSE为{:.3f}".format(r2_lasso,mse_lasso))
参考资料
- https://www.cnblogs.com/Belter/p/8536939.html
- https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html
- https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html
- https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html
- https://bbs.pinggu.org/thread-604958-1-1.html