一、过拟合
1.1 过拟合基本概念
线性回归和逻辑回归可以有效的解决很多问题,但是当他们应用到某些特定的机器学习任务中时,可能会遇到过拟合的问题,导致实际的表现并不好,所以这里对过拟合进行介绍。
首先我们仍然是以线性回归预测房价来说明过拟合,对于如下的房子面积和价格之间的关系,我们可以建立不同的假设函数模型来对数据进行拟合。
如下所示,我们分别使用三种不同的假设函数来拟合数据点:
- 第一种是一次函数 θ 0 + θ 1 x \theta_0 + \theta_1 x θ0+θ1x,从数据的拟合可以看出,房子的价格会随着房子面积不断增大,但是数据实际是越来越趋于平缓,所以算法并不能很好的拟合数据,我们称这种问题为 欠拟合(underfitting),也称这个算法具有 高偏差(high bias)。这表示模型对真实数据的拟合存在很大的偏差,从而造成模型与实际不符。
- 第二种加入了一个二阶项,假设函数为 θ 0 + θ 1 x + θ 2 x 2 \theta_0 + \theta_1x + \theta_2x^2 θ0+θ1x+θ2x2,我们可以看出利用这个函数可以很好的拟合数据。
- 第三种是利用四阶多项式 θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 \theta_0 + \theta_1x + \theta_2 x^2 + \theta_3 x^3 + \theta_4x^4 θ0+θ1x+θ2x2+θ3x3+θ4x4 作为假设函数,其中包含五个参数,我们可能得到一条经过所有数据点的曲线,该曲线对训练集的拟合非常好,但是由于其并不符合真实的数据分布,我们称其为 过拟合(overfitting),也称为该算法具有 高方差(high variance)。
过拟合:训练得到的假设能够很好的拟合训练集,也就是在训练集上损失函数可能很接近 0,但是在应用到新样本时会出现很大的误差,模型适应新样本的能力称为 泛化 性能。所以过拟合也可以表现为在训练集上效果很好,但是泛化能力很差。
同样的情况也会出现在逻辑回归中,如下图所示,左边的模型并不能很好的表示决策边界,所以是一个欠拟合的模型,右边的模型对训练集的拟合过于精准,会造成泛化能力下降,因此是一个 过拟合 的模型。
1.2 过拟合的解决方法
过拟合的解决办法:
-
减少特征量的个数
当一个训练集中,样本的数目小于特征量的个数时候,会导致过拟合的产生,因为特征量太多了,所以可以很好的拟合少量的样本。为了解决这一类原因导致的过拟合,我们可以人为的去除一部分不太重要的特征量;或者可以使用某些模型来自动的选择有用的特征量。减少特征量可能出现的问题就是会舍弃一部分关于问题的信息,这就需要我们对要舍弃的特征进行很好的衡量。
-
正则化(Regularization)
正则化是保留所有的特征量,但是减少特征量的量级,或者减少参数 θ \theta θ 值的大小。这对于多特征量的情况很友好,通过比较小的参数,我们就可以控制某个特征量对整体的影响在很小的范围内,从而避免过拟合的发生。
二、正则化
2.1 正则化的概念
如下图所示,对于不同的假设函数,我们会得到不同的拟合曲线,过拟合的曲线因为参数项过多,导致泛化性能下降。代价函数可以表示为:
min
θ
1
2
m
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
2
\min_\theta \frac{1}{2m}\sum_{i=1}^m \left[ h_\theta(x^{(i)}) - y^{(i)}\right]^2
θmin2m1i=1∑m[hθ(x(i))−y(i)]2
上面我们说,可以通过正则化减少参数 θ \theta θ 的值来避免过拟合,现在我们假设在代价函数中加入惩罚项使得过拟合的曲线 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \theta_4x^4 hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4 中 θ 3 \theta_3 θ3 和 θ 4 \theta_4 θ4 尽可能小,如下所示:
min θ [ 1 2 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] 2 + 1000 θ 3 2 + 1000 θ 4 2 ] \min_\theta \left[\frac{1}{2m}\sum_{i=1}^m \left[ h_\theta(x^{(i)}) - y^{(i)}\right]^2 + 1000\ \theta_3^2 + 1000\ \theta_4^2 \right] θmin[2m1i=1∑m[hθ(x(i))−y(i)]2+1000 θ32+1000 θ42]
因为我们加入的两个惩罚项的系数都比较大,那么如果想让整体最小,唯一的方法就是使 θ 3 ≈ 0 , θ 4 ≈ 0 \theta_3 \approx 0,\theta_4 \approx 0 θ3≈0,θ4≈0,这样最后我们的到的假设函数就可以忽略后面的两项,变为 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 \sout{+\theta_3 x^3 + \theta_4x^4} hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4。
可以发现,原本有四项的假设函数因此退变为一个二次函数,这个二次函数和左边的拟合度很好的假设函数形式相同,这样原有蓝色的假设函数就转变为拟合度更好的红色曲线,这就实现了从过拟合到最佳曲线。
上面的例子就是利用正则化的思想来避免曲线过拟合,当参数 θ 0 , θ 2 , ⋯ , θ n \theta_0,\theta_2,\cdots,\theta_n θ0,θ2,⋯,θn 都是比较小的值时,我们就能够实现简化假设函数(上面从四次函数变为了二次函数)、避免过拟合。结果表明,参数 θ \theta θ 越小,得到的曲线就越平滑,越不容易出现过拟合。将对应的 θ \theta θ 参数取尽可能小也不会因丢弃某些特征导致信息的丢失,这也减少了因减少特征量造成的误差。
更一般的,如果一个数据集中有
100
100
100 个特征
x
1
,
x
2
,
⋯
,
x
100
x_1,x_2,\cdots,x_{100}
x1,x2,⋯,x100,那么
θ
\theta
θ 参数就包含
θ
0
,
θ
1
,
⋯
,
θ
100
\theta_0,\theta_1,\cdots,\theta_{100}
θ0,θ1,⋯,θ100 一共 101 个元素,通常我们很难预先选出哪些特征是不重要的,这样我们就不能够选择哪些参数
θ
\theta
θ 来缩小它们的值,所以就需要修改代价函数,来缩小所有参数
θ
\theta
θ 的值,将整体的值都尽可能小,就能让整个曲线更平滑,避免过拟合。新的代价函数如下:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left[ h_\theta(x^{(i)}) - y^{(i)} \right]^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]
J(θ)=2m1[i=1∑m[hθ(x(i))−y(i)]2+λj=1∑nθj2]
通过后面新加入的正则项,我们就可以缩小每个参数 θ \theta θ 的值。正则项中 θ 2 \theta^2 θ2 是为了消除符号对整体的影响。
正则项中不包含 θ 0 \theta_0 θ0 项,这是一种习惯,是否包含对整个结果没有影响。 λ \lambda λ 不仅可以用来控制其中的假设函数更好的拟合训练集,而且还能保证参数 θ \theta θ 尽可能地小,从而避免过拟合。
通过正则项,我们可以将下图蓝色地拟合曲线变为更加平滑、简单的红色曲线,从而得到一个更好的假设模型。
我们是通过选择一个较大的
λ
\lambda
λ 来使参数
θ
\theta
θ 尽可能小,但是对于
λ
\lambda
λ 的选择,我们也不能选择的太大,这样会造成所有的
θ
i
≈
0
\theta_i \approx 0
θi≈0,这时我们的假设函数所有的特征项都忽略掉了,最后得到
h
θ
(
x
)
=
θ
0
h_\theta(x)=\theta_0
hθ(x)=θ0 ,也就是只剩一个常数项,这时的拟合曲线就只有如下的一条水平直线,这样得到的拟合曲线也是不符合要求的。
2.2 线性回归正则化
对于线性回归,求解代价函数最小值的方法包括两种,分别为梯度下降和正规方程,这里我们将这两种方法推广到正则化线性回归。
2.2.1 正则化线性回归的梯度下降算法
相比于线性回归的代价函数,正则化线性回归的代价函数变为:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left[ h_\theta(x^{(i)}) - y^{(i)} \right]^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]
J(θ)=2m1[i=1∑m[hθ(x(i))−y(i)]2+λj=1∑nθj2]
类比于之前的梯度下降,我们首先求解
∂
∂
θ
0
J
(
θ
)
\frac{\partial}{\partial\theta_0}J(\theta)
∂θ0∂J(θ) ,因为正则项中不包含
θ
0
\theta_0
θ0 部分,所以对
θ
0
\theta_0
θ0 的更新方式如下,这和线性回归中的更新方式相同,因为正则化代价函数的正则项没有
θ
0
\theta_0
θ0 ,所以对
J
(
θ
)
J(\theta)
J(θ) 求
θ
0
\theta_0
θ0 的偏导得到的结果和线性回归中的结果相同:
θ
0
=
θ
0
−
α
1
m
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
x
0
(
i
)
\theta_0 = \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m \left[h_\theta(x^{(i)})-y^{(i)} \right] x_0^{(i)}
θ0=θ0−αm1i=1∑m[hθ(x(i))−y(i)]x0(i)
对
θ
j
(
j
=
1
,
2
,
3
,
⋯
,
n
)
\theta_j( j=1,2,3,\cdots,n)
θj(j=1,2,3,⋯,n) 求偏导的结果如下:
∂
∂
θ
j
=
1
m
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
x
(
i
)
+
λ
m
θ
j
,
j
=
1
,
2
,
⋯
,
n
\frac{\partial}{\partial\theta_j} = \frac{1}{m}\sum_{i=1}^m \left[ h_\theta (x^{(i)}) -y^{(i)}\right]x^{(i)} +\frac{\lambda}{m}\theta_j \ ,\quad j=1,2,\cdots,n
∂θj∂=m1i=1∑m[hθ(x(i))−y(i)]x(i)+mλθj ,j=1,2,⋯,n
所以我们就能得到对正则化线性回归代价函数的更新方式:
do{
θ 0 = θ 0 − α 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x 0 ( i ) \quad \theta_0 = \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m \left[h_\theta(x^{(i)})-y^{(i)} \right] x_0^{(i)} θ0=θ0−αm1∑i=1m[hθ(x(i))−y(i)]x0(i)
θ j = θ j − α [ 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x ( i ) + λ m θ j ] , j = 1 , 2 , ⋯ , n \quad \theta_j = \theta_j - \alpha \left[ \frac{1}{m}\sum_{i=1}^m \left[ h_\theta (x^{(i)}) -y^{(i)}\right]x^{(i)} +\frac{\lambda}{m}\theta_j \right] \ ,\quad j=1,2,\cdots,n θj=θj−α[m1∑i=1m[hθ(x(i))−y(i)]x(i)+mλθj] ,j=1,2,⋯,n
while(!convergence)
其中:
θ
j
=
θ
j
−
α
[
1
m
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
x
(
i
)
+
λ
m
θ
j
]
,
j
=
1
,
2
,
⋯
,
n
\theta_j = \theta_j - \alpha \left[ \frac{1}{m}\sum_{i=1}^m \left[ h_\theta (x^{(i)}) -y^{(i)}\right]x^{(i)} +\frac{\lambda}{m}\theta_j \right] \ ,\quad j=1,2,\cdots,n
θj=θj−α[m1i=1∑m[hθ(x(i))−y(i)]x(i)+mλθj] ,j=1,2,⋯,n
可以简化为:
θ
j
=
θ
j
(
1
−
α
λ
m
)
−
α
1
m
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
x
(
i
)
\theta_j = \theta_j (1-\alpha\frac{\lambda}{m}) -\alpha \frac{1}{m}\sum_{i=1}^m \left[ h_\theta (x^{(i)}) -y^{(i)}\right]x^{(i)}
θj=θj(1−αmλ)−αm1i=1∑m[hθ(x(i))−y(i)]x(i)
在一般情况下,对于上式中 α λ m \alpha\frac{\lambda}{m} αmλ , α \alpha α 一般是一个很小的数, m m m 表示样本数据集中的样本个数,一般样本的个数都会很大,所以 α λ m ≈ 0 \alpha\frac{\lambda}{m} \approx 0 αmλ≈0 ,那么 θ j ( 1 − α λ m ) \theta_j (1-\alpha\frac{\lambda}{m}) θj(1−αmλ) 就等于 θ j \theta_j θj 乘以一个很小的数,也就是更新中 θ j \theta_j θj 每次都会变成一个小一点的 θ j \theta_j θj 减去后面偏导的结果。
2.2.2 正则化线性回归的正规方程算法
在线性回归中介绍了一种利用 正规方程 求解使代价函数最小的参数的方法,我们利用训练集 X X X 、标签 y y y 和 参数 θ \theta θ 构成了如下的等式:
X θ = y ⇒ [ x 0 ( 1 ) x 1 ( 1 ) x 2 ( 1 ) ⋯ x n ( 1 ) x 0 ( 2 ) x 1 ( 2 ) x 2 ( 2 ) ⋯ x n ( 2 ) x 0 ( 3 ) x 1 ( 3 ) x 2 ( 3 ) ⋯ x n ( 3 ) ⋮ ⋮ ⋮ ⋱ ⋮ x 0 ( m ) x 1 ( m ) x 2 ( m ) ⋯ x n ( m ) ] [ θ 0 θ 1 θ 2 θ 3 ⋮ θ n ] = [ y ( 1 ) y ( 2 ) y ( 3 ) ⋮ y ( m ) ] X\theta =y \quad \Rightarrow \quad \left[ \begin{matrix} x^{(1)}_0 & x^{(1)}_1 & x^{(1)}_2 & \cdots & x^{(1)}_n &\\ x^{(2)}_0 & x^{(2)}_1 & x^{(2)}_2 & \cdots & x^{(2)}_n \\ x^{(3)}_0 & x^{(3)}_1 & x^{(3)}_2 & \cdots & x^{(3)}_n \\ \vdots & \vdots & \vdots & \ddots & \vdots & \\ x^{(m)}_0 & x^{(m)}_1 & x^{(m)}_2 & \cdots & x^{(m)}_n \end{matrix}\right] \left[\begin{matrix} \theta_0 \\ \theta_1 \\ \theta_2 \\ \theta_3 \\ \vdots \\ \theta_n \end{matrix}\right] =\left[\begin{matrix} y^{(1)} \\ y^{(2)} \\ y^{(3)} \\ \vdots \\ y^{(m)} \end{matrix} \right] Xθ=y⇒⎣⎢⎢⎢⎢⎢⎢⎡x0(1)x0(2)x0(3)⋮x0(m)x1(1)x1(2)x1(3)⋮x1(m)x2(1)x2(2)x2(3)⋮x2(m)⋯⋯⋯⋱⋯xn(1)xn(2)xn(3)⋮xn(m)⎦⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎡θ0θ1θ2θ3⋮θn⎦⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎡y(1)y(2)y(3)⋮y(m)⎦⎥⎥⎥⎥⎥⎤
通过对该等式中每个参数
θ
j
\theta_j
θj 求导,我们可以得到使代价函数最小时
θ
\theta
θ 的值为:
θ
=
(
X
T
X
)
−
1
X
T
y
\theta = (X^TX)^{-1}X^Ty
θ=(XTX)−1XTy
在正则化的线性回归中,由于加入了正则项,所以使正则化代价函数最小时
θ
\theta
θ 的值变为:
θ
=
(
X
T
X
+
λ
[
0
0
0
⋯
0
0
1
0
⋯
0
0
0
1
⋯
0
⋮
⋮
⋮
⋱
⋮
0
0
0
⋯
1
]
)
−
1
X
T
y
\theta = (X^TX + \lambda \left[\begin{matrix} 0 & 0 & 0 & \cdots & 0 \\ 0 & 1 & 0 & \cdots & 0 \\ 0 & 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \vdots &\ddots & \vdots \\ 0 & 0 & 0 & \cdots & 1 \\ \end{matrix}\right] )^{-1}X^Ty
θ=(XTX+λ⎣⎢⎢⎢⎢⎢⎡000⋮0010⋮0001⋮0⋯⋯⋯⋱⋯000⋮1⎦⎥⎥⎥⎥⎥⎤)−1XTy
对于有 n n n 个特征的数据集,其中的偏置项矩阵的大小为 ( n + 1 ) × ( n + 1 ) (n+1)\times(n+1) (n+1)×(n+1),这是因为左上角多了一个 0 0 0 元素,其实左上角的元素对应于 θ 0 \theta_0 θ0 的 λ \lambda λ。
在线性回归的正规方程中,如果 样本数量 m < \boldsymbol{m<} m< 特征维数 n \boldsymbol{n} n,那么可能造成 X T X X^TX XTX 不可逆,从而造成不能求解 θ = ( X T X ) − 1 X T y \theta = (X^TX)^{-1}X^Ty θ=(XTX)−1XTy 的问题。
但是在正则化的线性回归中,只要保证了
λ
>
0
\lambda>0
λ>0,那么下式:
θ
=
(
X
T
X
+
λ
[
0
0
0
⋯
0
0
1
0
⋯
0
0
0
1
⋯
0
⋮
⋮
⋮
⋱
⋮
0
0
0
⋯
1
]
)
−
1
X
T
y
\theta = (X^TX + \lambda \left[\begin{matrix} 0 & 0 & 0 & \cdots & 0 \\ 0 & 1 & 0 & \cdots & 0 \\ 0 & 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \vdots &\ddots & \vdots \\ 0 & 0 & 0 & \cdots & 1 \\ \end{matrix}\right] )^{-1}X^Ty
θ=(XTX+λ⎣⎢⎢⎢⎢⎢⎡000⋮0010⋮0001⋮0⋯⋯⋯⋱⋯000⋮1⎦⎥⎥⎥⎥⎥⎤)−1XTy
中的 :
X T X + λ [ 0 0 0 ⋯ 0 0 1 0 ⋯ 0 0 0 1 ⋯ 0 ⋮ ⋮ ⋮ ⋱ ⋮ 0 0 0 ⋯ 1 ] X^TX + \lambda \left[\begin{matrix} 0 & 0 & 0 & \cdots & 0 \\ 0 & 1 & 0 & \cdots & 0 \\ 0 & 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \vdots &\ddots & \vdots \\ 0 & 0 & 0 & \cdots & 1 \\ \end{matrix}\right] XTX+λ⎣⎢⎢⎢⎢⎢⎡000⋮0010⋮0001⋮0⋯⋯⋯⋱⋯000⋮1⎦⎥⎥⎥⎥⎥⎤
一定是一个可逆矩阵,所以对正则化线性回归使用正规方程的方式一定能够求解得到使代价函数最小的 θ \theta θ 值。
2.3 Logistic 回归正则化
在前面 逻辑回归 中,如果使用如下比较复杂的假设函数:
h
θ
(
x
)
=
g
(
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
2
+
θ
4
x
1
2
x
2
+
θ
5
x
1
2
x
2
2
+
⋯
)
h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1^2 + \theta_4 x_1^2 x_2 + \theta_5 x_1^2 x_2^2 + \cdots )
hθ(x)=g(θ0+θ1x1+θ2x2+θ3x12+θ4x12x2+θ5x12x22+⋯)
对数据分类可能会得到下图所示过拟合的决策边界,这样的模型的泛化能力会比较弱。
为了避免过拟合,我们对逻辑回归的代价函数也引入正则项,则新的代价函数如下所示:
J
(
θ
)
=
−
[
1
m
∑
i
=
1
m
[
y
(
i
)
log
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\theta) = - \left[ \frac{1}{m} \sum_{i=1}^{m} [ y^{(i)} \log h_\theta(x^{(i)}) + (1-y^{(i)})\log \left(1-h_\theta(x^{(i)}) \right)] \right] +\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
J(θ)=−[m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]]+2mλj=1∑nθj2
当加入正则项后,即使假设函数的阶数和参数
θ
\theta
θ 的个数都很多,仍然可以得到如下图所示更合理的分类边界。
对于加入正则项的逻辑回归代价函数中参数的求解,我们可以类比上面正则化线性回归参数求解的过程,由于正则项不包括 θ 0 \theta_0 θ0,所以我们在对其更新时单独计算偏导数,可以得到如下的梯度更新过程:
do{
θ 0 = θ 0 − α 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x 0 ( i ) \quad \theta_0 = \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m \left[h_\theta(x^{(i)})-y^{(i)} \right] x_0^{(i)} θ0=θ0−αm1∑i=1m[hθ(x(i))−y(i)]x0(i)
θ j = θ j − α [ 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x ( i ) + λ m θ j ] , j = 1 , 2 , ⋯ , n \quad \theta_j = \theta_j - \alpha \left[ \frac{1}{m}\sum_{i=1}^m \left[ h_\theta (x^{(i)}) -y^{(i)}\right]x^{(i)} +\frac{\lambda}{m}\theta_j \right] \ ,\quad j=1,2,\cdots,n θj=θj−α[m1∑i=1m[hθ(x(i))−y(i)]x(i)+mλθj] ,j=1,2,⋯,n
while(!convergence)
从上面的更新算法可以看到,对于 θ j \theta_j θj 的更新和正则化线性回归的更新表达式是相同的,这是因为对两者不同的代价函数中 θ \theta θ 求偏导得到了相同的结果,但是由于两者的假设函数 h θ ( x ) h_\theta(x) hθ(x) 是不同的,所以实际计算时候并不相同。