说明:文章中的所有图片均属于Stanford机器学习课程


(一)过拟合问题(The Problem of Overfitting)

不管是在线性回归还是在逻辑回归中,我们都会遇到过拟合的问题。先从例子来看看什么是过拟合。

i.线性回归中的过拟合

还是以房价预测为例,来看几张张图片:

1.欠拟合(Underfitting)

这里写图片描述

上图中,我们用一条直线 hθ(x)=θ0+θ1x <script type="math/tex" id="MathJax-Element-1">h_\theta(x)=\theta_0+\theta_1x</script> 来拟合训练集中数据,但是明显何以看出的是,房价不会随面积成比例地增长,这种情况,称之为 欠拟合

2.过拟合(Overfitting)

这里写图片描述

如上图所示,我们用一条高次的曲线 hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4 <script type="math/tex" id="MathJax-Element-2">h_\theta(x)=\theta_0+\theta_1x+\theta_2 x^2+\theta_3 x^3+\theta_4 x^4</script> 来拟合训练集中的数据,因为参数过多,对训练集的匹配度太高、太准确,以至于在后面的预测过程中可能会导致预测值非常偏离合适的值,预测非常不准确,这就是 过拟合

3.合适的拟合(Properfitting)

这里写图片描述

如上图,如果选用一条合适的曲线,比如说抛物线 hθ(x)=θ0+θ1x+θ2x2 <script type="math/tex" id="MathJax-Element-3">h_\theta(x)=\theta_0+\theta_1x+\theta_2 x^2</script> 来拟合上面的训练集就非常的合适。这就是一个比较恰当的 假设函数(hypothesis function)

所以,总结一下,一般在实际应用中不会遇到欠拟合的情况。而过拟合却会经常出现。一盘情况下,过拟合(Overfitting)就是:如果我们使用了太多的特征(features)来训练一个假设函数,就会使其对训练集的匹配度非常高(误差几乎为零: J(θ)=12mmi=1(θTx(i)y(i))2 <script type="math/tex" id="MathJax-Element-4">J(\theta)=\frac{1}{2m} \sum_{i=1}^m (\theta^Tx^{(i)}-y^{(i)})^2</script>),但是不能推广到其他未知数据上,也就是对于训练集之外的输入,不能做出正确的预测。


ii.逻辑回归中的过拟合

再来看看逻辑回归中的过拟合问题,以肿瘤预测为例。

1.欠拟合(Underfitting)

这里写图片描述

上图中是在逻辑回归的样本中,用一条直线 z=θ0+θ1x+θ2x <script type="math/tex" id="MathJax-Element-5">z=\theta_0+\theta_1x+\theta_2 x</script> 来拟合训练集,明显效果不够理想。这种情况是 欠拟合

2.过拟合(Overfitting)

这里写图片描述

而这张图,用了一个高次假设函数来拟合,使得每个样本都严格地分局于 决策边界(decision boundary)的两侧,这种情况叫做 过拟合
(PS:上面提到的决策边界以及函数g,请参考上一篇:《机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)》

3.合适的拟合(Properfitting)

这里写图片描述

而上面这个二次假设函数则比较合适的拟合了训练集中的数据。


iii.处理过拟合(Addressing overfitting)

面对过拟合问题,我们可以像在线性回归中 Debug 误差函数(hypothesis function)那样来画图纠错。以房价预测为例,假设有样本选取了太多的特征:

features representation
x1 <script type="math/tex" id="MathJax-Element-6">x_1</script> size of house
x2 <script type="math/tex" id="MathJax-Element-7">x_2</script> no. of bedrooms
x3 <script type="math/tex" id="MathJax-Element-8">x_3</script> no. of floors
x4 <script type="math/tex" id="MathJax-Element-9">x_4</script> age of house
x5 <script type="math/tex" id="MathJax-Element-10">x_5</script> average income in neighborhood
x6 <script type="math/tex" id="MathJax-Element-11">x_6</script> kitchen size
x100 <script type="math/tex" id="MathJax-Element-12">x_{100}</script> traffic situation


然后我们训练出来了一个假设函数 hθ(x) <script type="math/tex" id="MathJax-Element-13">h_\theta(x)</script> 假若发现我们训练得到的假设函数对于新的输入,其预测非常的不好。我们可以将其图像画出来,如果像下图中那样过于匹配训练集中的数据,可能就是过拟合了。其原因大多是因选取了太多的特征(features)。

这里写图片描述

通常,有两种主要的办法来处理过拟合为题:

1.减少特征的数量
减少特征数量又包括 人工手动减少特征数量使用模型选择算法,后者会在后面的文章中讲到。

2.正则化
正则化(Regularization)则不会减少特征的数量,因为我们可能真的需要很多特征,但是此方法会使某个特征 θj <script type="math/tex" id="MathJax-Element-14">\theta_j</script> 的值减小,而且当特征数量很多时,正则化也能工作得很好。后面会具体阐述。


(二)误差函数(Cost Function)

现在我们就来讲一讲正则化(Regularization)。首先,看一下之前的两张图片:

这里写图片描述

上面的左图是一个恰当的拟合,其假设函数是一个二次函数(quadratic function);而右图是过拟合的情况,其假设函数是一个四次函数(quartic function)。那怎么能够在不删除特征(不减少特征)的情况下,处理过拟合情况呢。方法如下:

假设我们的假设函数 hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4 <script type="math/tex" id="MathJax-Element-15">h_\theta(x)=\theta_0+\theta_1x+\theta_2 x^2+\theta_3 x^3+\theta_4 x^4</script> 。与左图相比,因为三次项和四次项导致了过拟合的现象,所以们可以惩罚三次项和四次项,具体方法是在误差函数中加入惩罚项:

J(θ)=12m[i=1m(hθ(x(i))y(i))2+1000θ23+1000θ24]
<script type="math/tex; mode=display" id="MathJax-Element-16">J(\theta)=\frac{1}{2m}\left[ \sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+1000\theta_3^2+1000\theta_4^2 \right]</script> 其中1000是我任意写的一个比较大的数字。在加入惩罚项之后, 梯度下降就变成了:
θj=θjαθjJ(θ)=θjα1m[i=1m(hθ(x(i))y(i))x(i)j+θj(1000θ23+1000θ24)]
<script type="math/tex; mode=display" id="MathJax-Element-17">\begin{aligned} \theta_j &= \theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta) \\ &=\theta_j-\alpha \frac{1}{m}\left[ \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\partial}{\partial\theta_j}(1000\theta_3^2+1000\theta_4^2)\right] \end{aligned}</script>
因为我们要最小化 误差函数,所以在梯度下降开始到完成的过程中式子 αθjJ(θ) <script type="math/tex" id="MathJax-Element-18">\alpha\frac{\partial}{\partial\theta_j}J(\theta)</script> 会从某一个值趋近于0( 为何会收敛于0,我暂时不理解,不能证明),完成时,就会有 θ30 <script type="math/tex" id="MathJax-Element-19">\theta_3\approx 0</script> 和 θ40 <script type="math/tex" id="MathJax-Element-20">\theta_4\approx 0</script> 。这就使得之前的 假设函数
hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4θ0+θ1x+θ2x2
<script type="math/tex; mode=display" id="MathJax-Element-21">\begin{aligned} h_\theta(x)&=\theta_0+\theta_1x+\theta_2 x^2+\theta_3 x^3+\theta_4 x^4 \\ &\approx \theta_0+\theta_1x+\theta_2 x^2 \end{aligned}</script> 至此,三次项和四次项的影响只占了很小一部分,正则化就使得过拟合的 假设函数变得不那么过拟合了。也许有人会问,为什么在误差函数后面加上对应的惩罚项,就能解决过拟合问题了?下面来解释一下。

以惩罚(penalize)三次项为例说说我个人的见解,对 θ3 <script type="math/tex" id="MathJax-Element-22">\theta_3</script> 求偏导数:

θ3=θ3αθ3J(θ)=θ3α1m[i=1m(hθ(x(i))y(i))+θ3(1000θ23+1000θ24)]=θ3α1m[i=1m(hθ(x(i))y(i))x(i)j+2000θ3]
<script type="math/tex; mode=display" id="MathJax-Element-23">\begin{aligned} \theta_3 &= \theta_3-\alpha\frac{\partial}{\partial\theta_3}J(\theta) \\ &=\theta_3-\alpha \frac{1}{m}\left[ \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})+\frac{\partial}{\partial\theta_3}(1000\theta_3^2+1000\theta_4^2)\right] \\ &=\theta_3-\alpha\frac{1}{m}\left[ \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+2000\theta_3\right] \end{aligned}</script> 上面的式子可以写为:
θ3=θ3(1α2000m)α1mi=1m(hθ(x(i))y(i))x(i)j
<script type="math/tex; mode=display" id="MathJax-Element-24">\theta_3=\theta_3(1-\alpha\frac{2000}{m})-\alpha\frac{1}{m} \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}</script> 容易看出,当 θ3 <script type="math/tex" id="MathJax-Element-25">\theta_3</script> 为正数的时候, 2000θ3 <script type="math/tex" id="MathJax-Element-26">2000\theta_3</script> 要远远大于 θ3 <script type="math/tex" id="MathJax-Element-27">\theta_3</script> 本身,但是通常样本数量 m <script type="math/tex" id="MathJax-Element-28">m</script> 都非常的大,所以一般有: (1α2000m)<1<script type="math/tex" id="MathJax-Element-29">(1-\alpha\frac{2000}{m})<1</script> 。所以对于 θ3 <script type="math/tex" id="MathJax-Element-30">\theta_3</script> 来说,它的减小的速度会较其他参数快一点。 至于为何最后会约等于0,我也实在摸不着头脑。以后搞懂再补充。


但是,通常情况下,我们可能无法提前知道到底是哪个参数(特征),或哪个项引起了过拟合。所以一般将除去 θ0 <script type="math/tex" id="MathJax-Element-31">\theta_0</script> 之外的其他参数都正则化( θ0 <script type="math/tex" id="MathJax-Element-32">\theta_0</script> 不是任何特征的参数,无必要正则化):

J(θ0,θ1,...,θj)=12mi=1m(hθ(x(i))y(i))2+λj=1nθ2j
<script type="math/tex; mode=display" id="MathJax-Element-33">J(\theta_0,\theta_1,...,\theta_j)=\frac{1}{2m}\left[ \sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^n \theta_j^2 \right]</script> 注意上式中不包含 θ0 <script type="math/tex" id="MathJax-Element-34">\theta_0</script> 。其中 λ <script type="math/tex" id="MathJax-Element-35">\lambda</script> 称为 正则化系数(Regularization parameter),这个 λ <script type="math/tex" id="MathJax-Element-36">\lambda</script> 一般都是一个相对较大的数,其有两个作用,第一个是使得函数 hθ(x) <script type="math/tex" id="MathJax-Element-37">h_\theta(x)</script> 能够很好地匹配训练集中的数据;另一个作用是使得所有的系数都比较小,以防止过拟合。

但是,当 λ <script type="math/tex" id="MathJax-Element-38">\lambda</script> 过大时,会使得 θ1θ2...θn0 <script type="math/tex" id="MathJax-Element-39">\theta_1\approx\theta_2\approx...\approx\theta_n\approx0</script>,使得假设函数 hθ(x)θ0 <script type="math/tex" id="MathJax-Element-40">h_\theta(x)\approx\theta_0</script> :

这里写图片描述
所以 λ <script type="math/tex" id="MathJax-Element-41">\lambda</script> 过大也会产生欠拟合的现象。


三、正则化的线性回归(Regularized Linear Regression)

i.梯度下降(Gradient Descent)

正则化的梯度下降形式为:

Repeat {    θ0:=θ0α 1m i=1m(hθ(x(i))y(i))x(i)0    θj:=θjα [(1m i=1m(hθ(x(i))y(i))x(i)j)+λmθj]}          j{1,2...n}
<script type="math/tex; mode=display" id="MathJax-Element-42">\begin{align*} & \text{Repeat}\ \lbrace \newline & \ \ \ \ \theta_0 := \theta_0 - \alpha\ \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)} \newline & \ \ \ \ \theta_j := \theta_j - \alpha\ \left[ \left( \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \right) + \frac{\lambda}{m}\theta_j \right] &\ \ \ \ \ \ \ \ \ \ j \in \lbrace 1,2...n\rbrace\newline & \rbrace \end{align*}</script> 需要注意的是, θ0 <script type="math/tex" id="MathJax-Element-43">\theta_0</script> 需要单独处理,因为我们不对其进行正则化。上面的第二个式子也可写作:
θj:=θj(1αλm)α1mi=1m(hθ(x(i))y(i))x(i)j
<script type="math/tex; mode=display" id="MathJax-Element-44">\theta_j := \theta_j(1 - \alpha\frac{\lambda}{m}) - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}</script> 前面的 (1αλm) <script type="math/tex" id="MathJax-Element-45">(1 - \alpha\frac{\lambda}{m})</script> 是小于1的(原因前面已经提到过了),所以每次迭代 θj <script type="math/tex" id="MathJax-Element-46">\theta_j</script> 都会乘以一个小数,然后再减去后面的部分。后面的求和部分和线性回归中相同。


ii.Normal Equation

正则化的Normal Equation的形式为:

θ=(XTX+λL)1XTywhere  L=0111
<script type="math/tex; mode=display" id="MathJax-Element-47">\begin{align*} & \theta = \left( X^TX + \lambda \cdot L \right)^{-1} X^Ty \newline & \text{where}\ \ L = \begin{bmatrix} 0 & & & & \newline & 1 & & & \newline & & 1 & & \newline & & & \ddots & \newline & & & & 1 \newline \end{bmatrix} \end{align*}</script> 注意第一行第一列为0,是因为 θ0 <script type="math/tex" id="MathJax-Element-48">\theta_0</script> 不需要正则化。另外关于矩阵不可逆的问题是因训练集数量小于特征数量,具体请参考 《机器学习笔记03》


四、正则化的逻辑回归(Regularized Logistic Regression)

之前我们讲到过过拟合的现象:

这里写图片描述

假设函数为:
J(θ)=1mi=1m[y(i) log(hθ(x(i)))+(1y(i)) log(1hθ(x(i)))]
<script type="math/tex; mode=display" id="MathJax-Element-53">J(\theta) = - \frac{1}{m} \sum_{i=1}^m \large[ y^{(i)}\ \log (h_\theta (x^{(i)})) + (1 - y^{(i)})\ \log (1 - h_\theta(x^{(i)})) \large]</script> 和逻辑回归类似,我们只要加上惩罚项就能避免过拟合:
J(θ)=1mi=1m[y(i) log(hθ(x(i)))+(1y(i)) log(1hθ(x(i)))]+λ2mj=1nθ2j
<script type="math/tex; mode=display" id="MathJax-Element-54">J(\theta)=- \frac{1}{m}\sum_{i=1}^m \large[ y^{(i)}\ \log (h_\theta (x^{(i)})) + (1 - y^{(i)})\ \log(1 - h_\theta(x^{(i)}))\large] + \frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2</script> 其梯度下降的形式为:
Repeat {    θ0:=θ0α 1m i=1m(hθ(x(i))y(i))x(i)0    θj:=θjα [(1m i=1m(hθ(x(i))y(i))x(i)j)+λmθj]}          j{1,2...n}
<script type="math/tex; mode=display" id="MathJax-Element-55">\begin{align*} & \text{Repeat}\ \lbrace \newline & \ \ \ \ \theta_0 := \theta_0 - \alpha\ \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)} \newline & \ \ \ \ \theta_j := \theta_j - \alpha\ \left[ \left( \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \right) + \frac{\lambda}{m}\theta_j \right] &\ \ \ \ \ \ \ \ \ \ j \in \lbrace 1,2...n\rbrace\newline & \rbrace \end{align*}</script> 需要注意的是与线性回归不同,这里的 hθ(x)=11+eθTX <script type="math/tex" id="MathJax-Element-56">h_\theta(x)=\frac{1}{1+e^{-\theta^TX}}</script> 。


上面就是正则化、过拟合的大概内容,希望能帮助到大家。
如有错误,期望您能纠正,留言或者是加入QQ群

——–转载请注明出处——–

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐