1、开发机器学习系统或者优化的路径
- 训练数据量的增加对机器学习系统的影响
- 增加特征集或减少特征集
- 改变正则化参数
- 尝试增加多项式特征
| 高偏差、欠拟合 | 高方差、过拟合 |
| ------------------ | ------------------------------ |
| 尝试增加多项式特征 | 尝试减少特征的数量 |
| 尝试减少正则化程度 | 获得更多的训练实例 |
| 尝试获得更多的特征 | 尝试增加正则化程度 λ |
由于方法太多且无法确定上述方法对算法优化是否有很大的帮助,因此我们尝可以评估机器学习算法的性能。方法如下:
1.1评估假设(防止过拟合或欠拟合)
为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数𝐽
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外,还可以计算误分类的比率,对于每一个测试集实例,计算:
然后对计算结果求平均。
1.2选择合适的模型
一般越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集的模型可能导致过拟合,我们应该选择一个更能适应一般情况的模型。一般使用交叉验证集来帮助选择合适的模型。
如果给定的样本数据充足,我们通常使用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集,这三个集合不能有交集,常见的比例是8:1:1。需要注意的是,通常都会给定训练集和测试集,而不会给验证集。这时候验证集该从哪里得到呢?一般的做法是,从训练集中均匀随机抽样一部分样本作为验证集。
之所以出现交叉验证,主要是因为训练集较小。无法直接像前面那样只分出训练集,验证集,测试就可以了(简单交叉验证)。
需要说明的是,在实际情况下,人们不是很喜欢用交叉验证,主要是因为它会耗费较多的计算资源。一般直接把训练集按照50%-90%的比例分成训练集和验证集。但这也是根据具体情况来定的:如果超参数数量多,你可能就想用更大的验证集,而验证集的数量不够,那么最好还是用交叉验证吧。至于分成几份比较好,一般都是分成3、5和10份。
交叉验证集:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集
模型选择的方法为:
- 使用训练集训练出 10 个模型
- 用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
- 选取代价函数值最小的模型
- 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)
1.3诊断偏差和方差
对于训练集,当 𝑑 较小时,模型拟合程度更低,误差较大;随着 𝑑 的增长,拟合程度提高,误差减小。
对于交叉验证集,当 𝑑 较小时,模型拟合程度低,误差较大;但是随着 𝑑 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
1.4正则化和偏差/方差
正则化可防止出现过拟合状况,但是无法选出合适的正则参数𝜆 。选择一系列的想要测试的 𝜆 值,通常是 0-10 之间的呈现 2 倍关系的值(如: 0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共 12 个)。我们同样把数据分为训练 集、交叉验证集和测试集。
选择𝜆的方法为:
1.使用训练集训练出 12个不同程度正则化的模型;
2.用 12个模型分别对交叉验证集计算的出交叉验证误差;
3.选择得出交叉验证误差最小的模型;
4.运用步骤 3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ的值绘制在一张图表上。
当 𝜆 较小时,训练集误差较小(过拟合)而交叉验证集误差较大;
随着 𝜆 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加。
1.5学习曲线
通过学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(𝑚)的函数绘制的图表。
即,如果我们有 100行数据,我们从 1行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:
在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并
且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数
据可以提高模型的效果
在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
1.6神经网络的偏差和方差
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小;使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。
2、机器学习系统的设计
2.1 误差分析
构建一个学习算法的推荐方法为:
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法;
- 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择;
- 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势。
以垃圾邮件分类器算法为例:误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。
2.2 类偏斜的误差度量
设定某个实数来评估你的学习算法,并衡量它的表现,即为误差度量值。就使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。
类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
例如用算法来预测癌症是否是恶性的,在我们的训练集中,只有 0.5%的实例 是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有 0.5%。然而我们通过训练而得到的神经网络算法却有 1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
查准率(Precision)和查全率(Recall) 我们将算法预测的结果分成四种情况:
- 正确肯定(True Positive,TP):预测为真,实际为真
- 正确否定(True Negative,TN):预测为假,实际为假
- 错误肯定(False Positive,FP):预测为真,实际为假
- 错误否定(False Negative,FN):预测为假,实际为真
则:查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
2.3 查准率和查全率之间的权衡
对于上述预测肿瘤的例子中,假使,我们的算法输出的结果在 0-1 之间,我们使用阀值 0.5 来预测真和假。
如果想要高的查准率,我们可以使用比 0.5更大的阀值,如 0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
如果想要高的查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5更小的阀值,如 0.3。
通过以下公式确定合适的阈值,选使F1最高的阈值。
F1Score=2∗PRP+RF1Score=2* \frac{PR}{P+R} F1Score=2∗P+RPR