本文最后更新于:星期二, 四月 7日 2020, 5:27 下午

1. 评估一个学习算法

1.1 决定下一步应该做什么

如果训练完成的模型在测试阶段的误差非常大,那么或许可以考虑采取下面的措施:

  • 获得更多的训练样本
  • 尝试缩小特征矩阵
  • 尝试获得额外特征
  • 尝试增加多项式特征
  • 尝试减小λ\lambda
  • 尝试增大λ\lambda

一个个尝试上述的解决措施非常花费时间,因此课程将会在下面介绍一些诊断的方法。

1.2 评估一个假设

选择70%的数据作为训练集和30%的数据作为测试集。
评估的两个步骤分为:

  • 利用训练集学习参数θ\theta并最小化训练集误差Jtrain(θ)J_{train}(\theta)
  • 计算测试集误差Jtest(θ)J_{test}(\theta)

测试集误差
(1)对于线性回归:

Jtest(Θ)=12mtesti=1mtest(hΘ(xtest(i))ytest(i))2J_{\text {test}}(\Theta)=\frac{1}{2 m_{t e s t}} \sum_{i=1}^{m_{t e s t}}\left(h_{\Theta}\left(x_{\text {test}}^{(i)}\right)-y_{t e s t}^{(i)}\right)^{2}

(2)对于分类问题,首先定义分类误差函数:

因此,测试集上的平均分类误差函数为:

 Test Error =1mtesti=1m test err(hΘ(xtest(i)),ytest(i))\text { Test Error }=\frac{1}{m_{\text {test}}} \sum_{i=1}^{m_{\text { test }}} \operatorname{err}\left(h_{\Theta}\left(x_{\text {test}}^{(i)}\right), y_{\text {test}}^{(i)}\right)

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

可以将数据集分为三个部分:

  • 训练集:60%
  • 交叉验证集:20%
  • 测试集:20%

然后利用下面的方法:
(1)对于每一个多项式(假设函数)利用训练集优化参数Θ\Theta
(2)利用交叉验证集找到具有最小损失的多项式程度d(假设函数);
(3)利用测试集衡量泛化误差。

2. 偏差与方差

2.1 诊断偏差与方差

偏差和方差是导致模型预测结果不理想的原因
高偏差表示欠拟合,而高方差是过拟合。理想情况下我们需要找到二者的平衡。

如上图,随着多项式程度d的提高,在训练集上的误差会逐渐减小;
而随着多项式程度d的提高,在交叉验证集上的误差会先减小再增大。
高偏差(欠拟合):Jtrain(Θ)J_{train}(\Theta)JCV(Θ)J_{CV}(\Theta)都很高。并且JCV(Θ)Jtrain(Θ)J_{C V}(\Theta) \approx J_{t r a i n}(\Theta)
高方差(过拟合):Jtrain(Θ)J_{train}(\Theta)很低,JCV(Θ)J_{CV}(\Theta)Jtrain(Θ)J_{train}(\Theta)高得多。

2.2 正则化与偏差/方差


如上图所示,随着λ\lambda的上升,拟合结果变得越来越死板。在另一方面,若λ\lambda逐渐接近0,可能会导致数据过拟合。所以如何确定λ\lambda的大小十分重要。为了确定使用哪一种模型和正则化参数,我们可以采取如下的步骤:
(1)建立一个λ\lambda的列表(ie.λ0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24ie.\lambda \in {0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24});
(2)建立一个包含不同多项式级别和其他变量的模型集合;
(3)对不同的λ\lambda进行迭代,对于每个λ\lambda训练所有模型的Θ\Theta
(4)利用学习到的参数Θ\Theta计算不包含正则化项(λ=0\lambda=0)的交叉验证误差JCV(Θ)J_{CV}(\Theta)
(5)使用最好的

2.3 学习曲线

当训练集数据只有几个的时候,我们总是能找到模型使训练集误差为0;

  • 随着训练集的增大,二次方函数的误差也会增大;
  • 当训练集大小超过特定的值m的时候,误差会趋向于稳定。

(1)当偏差较高的时候:

  • 训练数据集较小:导致训练误差Jtrain(Θ)J_{train}(\Theta)很小,JCV(Θ)J_{CV}(\Theta)很高。
  • 训练数据集较大:Jtrain(Θ)J_{train}(\Theta)JCV(Θ)J_{CV}(\Theta)都很高,并且JCV(Θ)Jtrain(Θ)J_{C V}(\Theta) \approx J_{t r a i n}(\Theta)
    当一个学习算法偏差较高的时候,增加训练集大小不会有太大的帮助。

(2)当方差较高的时候:

  • 训练数据集较小:导致训练误差Jtrain(Θ)J_{train}(\Theta)很小,JCV(Θ)J_{CV}(\Theta)很高。
  • 训练数据集较大:Jtrain(Θ)J_{train}(\Theta)随着训练数据集大小的提升而增大,JCV(Θ)J_{CV}(\Theta)逐渐减小,并且Jtrain(Θ)<JCV(Θ)J_{\text {train}}(\Theta)<J_{C V}(\Theta)
    如果一个学习算法的方差较高,增加训练集大小会有一定的帮助。

2.4 再次决定下一步要做什么

(1)前面提到的缩小误差的方法适用的场景如下:

  • 获得更多的训练样本:适合高方差场景(过拟合)
  • 尝试缩小特征矩阵:适合高方差场景(过拟合)
  • 尝试获得额外特征:适合高偏差场景(欠拟合)
  • 尝试增加多项式特征:适合高偏差场景(欠拟合)
  • 尝试减小λ\lambda:适合高偏差场景(欠拟合)
  • 尝试增大λ\lambda:适合高方差场景(过拟合)

(2)诊断神经网络

  • 有更少参数的神经网络容易导致欠拟合,但也计算简单;
  • 有更多参数的神经网络容易导致过拟合,并且计算复杂。(可以通过增加正则化参数解决这一问题)

从单隐层神经网络开始是默认比较好的开始,然后通过交叉验证选择性能最好的参数。

(3)其他更加复杂的影响

  • 低阶多项式(低模型复杂度)有较高的偏差和较低的方差。这种情况下拟合效果不理想。
  • 高阶多项式(高模型复杂度)对于训练数据拟合效果很好,但是测试数据效果很糟糕。他们在训练数据上有较低的偏差,但是有较高的方差。
  • 通常实际中,我们倾向于选择两者之间的多项式,有较好的泛化能力并且拟合效果很好。

3. 建立一个垃圾邮件分类器