机器学习第十一章——应用机器学习的建议

评估学习算法

想要降低预测误差,即提高预测精度,我们往往会采用这些手段:

  • 采集更多的样本(解决高方差问题)
    错误的认为样本越多越好,其实数据多并不是越好。

  • 降低特征维度,减少一些特征,解决过拟合问题(解决高方差问题)
    降维可能去掉了有用的特征。

  • 采集更多的特征,增加一些额外的特征(解决高偏差问题)
    增加了计算负担,也可能导致过拟合。

  • 进行高次多项式回归,如x_1^2,x_2^2,x_1x_2.....(解决高偏差问题)
    过高的多项式可能造成过拟合。

  • 调试正规化参数 $\lambda$,将其增大(参数\theta会减小,解决高方差问题)或者减少 $\lambda$(参数\theta会增加,解决高偏差问题)
    增大或者减少都是凭感觉。

 评价假设函数

首先我们要评估的是我们的假设函数(Hypothesis)。当我们选择特征值或者参数来使训练集误差最小化,但是我们会遇到过拟合的问题,推广到新的训练集就不再使用了。而且当特征量很多的时候,我们就不能将 $J(\theta)$ 可视化看出其是否随着迭代次数而下降了。所以我们采用以下的方法来评估我们的假设函数:

 

假设有 10 组数据,随机把 70% 做为训练集,剩下的 30% 做为测试集。训练集和测试集尽量保证是随机排列。

接下来:

  1. 对训练集进行学习得到参数 $\Theta$ ,也就是利用训练集最小化训练误差 $J_{train}(\Theta)$
  2. 计算出测试误差 $J_{test}(\Theta)$,取出之前从训练集中学习得到的参数 $\Theta$ 放在这里,来计算测试误差。

对于线性回归:$$J_{test}(\theta)=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}{(h_\theta(x^{(i)}_{test})-y^{(i)}_{test})^2}$$

对于逻辑回归:$$J_{test}(\theta)=-\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}{y^{(i)}_{test}logh_\theta(x^{(i)}_{test})+(1-y^{(i)}_{test})logh_\theta(x^{(i)}_{test})}$$

逻辑回归不同于线性回归,因为它只有0和1两个值, 所以怎么判断误差如下:

$$ err(h_\theta(x),y)=\left\{\begin{matrix} 1 \;\;\;( if \;\;\; h_\theta(x) \geqslant 0.5 , y=0 \;\;\;or\;\;\; if\;\;\; h_\theta(x) < 0.5 , y=1 )\\  0 \;\;\;( otherwise ) \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \end{matrix}\right. $$

这里的误差也叫误分类率,也叫 $0/1$ 错分率。

$( if \;\;\; h_\theta(x) \geqslant 0.5 , y=0 \;\;\;or\;\;\; if\;\;\; h_\theta(x) < 0.5 , y=1 )$

这种情况下,假设结果更趋向于1,但是实际给出的判断却是0,或者假设结果更趋向于0,实际给出的判断却是1 。

如果以上情况都没有,那么就没有误差,即为0 ,也代表了假设值能够正确的对样本进行分类。

测试集的平均测试误差为:

$$Test\;Error=\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_{\theta}(x^{(i)}_{test}),y^{(i)}_{test})$$

模型选择和训练集/验证集/测试集

我们这里用 d 表示多项式的个数。我们可以改变多项式次数的多少来选择合适我们的模型。例如上面的 $h_\theta(x)=\theta_0+\theta_1x$ ,这个多项式 $d=1$ 。

我们可以测试每一个模型得到他们的 $J_{test}(\theta)$ ,判断哪一个模型比较好。

当选择出了一个多项式 d 能很完美的拟合测试集,接下来就不能再用测试集了,因为 d 本来就已经完美拟合测试集了,再测试就没有意义了,需要换一个测试集。所以更需要关心的对新样本的拟合效果。

为了解决上述问题,我们把数据分为 3 类,训练集 60% /交叉验证集 20% /测试集 20%。

通过三个集合,可以算出训练误差:

$$J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^{2}$$

交叉验证误差:

$$J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_\theta(x^{(i)}_{cv})-y^{(i)}_{cv})^{2}$$

测试误差:

$$J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m}(h_\theta(x^{(i)}_{test})-y^{(i)}_{test})^{2}$$

于是我们选择模型不在仅仅通过测试集来选择了,而是:

  1. 利用训练集的数据代入每一个多项式模型,通过最小化训练误差J_{train},得到相应的参数\theta ^{(i)}
  2. 用交叉验证集的数据,计算并找出最小交叉验证误差的多项式模型。
  3. 最后用测试集的数据计算出所选模型的测试误差J_{test},用来判断所选模型的“泛化”能力。

诊断偏差和方差

在机器学习中,偏差(bias)反映了模型无法描述数据规律,而方差(variance)反映了模型对训练集过度敏感,而丢失了数据规律,高偏差和高方差都会造成新数据到来时,模型给出错误的预测。

还是以这个图为例,最左边的图是欠拟合(高偏差),最右边的图是过拟合(高方差)。

训练误差:$$J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^{2}$$

交叉验证误差:$$J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_\theta(x^{(i)}_{cv})-y^{(i)}_{cv})^{2}$$

上图是 训练集、交叉验证集误差随多项式次数 d 的变化规律。横坐标是我们的d,也就是多项式的个数,纵坐标就是我们的代价函数。

我们先来看一下红色曲线 $J_{training}(\theta)$ ,随着多项式个数的增加,其假设函数是越来越接近要拟合的数据,所以其代价函数会随着多项式个数的增加下降。

然后绿色的曲线是 $J_{cross-validation}(\theta)$ ,当多项式个数比较少的时候,那当然会出现欠拟合的现象,所以一开始其代价函数 $J_{cross-validation}(\theta)$ 是很大的,随着多项式个数的增加而下降,但是当其多项式个数再继续增加的话,就会出现过拟合的现象, $J_{cross-validation}(\theta)$ 就又会增加。所以 $J_{cross-validation}(\theta)$ 函数是先递减再递增的,在其最低点就是最合适的多项式次数。

多项式回归中,如果多项式次数较高,则容易造成过拟合,此时训练误差很低,但是对于新数据的泛化能力较差,导致交叉验证集和测试集的误差都很高,此时模型出现了高方差(过拟合)

$$ \left\{\begin{matrix} J_{train}(\theta) \;\;\;is\;\; low\\  J_{cv}(\theta)>>J_{test}(\theta) \end{matrix}\right. $$

过拟合的情况下,训练集误差通常比较小,并且远小于交叉验证误差。

而当次数较低时,又易出现欠拟合的状况,此时无论是训练集,交叉验证集,还是测试集,都会有很高的误差,此时模型出现了高偏差(欠拟合)

$$ \left\{\begin{matrix} J_{train}(\theta),J_{cv}(\theta)\;\;\; is \;\; high\\  J_{cv}(\theta) \approx J_{test}(\theta) \end{matrix}\right. $$

欠拟合的情况下,训练集误差会很大。

为什么 $J_{cross-validation}(\theta)$ 会先降后升,而 $J_{training}(\theta)$ 一直下降?

原因是参数 $\theta$ 是只针对训练集所训练出来的,当其代入到 $J_{cross-validation}(\theta)$ 后,就会随着多项式的增加数据偏差就会越来越大,也就是随着拟合程度的不断增加,他的模型会越来越专门适用于训练集,他的泛化能力会逐步的降低。

正则化的偏差和方差

为了防止过拟合的现象,我们加上一个正则化项,但是正则化参数 $\lambda$ 与过拟合又有什么关系呢?

$$ \rm{CostFunction} = \rm{F}({\theta}) = \frac{1}{2m} \left [ \sum_{i = 1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 + \lambda \sum_{i = 1}^{m} \theta_{j}^{2} \right ]$$

当 $\lambda$ 很大的时候,就会使得后面的每一个 $\theta_i$ 都被惩罚,也就是$\theta_i$ 的权重会降低,$\theta_i$ 的值会减小,甚至接近于0,所以只剩下 $\theta_0$ ,那么其假设函数就会变成一条直线,出现欠拟合的现象。

当 $\lambda$ 很小的话,一个极端例子就是 $\lambda=0$ ,也就是相当于没有加正则化那项,这就会导致过拟合的现象。

$\lambda$的取值不能过大也不能过小。

$\lambda$的取值可以在 $\left[0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24\right]$,在这12个不同的模型中针对每一个 $\lambda$ 的值,都去计算出一个最小代价函数,从而得到 $\Theta^{(i)}$

得到了12个 $\Theta^{(i)}$ 以后,就再用交叉验证集去评价它们。即计算每个 $\Theta$ 在交叉验证集上的平均误差平方和 $J_{cv}(\Theta^{(i)})$

选择一个交叉验证集误差最小的 $\lambda$ 最能拟合数据的作为正则化参数。

最后拿这个正则化参数去测试集里面验证 $J_{test}(\Theta^{(i)})$ 预测效果如何。

随着 $\lambda$ 参数的增大,也就是\theta的值会减小,偏差逐渐增大, $J_{train}(\theta)$ 自然也会随之增大,这是因为当 $\lambda=0$ 的时候, $J_{train}(\theta)$ 是没有正则化项的。

但是对于 $J_{cv}(\theta)$ 来说,它假设函数里面的 $\theta$ 是根据训练集里面拟合出来的,所以在没有加入正则化前, $J_{cv}(\theta)$ 是很大的。但是随着 $\lambda$的逐渐增大,也就是随着正则化的效果逐渐体现出来,在交叉验证集里面与测试数据就会越来越拟合,这时候的 $J_{cv}(\theta)$ 自然会慢慢下降。但是当 $\lambda$ 变得足够大的时候,参数 $\theta$ 会变得很小,甚至接近于0,也就是说交叉训练集的 $h_\theta(x)$ 就会趋近一条直线,$J_{cv}(\theta)$ 自然会随之上升。

Learning Curves 学习曲线

假设我们用 $h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2$ 去拟合数据,当数据只有几个的时候,拟合效果那肯定的非常好的,但是,当数据越来越多,我们的假设函数因为多项式太少就不能很好地拟合数据了。所以训练集的误差 $J_{train}(\theta)$ 会随着数据的增多而增大。如上图蓝色的曲线。

但是对于交叉验证集呢?因为一开始只有几个数据,那么在训练集拟合出来的参数就有很大的可能不适合交叉验证集,所以在数据很小的情况下其误差是很大的,但是随着数据的慢慢增多,虽然个别的数据拟合不上,但是整体的拟合效果那肯定比只有几个数据的时候好了,所以其整体误差是逐步下降的,也就是说模型随着训练数据,样本的增多,他的泛化能力会不断增加。如上图粉色的曲线。

当数据存在高偏差也就是欠拟合的时候,即使数据再继续增多也无补于事,所以其误差会趋于一个平衡的位置,而且 $J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 的误差都会很大。

所以,当数据存在欠拟合的问题,我们选用更多的训练样本是没有办法解决问题的。

当数据存在高方差也就是过拟合的时候,随着数据的增多,因为过拟合所以在训练集基本能完美拟合其数据,所以训练集的误差虽然会上升,但是其幅度是非常缓慢的,在交叉验证集也一样,所以过拟合的时候其图像如上,在 $J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 之间有一大段空隙。

所以,当数据存在过拟合的现象,选用更多的样本有利于我们解决这个问题。


4. Deciding What to Do Next Revisited 决定下一步该做什么

总结 :

手段使用场景
采集更多的样本高方差(过拟合)
降低特征维度高方差(过拟合)
采集更多的特征高偏差(欠拟合)
进行高次多项式回归高偏差(欠拟合)
降低参数 λ高偏差(欠拟合)
增大参数 λ高方差(过拟合)

当我们选用一些较小的神经网络,虽然其计算量较少,但是容易出现欠拟合的现象。相反,我们选用一些层数比较多,层的单元比较多的神经网络,容易出现过拟合的现象。我们之前提到越大型的神经网络效果越好,为了防止出现过拟合的现象,我们可以使用正则化的方法来修正。

使用单个隐藏层是一个很好的默认开始。您可以使用交叉验证集在许多隐藏层上训练您的神经网络。然后您可以选择性能最好的一个。

模型复杂性影响:

  • 低阶多项式(低模型复杂度)具有高偏差和低方差。在这种情况下,该模型很难一致
  • 高阶多项式(高模型复杂度)非常适合训练数据,测试数据极其糟糕。这些对训练数据的偏倚低,但差异很大
  • 实际上,我们希望选择一个介于两者之间的模型,它可以很好地推广,但也可以很好地适合数据。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值