基本线性回归
接下来用一个简单的项目代入线性回归模型。
任务定义
任务描述:使用线性回归模型预测房价。
数据集:Boston房价数据集,sklearn内置。
数据准备
数据字段说明:
- CRIM:各城镇的人均犯罪率
- ZN:规划地段超过25,000平方英尺的住宅用地比例
- INDUS:城镇非零售商业用地比例
- CHAS:是否在查尔斯河边(=1是)
- NOX:一氧化氮浓度(/千万分之一)
- RM:每个住宅的平均房间数
- AGE:1940年以前建造的自住房屋的比例
- DIS:到波士顿五个就业中心的加权距离
- RAD:放射状公路的可达性指数
- TAX:全部价值的房产税率(每1万美元)
- PTRATIO:按城镇分配的学生与教师比例
- B:1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
- LSTAT:较低地位人口
- Price:房价
from sklearn import datasets
boston = datasets.load_boston() # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y #输出预测值
boston_data.head()
模型构建
回归这个概念是19世纪80年代由英国统计学家郎西斯.高尔顿在研究父子身高关系提出来的,他发现:在同一族群中,子代的平均身高介于父代的身高以及族群的平均身高之间。具体而言,高个子父亲的儿子的身高有低于其父亲身高的趋势,而矮个子父亲的儿子身高则有高于父亲的身高的趋势。也就是说,子代的身高有向族群平均身高"平均"的趋势,这就是统计学上"回归"的最初含义。
回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。通常使用曲线/线来拟合数据点,目标是使曲线到数据点的距离差异最小。而线性回归就是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w :
假设:数据集
D
=
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
,
x
i
∈
R
p
,
y
i
∈
R
,
i
=
1
,
2
,
.
.
.
,
N
,
X
=
(
x
1
,
x
2
,
.
.
.
,
x
N
)
T
,
Y
=
(
y
1
,
y
2
,
.
.
.
,
y
N
)
T
D=(x_1,y_1),...,(x_N,y_N) ,x_i∈R^p,y_i∈R,i=1,2,...,N ,X=(x_1,x_2,...,x_N)^T,Y=(y_1,y_2,...,y_N)^T
D=(x1,y1),...,(xN,yN),xi∈Rp,yi∈R,i=1,2,...,N,X=(x1,x2,...,xN)T,Y=(y1,y2,...,yN)T
假设X和Y之间存在线性关系,模型的具体形式为
y
^
=
f
(
w
)
=
w
T
x
ŷ=f(w)=w^Tx
y^=f(w)=wTx
关于公式中将标量化为向量形式,我们可以举例:
y
=
w
0
+
w
1
x
1
+
w
2
x
2
y = w_0 + w_1x_1 + w_2x_2
y=w0+w1x1+w2x2
其中,
w
=
[
w
0
w
1
w
2
]
w=\left[ \begin{matrix} w_0 \\ w_1 \\ w_2 \end{matrix} \right]
w=⎣⎡w0w1w2⎦⎤,
x
=
[
1
x
1
x
2
]
x=\left[ \begin{matrix} 1 \\ x_1 \\ x_2 \end{matrix} \right]
x=⎣⎡1x1x2⎦⎤。
易化简为:
y
=
w
T
x
y=w^Tx
y=wTx
举例:现在我们取两个特征
X
=
x
1
,
x
2
X=x_1,x_2
X=x1,x2,假设
Y
Y
Y与
X
X
X存在线性关系,
Y
=
f
(
w
,
X
)
Y=f(w,X)
Y=f(w,X)构成如下图构成所示的图像。在Boston房价任务的语境下,
Y
Y
Y就是房价Price
的预测值。而图中的红点,代表了来自于数据集的房价Price
的真实值。
显然,我们发现红点到平面的距离代表了预测值和真实值的误差(只是其中一种表现误差的方案)。不妨设误差为
e
i
。
e_i。
ei。进一步来看,由于点分布与平面的上下,意味着误差有正负。为了做一个类似于归一化的工作,我们有两种方案。
一: ∑ i = 1 N e i 2 \sum_{i=1}^{N}e_i^2 ∑i=1Nei2,将误差平方后求和。
- 优点:在后续优化中,易通过求导,进而使用梯度下降法。
- 缺点:平方后,会放大越大的误差,缩小越小的误差。
二: ∑ i = 1 N ∣ e i ∣ \sum_{i=1}^{N}|e_i| ∑i=1N∣ei∣,取误差绝对值后求和。
- 优点:避免放大越大的误差,缩小越小的误差。
- 缺点:在后续优化中,很难通过求导优化参数,可能需要如模拟退火、遗传算法等智能算法进行优化。(注:遗传算法的理论总结可以看我码得另一篇:传送门~)
接下来我们将会选择第一种评估误差,也就是我们常用的MSE均方误差。关于均方误差的应用,初学的童鞋可以参考李宏毅老师的宝可梦task,会让你理解为什么我们要用这个东东。作为萌新,我也写了课程笔记:传送门~
评估误差(loss函数)
接下来的脑补对话是我关于loss函数意义的一丢丢思考~
为什么要评估误差?答:为了寻找最优的参数
W
W
W,以构造最优的模型。
参数
W
W
W是谁?答:在基本的线性回归模型语境下,它就是公式
y
^
=
f
(
w
)
=
w
T
x
ŷ=f(w)=w^Tx
y^=f(w)=wTx中的
w
w
w。
难道我们初设的模型不是最优的?答:从某种意义上来说,
y
y
y和
x
x
x都是已知量,而
w
w
w是未知量,实际上model是a set of function,我们需要通过评估模型输出的预测值与数据集给出的真实值的误差,来寻找合适的
w
w
w,当我们找到了最佳参数,显然由它所构造的
y
^
=
f
(
w
)
=
w
T
x
ŷ=f(w)=w^Tx
y^=f(w)=wTx就是best function。
sklearn关于评估的接口文档:地址。简要给出评估公式:
- MSE均方误差: M S E ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ( y i − y ^ i ) 2 MSE(y,ŷ )= \frac{1}{n_{samples}}∑^{n_{samples}−1}_{i=0}(y^i−ŷ ^i)^2 MSE(y,y^)=nsamples1∑i=0nsamples−1(yi−y^i)2
- MAE平均绝对误差: M A E ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ∣ y i − y ^ i ∣ MAE(y,ŷ )=\frac{1}{n_{samples}}∑^{n_{samples}−1}_{i=0}|y^i−ŷ ^i| MAE(y,y^)=nsamples1∑i=0nsamples−1∣yi−y^i∣
- R2决定系数: R 2 ( y , y ^ ) = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}i)^2}{\sum{i=1}^{n} (y_i - \bar{y})^2} R2(y,y^)=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2
- 解释方差得分: e x p l a i n e d v a r i a n c e ( y , y ^ ) = 1 − V a r y − y ^ V a r y explainedvariance(y,ŷ )=1−V_{ary}−ŷ V_{ary} explainedvariance(y,y^)=1−Vary−y^Vary
在上一节,我们提到将使用MSE作为评估指标。
现在我们如何构造loss函数?给出三种理解角度。
最小二乘法角度
再次提醒:我们需要衡量真实值
y
i
y_i
yi与线性回归模型的预测值
w
T
x
i
w^Tx_i
wTxi之间的差距,在这里我们和使用二范数的平方和L(w)来描述这种差距,即:
L
(
w
)
=
∑
i
=
1
N
∣
∣
w
T
x
i
−
y
i
∣
∣
2
2
=
∑
i
=
1
N
(
w
T
x
i
−
y
i
)
2
=
(
w
T
X
T
−
Y
T
)
(
w
T
X
T
−
Y
T
)
T
=
w
T
X
T
X
w
−
2
w
T
X
T
Y
+
Y
Y
T
L(w) = \sum\limits_{i=1}^{N}||w^Tx_i-y_i||_2^2=\sum\limits_{i=1}^{N}(w^Tx_i-y_i)^2 = (w^TX^T-Y^T)(w^TX^T-Y^T)^T = w^TX^TXw - 2w^TX^TY+YY^T
L(w)=i=1∑N∣∣wTxi−yi∣∣22=i=1∑N(wTxi−yi)2=(wTXT−YT)(wTXT−YT)T=wTXTXw−2wTXTY+YYT
现在给出具体推导过程:
L
(
w
)
=
∑
i
=
1
N
(
w
T
x
i
−
y
i
)
2
=
(
w
T
x
1
−
y
1
)
2
+
(
w
T
x
2
−
y
2
)
2
+
.
.
.
+
(
w
T
x
N
−
y
N
)
N
=
(
w
T
x
1
−
y
1
,
w
T
x
2
−
y
2
,
.
.
.
,
w
T
x
N
−
y
N
)
[
w
T
x
1
−
y
1
w
T
x
2
−
y
2
⋮
w
T
x
N
−
y
N
]
=
[
(
w
T
x
1
,
w
T
x
2
,
.
.
.
,
w
T
x
N
)
−
(
y
1
,
y
2
,
.
.
.
,
y
N
)
]
[
[
w
T
x
1
w
T
x
2
⋮
w
T
x
N
]
−
[
y
1
y
2
⋮
y
N
]
]
=
(
w
T
X
T
−
Y
T
)
(
w
T
X
T
−
Y
T
)
T
=
w
T
X
T
X
w
−
Y
T
X
w
−
w
T
X
T
Y
+
Y
T
Y
L(w) = \sum\limits_{i=1}^{N}(w^Tx_i-y_i)^2 =(w^Tx_1-y_1)^2+(w^Tx_2-y_2)^2+...+(w^Tx_N-y_N)^N \\ = (w^Tx_1-y_1,w^Tx_2-y_2,...,w^Tx_N-y_N)\left[ \begin{matrix} w^Tx_1-y_1 \\ w^Tx_2-y_2 \\ \vdots \\ w^Tx_N-y_N \end{matrix} \right] \\ =[(w^Tx_1,w^Tx_2,...,w^Tx_N)-(y_1,y_2,...,y_N)][\left[ \begin{matrix} w^Tx_1 \\ w^Tx_2 \\ \vdots \\ w^Tx_N \end{matrix} \right] - \left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_N \end{matrix} \right]] \\ =(w^TX^T-Y^T)(w^TX^T-Y^T)^T \\ =w^TX^TXw-Y^TXw-w^TX^TY+Y^TY
L(w)=i=1∑N(wTxi−yi)2=(wTx1−y1)2+(wTx2−y2)2+...+(wTxN−yN)N=(wTx1−y1,wTx2−y2,...,wTxN−yN)⎣⎢⎢⎢⎡wTx1−y1wTx2−y2⋮wTxN−yN⎦⎥⎥⎥⎤=[(wTx1,wTx2,...,wTxN)−(y1,y2,...,yN)][⎣⎢⎢⎢⎡wTx1wTx2⋮wTxN⎦⎥⎥⎥⎤−⎣⎢⎢⎢⎡y1y2⋮yN⎦⎥⎥⎥⎤]=(wTXT−YT)(wTXT−YT)T=wTXTXw−YTXw−wTXTY+YTY
其中,
Y
T
X
w
Y^TXw
YTXw和
w
T
X
T
Y
w^TX^TY
wTXTY都是一个实数(可以设
w
w
w、
X
X
X和
Y
Y
Y的维度分别为n x 1
、n x n
和n x 1
,代入计算即可证明),对于实数
a
a
a,
a
T
=
a
a^T = a
aT=a,即
Y
T
X
w
=
(
Y
T
X
w
)
T
=
w
T
X
T
Y
Y^TXw = (Y^TXw)^T = w^TX^TY
YTXw=(YTXw)T=wTXTY。同理,
Y
T
Y
=
(
Y
T
Y
)
T
=
Y
Y
T
Y^TY=(Y^TY)^T=YY^T
YTY=(YTY)T=YYT。因此,继续化简得到最终结果:
L
(
w
)
=
w
T
X
T
X
w
−
2
w
T
X
T
Y
+
Y
Y
T
L(w) =w^TX^TXw - 2w^TX^TY+YY^T
L(w)=wTXTXw−2wTXTY+YYT
因此,我们需要找到使得
L
(
w
)
L(w)
L(w)最小时对应的参数
w
w
w,即:
w
^
=
a
r
g
min
L
(
w
)
\hat{w} = arg\, \min L(w)
w^=argminL(w)
为了达到求解最小化
L
(
w
)
L(w)
L(w)问题,我们应用高等数学的知识,使用求导来解决这个问题:
∂
L
(
w
)
∂
w
=
2
X
T
X
w
−
2
X
T
Y
=
0
\ \frac{\partial L(w)}{\partial w} = 2X^TXw-2X^TY = 0
∂w∂L(w)=2XTXw−2XTY=0
得到
X
T
X
w
=
X
T
Y
X^TXw=X^TY
XTXw=XTY
等式两边同时左乘
(
X
T
X
)
−
1
(X^TX)^{-1}
(XTX)−1,化简得到
w
^
=
(
X
T
X
)
−
1
X
T
Y
\hat{w} = (X^TX)^{-1}X^TY
w^=(XTX)−1XTY
注意:此时,假设
(
X
T
X
)
(X^TX)
(XTX)可逆。如果不能求逆,这就涉及到最优化中的对偶问题啦~这里暂时不做深入探讨,烦请谅解。而在实际应用中,求逆和求导是一件非常难的事情,那如何得到最优参数
w
w
w呢?可以使用梯度下降法,我们不需要直接令偏导为0,而是仅通过求一阶偏导组成的梯度,辅以学习率,一步一步接近最优结果(但愿~)。
线性代数角度
还可以从线性代数的角度理解评估误差。比如,我们依旧按照上图给出的假设:取两个特征
X
=
x
1
,
x
2
X=x_1,x_2
X=x1,x2,假设
Y
Y
Y与
X
X
X存在线性关系,
Y
=
f
(
w
,
X
)
Y=f(w,X)
Y=f(w,X)构成图像。请大家切换到向量的思维方式,此时,真实值(也就是那个红点点~)用向量表示,相当于从原点出发到达该红点,也就是下图的红
y
y
y箭头。而向量
y
y
y到由
X
=
x
1
,
x
2
X=x_1,x_2
X=x1,x2组成的平面的距离,相当于真实值和预测值的误差。那么这个距离就是平面的法向量,即图示的2⃣️。显然,根据向量加法,我们还需要求得向量1⃣️。我们发现向量1⃣️就是由
x
1
x_1
x1和
x
2
x_2
x2的线性组合,我们不妨设向量1⃣️为
w
1
x
1
+
w
2
x
2
=
X
w
w_1x_1+w_2x_2=Xw
w1x1+w2x2=Xw,因此法向量2⃣️可以表示为
Y
−
X
w
Y - Xw
Y−Xw
又因为法向量与
X
=
x
1
,
x
2
X=x_1,x_2
X=x1,x2的平面垂直,所以根据
<
a
,
b
>
=
a
⋅
b
=
a
T
b
=
0
<a,b>= a·b=a^Tb= 0
<a,b>=a⋅b=aTb=0得到:
X
T
(
Y
−
X
w
)
=
0
X^T(Y - Xw)=0
XT(Y−Xw)=0
即:
w
=
(
X
T
X
)
−
1
X
T
Y
w=(X^TX)^{-1}X^TY
w=(XTX)−1XTY
数理统计角度
假设存在噪声
ϵ
∼
N
(
0
,
σ
2
)
\epsilon \sim N(0,\sigma^2)
ϵ∼N(0,σ2),则
y
i
=
f
(
w
,
x
i
)
+
ϵ
i
y_i=f(w,x_i)+\epsilon_i
yi=f(w,xi)+ϵi,如下图所示。
此时有n个样本,每个样本概率为
P
(
y
i
∣
x
i
;
w
)
P(y_i|x_i;w)
P(yi∣xi;w),由于
ϵ
∼
N
(
0
,
σ
2
)
\epsilon \sim N(0,\sigma^2)
ϵ∼N(0,σ2)且
P
(
y
i
∣
x
i
;
w
)
=
P
(
w
T
x
i
+
ϵ
i
)
P(y_i|x_i;w)=P(w^Tx_i + \epsilon_i)
P(yi∣xi;w)=P(wTxi+ϵi) ,因此根据正态分布性质,
y
i
∣
x
i
∼
N
(
w
T
x
,
σ
2
)
y_i|x_i \sim N(w^Tx,\sigma^2)
yi∣xi∼N(wTx,σ2)。(注:
w
T
x
i
w^Tx_i
wTxi是常数,与
ϵ
\epsilon
ϵ累加使得均值发生偏移)
现在利用极大似然估计对参数
w
w
w进行估计:
L
(
w
)
=
l
o
g
P
(
Y
∣
X
;
w
)
=
l
o
g
∏
i
=
1
N
P
(
y
i
∣
x
i
;
w
)
=
∑
i
=
1
N
l
o
g
P
(
y
i
∣
x
i
;
w
)
=
∑
i
=
1
N
l
o
g
(
1
2
π
σ
e
x
p
(
−
(
y
i
−
w
T
x
i
)
2
2
σ
2
)
)
=
∑
i
=
1
N
[
l
o
g
(
1
2
π
σ
)
−
1
2
σ
2
(
y
i
−
w
T
x
i
)
2
]
a
r
g
max
w
L
(
w
)
=
a
r
g
min
w
[
l
(
w
)
=
∑
i
=
1
N
(
y
i
−
w
T
x
i
)
2
]
L(w)=log P(Y|X;w)=log∏_{i=1}^NP(y_i|x_i;w)=∑_{i=1}^NlogP(y_i|x_i;w) =∑_{i=1}^Nlog(\frac{1}{\sqrt{2πσ}}exp(−\frac{(y_i−w^Tx_i)^2}{2σ^2}))=∑_{i=1}^N[log(\frac{1}{\sqrt{2πσ}})−\frac{1}{2σ^2}(y_i−w^Tx_i)^2] \\ arg\, \max_wL(w)=arg\, \min_w[l(w)=∑_{i=1}^N(y_i−w^Tx_i)^2]
L(w)=logP(Y∣X;w)=logi=1∏NP(yi∣xi;w)=i=1∑NlogP(yi∣xi;w)=i=1∑Nlog(2πσ1exp(−2σ2(yi−wTxi)2))=i=1∑N[log(2πσ1)−2σ21(yi−wTxi)2]argwmaxL(w)=argwmin[l(w)=i=1∑N(yi−wTxi)2]
又回到了最初的起点~与线性回归的最小二乘估计一致!
总结:线性回归的最小二乘估计<==>噪声
ϵ
∼
N
(
0
,
σ
2
)
\epsilon \sim N(0,\sigma^2)
ϵ∼N(0,σ2)的极大似然估计。
优化方案(梯度下降)
接下来给出一种优化loss函数的方案:基本的梯度下降法~参考李宏毅老师的宝可梦task实例。
假设我们得到了优化等式:
f
∗
=
a
r
g
min
f
L
(
f
)
w
∗
,
b
∗
=
a
r
g
min
w
,
b
L
(
w
,
b
)
=
a
r
g
min
w
,
b
∑
n
=
1
N
(
y
^
n
−
(
b
+
w
⋅
x
c
p
n
)
)
2
f^* = arg\, \min_{f} L(f) \\ w^*,b^*= arg\, \min_{w,b} L(w,b) = arg\, \min_{w,b} \sum_{n=1}^{N}(\hat{y}^n - (b + w·x_{cp}^n))^2
f∗=argfminL(f)w∗,b∗=argw,bminL(w,b)=argw,bminn=1∑N(y^n−(b+w⋅xcpn))2
此时我们该如何优化它?搬出我们大名鼎鼎的Gradient Descent,又名梯度下降法。关于梯度可以看本人总结的另一篇——机器学习高等数学基础——多元微分总结。这里我们直接阐述优化过程。
Task1:只有一个参数w
此时等式变为:
w
∗
=
a
r
g
min
w
L
(
w
)
w^* = arg\, \min_{w} L(w)
w∗=argwminL(w)
-
随机选取初始点 w 0 w^0 w0
-
计算 d L d w ∣ w = w 0 \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^0} dwdL∣w=w0
更新函数点:
w 1 ← w 0 − η d L d w ∣ w = w 0 w^1 \leftarrow \, w^0 - \eta \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^0} w1←w0−ηdwdL∣w=w0
-
计算 d L d w ∣ w = w 1 \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^1} dwdL∣w=w1
更新函数点:
w 2 ← w 1 − η d L d w ∣ w = w 1 w^2 \leftarrow \, w^1 - \eta \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^1} w2←w1−ηdwdL∣w=w1 -
以此类推,迭代。直到找到loss函数最小值处,算法结束。
Task2:有两个参数w和b
- 随机选取初始点 w 0 w^0 w0和 b 0 b^0 b0
- 计算
∂
L
∂
w
∣
w
=
w
0
,
b
=
b
0
\frac{\partial L}{\partial w}|_{w = w^0,b=b^0}
∂w∂L∣w=w0,b=b0和
∂
L
∂
b
∣
w
=
w
0
,
b
=
b
0
\frac{\partial L}{\partial b}|_{w = w^0,b=b^0}
∂b∂L∣w=w0,b=b0
更新函数点:
w 1 ← w 0 − η ∂ L ∂ w ∣ w = w 0 , b = b 0 b 1 ← b 0 − η ∂ L ∂ b ∣ w = w 0 , b = b 0 w^1 \leftarrow \, w^0 - \eta \frac{\partial L}{\partial w}|_{w = w^0,b=b^0} \\ b^1 \leftarrow \, b^0 - \eta \frac{\partial L}{\partial b}|_{w = w^0,b=b^0} w1←w0−η∂w∂L∣w=w0,b=b0b1←b0−η∂b∂L∣w=w0,b=b0 - 以此类推,迭代。直到找到loss函数最小值处,算法结束。
总结
梯度公式:
∇
L
=
[
∂
L
∂
w
∂
L
∂
b
]
\nabla L = \left[ \begin{matrix} \frac{\partial L}{\partial w} \\ \frac{\partial L}{\partial b}\end{matrix} \right]
∇L=[∂w∂L∂b∂L]
优化方向如图所示:
代码
调用sklearn
中的linear_model.LinearRegression()
接口,这里来说明linear_model.LinearRegression()
接口:地址。
from sklearn import linear_model # 引入线性回归方法
lin_reg = linear_model.LinearRegression() # 创建线性回归的类
lin_reg.fit(X,y) # 输入特征X和因变量y进行训练
print("模型系数:",lin_reg.coef_) # 输出模型的系数W
print("模型得分:",lin_reg.score(X,y)) # 输出模型的决定系数R^2