吴恩达新书-机器学习学习笔记-(一)设置开发集与测试集

书籍资料可以在以下链接中找到:中文版,英文版

1.机器学习为什么需要策略?

当我们想要应用神经网络构建计算机视觉系统,通过这个系统来识别图中的物体。但是我们自己写的算法代码还不能够使得我们的计算机视觉系统有一个比较好的准确度。我们可以采取以下措施:

a.收集更多猫咪的图片,加大训练样本。

b.收集更加多样化的训练数据集。

c.增加迭代次数,让算法训练地更久一点。

d.采用更大规模的神经网络。

e.尝试一个更小的神经网络。

f.尝试加入正则化。

g.改变神经网络架构。

如果我们知道如何选择合适的方法来改进我们的模型,那么我们在使用机器学习方法来解决我们问题的时候将会更有效率。

2.先修知识与符号说明:

监督学习:使用标注(labeled)的训练样本(x,y)来学习一个从x映射到y的函数。

监督学习算法主要包括线性回归(linear regression)、对数几率回归(logistic regression,又译作逻辑回归、逻辑斯蒂回归)和神经网络(neural network)。虽然机器学习的形式有许多种,但是具备实用价值的大部分机器学习算法都来自于监督学习。

3.规模驱动机器学习发展:

深度学习或者说是神经网络的想法在几十年前就有了,但是为什么它们现在才流行起来了呢?推动其发展的主要因素有两个:

数据可用性(data availability):如今人们在数字设备(笔记本电脑、移动设备等)上花费的时间越来越多,对应的数字化行为与活动产生了海量的数据,而这些数据都可以提供给我们的算法,给我们的算法来进行训练。

计算规模(computational scale):在近几年,我们计算机硬件的发展使得我们能够有足够的计算能力,来应对这样海量的数据。

那么为什么传统的算法不会随着计算能力的发展而发展起来呢?这是因为对传统的算法来说,即使你喂给它更多的数据,它的性能表现将趋于“平稳”。也就是说,就算提供更多的数据,算法的性能也将不再提升,如下图所示:

在同样的监督学习任务下,选择训练一个神经网络(neutral network NN),可能会获得比较好的性能表现:

在算法训练时,许多其它的细节也同等重要,例如神经网络的架构。但是目前来说,提升算法性能更加可靠的方法仍然是训练更大的网络以及获取更多的数据。

上图显示了在小数据集上应用神经网络的效果会更好,但是如果传统算法的特征选择比较好的话,我们传统的算法在小样本上可能会有更好的性能。

4.开发集和测试集的定义:

我们首先希望我们的训练数据和测试的数据能够满足同一个分布,这样的话就能够很好地用神经网络去拟合这个分布。举个例子说,我们希望训练一个分别小猫的模型,如果我们训练神经网络的数据是来自网上,而我们最终的应用是做成一个app,那么我们的测试数据集就来自手机。这样的话,我们的训练数据集和测试数据集就来自不同的分布。这样的话就会导致我们的模型在实际应用的过程中效果很差。

我们通常认为:

训练集(training set):用于运行你的学习算法。

开发集(development set):用于调整参数,选择特征,以及对学习算法做出其它决定。有时也称为留出交叉验证集(hold-out cross validation set)。

测试集(test set):用于评估算法的性能,但不会据此改变学习算法或参数。

合理地选择开发集和测试集使得我们的数据分布是一致的

5.开发集和测试集应该服从同一分布。

开发集和测试集不满足同一分布的话,可能会出现如下情况:

1.算法在开发集上过拟合了。

2.测试集比开发集更难进行预测,尽管算法做得足够好,但很难有进一步提升的空间。

3.测试集不一定更难进行预测,但是由于测试集与开发集满足的分布不同,这将导致就算我们在开发集上有良好的表现,但是在测试集上也不能够取得很好地表现,并且这种情况改善开发集的准确率是对测试集没有多大作用的。因此,寻找能够在某个分布上进行训练,同时能够很好地泛化到另一个分布上的学习算法同样是一个重要的研究课题。如果我们只是想在应用上得到进展的话,还是找满足同一分布的开发集和测试集比较好。

6.开发集和测试集应该有多大?

在大数据时代,有时我们面临的机器学习问题的样本数量超过10亿。即开发集和测试集中样本的绝对数量一直在增长。可总体上分配给开发集和测试集的数据比例正在不断降低。可以看出,我们并不需要将开发集和测试集的规模提升到远超过评估算法性能所需的程度。也就是说开发集和测试集的规模并不是越大越好。

7.使用单值评估指标进行优化

所谓的单值评估指标(single-number evaluation metric)有很多,如分类准确率。还有一种是查准率(precision, 又译作精度)和查全率(Recall,又译作召回率)的组合,并不能作为单值评估指标,因为它给出了两个值来对你的分类器进行评估。多值评估指标提高了算法优劣对比的难度。

猫分类器的查准率指的是:在开发集(或测试集)内,那些已经被预测为猫的图片之中,实际类别是“猫”的样本比例。

查全率指的是:在开发集(或测试集)内,所有实际类别为猫的图片中,被正确预测为猫的样本比例。

简要记一下的话就是:查准率是识别之后的猫中,预测正确的准确率;查全率是识别之前的猫中,被正确预测的准确率。

当你的团队在进行开发时,往往会尝试很多种多样的算法架构、模型参数、特征选择,或是一些其它的想法。可以通过使用单值评估指标(如准确率),根据所有的模型在此指标上的表现,进行排序,从而能够快速确定哪一个模型的性能表现最好。当然我们也可以采取将查准率与查全率的平均值作为评价指标。

8.优化指标和满意度指标

假设我们即关心算法的准确率(accuracy),又在意其运行时间(running time)。我们当然也可以将这两个指标通过一个简单的数学公式转化为一个指标。但是我们也有另外一种方案:

首先定义一个“可接受的”运行时间,一般低于100ms。接着,在限定的运行时间范围内,尽可能地将分类器的准确率最大化。此时,运行时间代表着“满意度指标”。准确度则代表“优化指标”。

9.通过开发集和度量指标加速迭代

当面对新的问题的时候我们也很难提前知道使用哪种方法是最合适的,即使一个经验丰富的机器学习研究员,通常也会需要很多次才能够知道哪个方法会比较好。但是通常会尝试下面的方法:

1.尝试一些关于系统构建的想法(idea)

2.使用代码(code)实现想法。

3.根据实验(experience)结果判断想法是否行地通。在此基础上再学习总结,从而产生新的想法,并保持这一迭代过程。

10.何时修改开发集、测试集和指标

如果我们发现初始的开发集、测试集和指标设置与期望目标有一定差距,那么就需要想办法改进一下它们。例如我们的开发集与指标在排序时将分类器A排在B的前面。然而我们的团队认为分类器B在实际产品上的表现更加优异,这个时候就需要考虑修改开发集和测试集,或者是我们的评估指标了。

在之前说的检测猫的分类器中,可能会有以下三个主要原因导致开发集/评估指标错误地将分类器A排在B前面:

1.你需要处理的实际数据的分布和开发集/测试集数据的分布情况不同。

假设你的初始开发集和测试集中主要是成年猫的图片,然而你在app上发现用户上传的更多是小猫的图片,这就导致了开发集和测试集分布与你需要处理数据的实际分布情况不同。这种情况下,需要更新我们的开发集和测试集,使之更具代表性。

2.算法在开发集上过拟合了。

在开发集上反复评估某个想法会导致算法在开发集上”过拟合“。当你完成开发后,应该在测试集上评估你的系统。如果你发现算法在开发集上的性能比测试集好得多,则表明你很有可能在开发集上过拟合了。在这种情况下,你需要获取一个新的开发集。

如果需要跟踪团队的进度,你可以每周或者每月在测试集上对系统进行一次定期评估。但不要根据测试集指标对算法做出任何决策,包括是否将系统回滚到前一周的状态。因为这样做会导致算法在测试集上开始过拟合,并且不再指望通过测试集对你的系统性能进行完全无偏估计。

3.该指标不是项目应当优化的目标。

假设你的猫咪识别分类器当前的指标为分类准确率,在该指标下分类器A优于分类器B。然而在尝试了两种算法之后,我们发现A分类器允许出现一些色情图片,我们无法忍受这种情况,即使分类器A的准确率比B好。

我们此时根据该指标来选择算法并不可靠,也说明此时应该改变现有的评估指标。你可以选择修改指标,使之对出现色情图片的情况执行严重的惩罚。最好地话就是选择一个新的指标并为你的团队制定一个新的研究目标,而不是在不可信的指标上耗费太多时间。

11.小结:建立开发集和测试集

1.被选择作为开发集和测试集的数据,应当与你未来计划获取并对其进行良好处理的数据有着相同的分布,而不一定和训练集的数据分布一致。

2.开发集和测试集的分布应当尽可能一致。

3.为你的团队选择一个单值评估指标进行优化。

4.当需要考虑多项目标时,不妨将它们整合到一个表达式里(比如对多个误差指标取平均),或者设定满意度指标和优化指标。

5.机器学习是一个高度迭代的过程:在出现最终令人满意的方案之前,你可能要尝试很多想法。

6.拥有开发集、测试集和单值评估指标可以帮助你快速评估一个算法,从而加速迭代进程。

7.当你要探索一个全新的应用时,尽可能在一周内建立你的开发集、测试集和评估指标;而在已近相对成熟的应用上,可以考虑花费更长的时间来执行这些工作。

8.传统的70%/30% 训练集/测试集划分对于大规模数据并不适用,实际上,开发集和测试集的比例会远低于30%。

9.开发集的规模应当大到能够检测出算法精度的细微改变,但也不需要太大;测试集的规模应该大到能够使你能对系统的最终性做出一个充分的估计。

10.当开发集和和评估指标对于团队已经不能提供一个正确的导向时,尽快修改它们:(i)如果算法在开发集上过拟合,则需要获取更多的开发集数据。(ii)如果开发集与测试集的数据分布和实际分布不同,则需要获取新的开发集和测试集。(iii)如果评估指标无法对最重要的任务目标进行度量,则需要修改评估指标。

猜你喜欢

转载自blog.csdn.net/weixin_39059031/article/details/83445210
今日推荐