Content
线性回归的原理
线性回归的一般形式
有数据集
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
}
\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}
{(x1,y1),(x2,y2),...,(xn,yn)},其中,
x
i
=
(
x
i
1
;
x
i
2
;
x
i
3
;
.
.
.
;
x
i
d
)
,
y
i
∈
R
x_i = (x_{i1};x_{i2};x_{i3};...;x_{id}),y_i\in R
xi=(xi1;xi2;xi3;...;xid),yi∈R
其中n表示变量的数量,d表示每个变量的维度。
可以用以下函数来描述y和x之间的关系:
f
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
d
x
d
=
∑
i
=
0
d
θ
i
x
i
\begin{aligned} f(x) &= \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_dx_d \\ &= \sum_{i=0}^{d}\theta_ix_i \\ \end{aligned}
f(x)=θ0+θ1x1+θ2x2+...+θdxd=i=0∑dθixi
如何来确定
θ
\theta
θ的值,使得
f
(
x
)
f(x)
f(x)尽可能接近y的值呢?均方误差是回归中常用的性能度量,即:
J
(
θ
)
=
1
n
∑
i
=
1
n
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta)=\frac{1}{n}\sum_{i=1}^{n}(h_{\theta}(x^{(i)})-y^{(i)})^2
J(θ)=n1i=1∑n(hθ(x(i))−y(i))2
我们可以选择
θ
\theta
θ,让均方误差最小化:
概率角度诠释(极大似然估计)
极大似然估计实质就是对于不同的分布,求出似然函数,函数可求导则直接求导,不可求导则取对数,然后计算似然最大情况下的参数最优值!!
下面我们用极大似然估计,来解释为什么要用均方误差作为性能度量。
我们可以把目标值和变量写成如下等式:
y
(
i
)
=
θ
T
x
(
i
)
+
ϵ
(
i
)
y^{(i)} = \theta^T x^{(i)}+\epsilon^{(i)}
y(i)=θTx(i)+ϵ(i)
ϵ
\epsilon
ϵ表示我们未观测到的变量的印象,即随机噪音。我们假定
ϵ
\epsilon
ϵ是独立同分布,服从高斯分布(正态分布)。(根据中心极限定理)
正态分布:
位置参数为
μ
\mu
μ 、尺度参数
σ
\sigma
σ的正态分布为
f
(
x
)
=
1
2
π
σ
e
x
p
(
−
(
x
−
μ
)
2
2
σ
2
)
f(x) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
f(x)=2πσ1exp(−2σ2(x−μ)2)
则
p
(
ϵ
(
i
)
)
=
1
2
π
σ
e
x
p
(
−
(
ϵ
(
i
)
)
2
2
σ
2
)
p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(\epsilon^{(i)})^2}{2\sigma^2}\right)
p(ϵ(i))=2πσ1exp(−2σ2(ϵ(i))2)
因此:
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
1
2
π
σ
e
x
p
(
−
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
2
σ
2
)
p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right)
p(y(i)∣x(i);θ)=2πσ1exp(−2σ2(y(i)−θTx(i))2)
我们建立极大似然函数,即描述数据遵从当前样本分布的概率分布函数。由于样本的数据集独立同分布,因此可以写成
L
(
θ
)
=
p
(
y
⃗
∣
X
;
θ
)
=
∏
i
=
1
n
1
2
π
σ
e
x
p
(
−
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
2
σ
2
)
L(\theta) = p(\vec y | X;\theta) = \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right)
L(θ)=p(y∣X;θ)=i=1∏n2πσ1exp(−2σ2(y(i)−θTx(i))2)
选择
θ
\theta
θ,使得似然函数最大化,这就是极大似然估计的思想。
为了方便计算,我们计算时通常对对数似然函数求最大值:
l
(
θ
)
=
l
o
g
L
(
θ
)
=
l
o
g
∏
i
=
1
n
1
2
π
σ
e
x
p
(
−
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
2
σ
2
)
=
∑
i
=
1
n
l
o
g
1
2
π
σ
e
x
p
(
−
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
2
σ
2
)
=
n
l
o
g
1
2
π
σ
−
1
σ
2
⋅
1
2
∑
i
=
1
n
(
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
\begin{aligned} l(\theta) &= log L(\theta) = log \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2} {2\sigma^2}\right) \\ & = \sum^n_{i=1}log\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) \\ & = nlog\frac{1}{{\sqrt{2\pi}\sigma}} - \frac{1}{\sigma^2} \cdot \frac{1}{2}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2 \end{aligned}
l(θ)=logL(θ)=logi=1∏n2πσ1exp(−2σ2(y(i)−θTx(i))2)=i=1∑nlog2πσ1exp(−2σ2(y(i)−θTx(i))2)=nlog2πσ1−σ21⋅21i=1∑n((y(i)−θTx(i))2
显然,最大化
l
(
θ
)
l(\theta)
l(θ)即最小化
1
n
∑
i
=
1
n
(
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
\frac{1}{n}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2
n1∑i=1n((y(i)−θTx(i))2。
这一结果即均方误差,因此用这个值作为代价函数来优化模型在统计学的角度是合理的。
线性回归损失函数、代价函数、目标函数
- 损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。
- 代价函数(Cost Function):度量全部样本集的平均误差。
- 目标函数(Object Function):代价函数和正则化函数,最终要优化的函数。
常用的损失函数包括:0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等;
常用的代价函数包括均方误差、均方根误差、平均绝对误差等。
对于目标函数来说在有约束条件下的最小化就是损失函数(loss function)
上图函数分别为
f
1
,
f
2
,
f
3
:
f_1,f_2,f_3:
f1,f2,f3:
f
1
=
θ
0
+
θ
1
x
f
2
=
θ
0
+
θ
1
x
+
θ
2
x
2
f
3
=
θ
0
+
θ
1
x
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
f_1=\theta_0+\theta_1x\\f_2=\theta_0+\theta_1x+\theta_2x^2\\f_3=\theta_0+\theta_1x\theta_2x^2+\theta_3x^3+\theta_4x^4
f1=θ0+θ1xf2=θ0+θ1x+θ2x2f3=θ0+θ1xθ2x2+θ3x3+θ4x4
我们给定
x
x
x ,这三个函数都会输出一个
f
(
X
)
f(X)
f(X),这个输出的
f
(
X
)
f(X)
f(X)与真实值
Y
Y
Y可能是相同的,也可能是不同的,为了表示我们拟合的好坏,我们就用一个函数来度量拟合的程度,比如:
L
(
Y
,
f
(
X
)
)
=
(
Y
−
f
(
X
)
)
2
L(Y,f(X)) = (Y-f(X))^2
L(Y,f(X))=(Y−f(X))2这个函数就称为损失函数(loss function)。损失函数越小,就代表模型拟合的越好。
那是不是我们的目标就只是让loss function越小越好呢?还不是。这个时候还有一个概念叫风险函数(risk function)。风险函数是损失函数的期望,这是由于我们输入输出的 ( X , Y ) (X,Y) (X,Y) 遵循一个联合分布,但是这个联合分布是未知的,所以无法计算。但是我们是有历史数据的,就是我们的训练集, f ( X ) f(X) f(X) 关于训练集的平均损失称作经验风险(empirical risk),即 1 N ∑ i = 1 N L ( y i , f ( x i ) ) \frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i})) N1∑i=1NL(yi,f(xi)) ,所以我们的目标就是最小化 1 N ∑ i = 1 N L ( y i , f ( x i ) ) \frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i})) N1∑i=1NL(yi,f(xi)) ,即为代价函数,这称为经验风险最小化。
如果到这一步就完了的话,那我们看上面的图,那肯定是最右面的
f
3
(
x
)
f_3(x)
f3(x) 的经验风险函数最小了,因为它对历史的数据拟合的最好。但是我们从图上来看
f
3
(
x
)
f_3(x)
f3(x)肯定不是最好的,因为它过度学习历史数据,导致它在真正预测时效果会很不好,这种情况称为过拟合(over-fitting)。当训练集本身存在噪声时,拟合曲线对未知影响因素的拟合往往不是最好的。 通常,随着模型复杂度的增加,训练误差会减少;但测试误差会先增加后减小。我们的最终目的时试测试误差达到最小,这就是我们为什么需要选取适合的目标函数的原因。为什么会造成过拟合?因为它的函数太复杂了,都有四次方了,这就引出了下面的概念,我们不仅要让经验风险最小化,还要让结构风险最小化。这个时候就定义了一个函数
J
(
f
)
J(f)
J(f) ,这个函数专门用来度量模型的复杂度,在机器学习中也叫正则化(regularization)。常用的有
L
1
L_1
L1 ,
L
2
L_2
L2 范数。
参考:L0、L1、L2范数在机器学习中的应用
到这一步我们就可以说我们最终的优化函数是:
m
i
n
1
N
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
+
λ
J
(
f
)
min\frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i}))+\lambda J(f)
minN1i=1∑NL(yi,f(xi))+λJ(f) 即最优化经验风险和结构风险,而这个函数就被称为目标函数。
结合上面的例子来分析:最左面的 f 1 ( x ) f_1(x) f1(x) 结构风险最小(模型结构最简单),但是经验风险最大(对历史数据拟合的最差);最右面的 f 3 ( x ) f_3(x) f3(x) 经验风险最小(对历史数据拟合的最好),但是结构风险最大(模型结构最复杂);而 f 2 ( x ) f_2(x) f2(x) 达到了二者的良好平衡,最适合用来预测未知数据集。
线性回归的优化方法
梯度下降法
从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。那么,如果想计算一个函数的最小值,就可以使用梯度下降法的思想来做。
设定初始参数
θ
\theta
θ,不断迭代,使得
J
(
θ
)
J(\theta)
J(θ)最小化:
θ
j
:
=
θ
j
−
α
∂
J
(
θ
)
∂
θ
\theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta}
θj:=θj−α∂θ∂J(θ)
∂
J
(
θ
)
∂
θ
=
∂
∂
θ
j
1
2
∑
i
=
1
n
(
f
θ
(
x
)
(
i
)
−
y
(
i
)
)
2
=
2
∗
1
2
∑
i
=
1
n
(
f
θ
(
x
)
(
i
)
−
y
(
i
)
)
∗
∂
∂
θ
j
(
f
θ
(
x
)
(
i
)
−
y
(
i
)
)
=
∑
i
=
1
n
(
f
θ
(
x
)
(
i
)
−
y
(
i
)
)
∗
∂
∂
θ
j
(
∑
j
=
0
d
θ
j
x
j
(
i
)
−
y
(
i
)
)
)
=
∑
i
=
1
n
(
f
θ
(
x
)
(
i
)
−
y
(
i
)
)
x
j
(
i
)
\begin{aligned} \frac{\partial{J(\theta)}}{\partial\theta} &= \frac{\partial}{\partial\theta_j}\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})^2 \\ &= 2*\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(f_\theta(x)^{(i)}-y^{(i)}) \\ &= \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(\sum_{j=0}^{d}\theta_jx_j^{(i)}-y^{(i)}))\\ &= \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})x_j^{(i)} \\ \end{aligned}
∂θ∂J(θ)=∂θj∂21i=1∑n(fθ(x)(i)−y(i))2=2∗21i=1∑n(fθ(x)(i)−y(i))∗∂θj∂(fθ(x)(i)−y(i))=i=1∑n(fθ(x)(i)−y(i))∗∂θj∂(j=0∑dθjxj(i)−y(i)))=i=1∑n(fθ(x)(i)−y(i))xj(i)
即:
θ
j
=
θ
j
+
α
∑
i
=
1
n
(
y
(
i
)
−
f
θ
(
x
)
(
i
)
)
x
j
(
i
)
\theta_j = \theta_j + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x_j^{(i)}
θj=θj+αi=1∑n(y(i)−fθ(x)(i))xj(i)
注:下标j表示第j个参数,上标i表示第i个数据点。
将所有的参数以向量形式表示,可得:
批梯度下降法:
θ
=
θ
+
α
∑
i
=
1
n
(
y
(
i
)
−
f
θ
(
x
)
(
i
)
)
x
(
i
)
\theta = \theta + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x^{(i)}
θ=θ+αi=1∑n(y(i)−fθ(x)(i))x(i)
由于这个方法中,参数在每一个数据点上同时进行了移动。
对应的,我们可以每一次让参数只针对一个数据点进行移动,即:
随机梯度下降法:
θ
=
θ
+
α
(
y
(
i
)
−
f
θ
(
x
)
(
i
)
)
x
(
i
)
\theta = \theta + \alpha(y^{(i)}-f_\theta(x)^{(i)})x^{(i)}
θ=θ+α(y(i)−fθ(x)(i))x(i)
随机梯度下降法的好处是,当数据点很多时,运行效率更高;缺点是,因为每次只针对一个样本更新参数,未必找到最快路径达到最优值,甚至有时候会出现参数在最小值附近徘徊而不是立即收敛。但当数据量很大的时候,随机梯度下降法经常优于批梯度下降法。
凸函数: 内部两点连线不可能经过第三点,函数只能取到一个极值,要么极大值要么极小值。
当J为凸函数时,梯度下降法相当于让参数
θ
\theta
θ不断向J的最小值位置移动。
梯度下降法的缺陷:如果函数为非凸函数,有可能找到的并非全局最优值,而是局部最优值。
最小二乘法矩阵求解
详见CS229视频中吴恩达的推导
牛顿法
牛顿法的收敛速度非常快,但海森矩阵的计算较为复杂,尤其当参数的维度很多时,会耗费大量计算成本。我们可以用其他矩阵替代海森矩阵,用拟牛顿法进行估计。
拟牛顿法
H
H
H是
J
(
θ
)
J(\theta)
J(θ)的海森矩阵,
H
i
j
=
∂
2
l
(
θ
)
∂
θ
i
∂
θ
j
H_{ij} = \frac{\partial ^2l(\theta)}{\partial\theta_i\partial\theta_j}
Hij=∂θi∂θj∂2l(θ)
拟牛顿法的思路是用一个矩阵替代计算复杂的海森矩阵H,因此要找到符合H性质的矩阵。
常用的拟牛顿法的算法包括DFP,BFGS等,作为拓展。
线性回归的评价指标
均方误差(MSE): 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2 m1∑i=1m(y(i)−y^(i))2
均方根误差(RMSE): M S E = 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \sqrt{MSE} = \sqrt{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2} MSE=m1∑i=1m(y(i)−y^(i))2
平均绝对误差(MAE): 1 m ∑ i = 1 m ∣ ( y ( i ) − y ^ ( i ) ∣ \frac{1}{m}\sum^{m}_{i=1} | (y^{(i)} - \hat y^{(i)} | m1∑i=1m∣(y(i)−y^(i)∣
但以上评价指标在未进行量化归一处理时会存在误差值差别大的问题,最常用的指标是 R 2 R^2 R2,可以避免量纲不一致问题
R 2 : = 1 − ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 ∑ i = 1 m ( y ˉ − y ^ ( i ) ) 2 = 1 − 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 1 m ∑ i = 1 m ( y ˉ − y ^ ( i ) ) 2 = 1 − M S E V A R R^2: = 1-\frac{\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} =1-\frac{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\frac{1}{m}\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} = 1-\frac{MSE}{VAR} R2:=1−∑i=1m(yˉ−y^(i))2∑i=1m(y(i)−y^(i))2=1−m1∑i=1m(yˉ−y^(i))2m1∑i=1m(y(i)−y^(i))2=1−VARMSE
我们可以把 R 2 R^2 R2理解为,回归模型可以成功解释的数据方差部分在数据固有方差中所占的比例, R 2 R^2 R2越接近1,表示可解释力度越大,模型拟合的效果越好。
sklearn.linear_model参数详解:
fit_intercept : 默认为True,是否计算该模型的截距。如果使用中心化的数据,可以考虑设置为False,不考虑截距。注意这里是考虑,一般还是要考虑截距
normalize: 默认为false. 当fit_intercept设置为false的时候,这个参数会被自动忽略。如果为True,回归器会标准化输入参数:减去平均值,并且除以相应的二范数。当然啦,在这里还是建议将标准化的工作放在训练模型之前。通过设置sklearn.preprocessing.StandardScaler来实现,而在此处设置为false
copy_X : 默认为True, 否则X会被改写
n_jobs: int 默认为1. 当-1时默认使用全部CPUs ??(这个参数有待尝试)
可用属性:
coef_: 训练后的输入端模型系数,如果label有两个,即y值有两列。那么是一个2D的array
intercept_: 截距
可用的methods:
fit(X,y,sample_weight=None):
X: array, 稀疏矩阵 [n_samples,n_features]
y: array [n_samples, n_targets]
sample_weight: 权重 array [n_samples]
在版本0.17后添加了sample_weight
get_params(deep=True): 返回对regressor 的设置值
predict(X): 预测 基于 R^2值
score: 评估
参考:参数详解