首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Macheine Learning Yearning学习笔记(二)

Macheine Learning Yearning学习笔记(二)

作者头像
yuquanle
发布2019-07-23 10:18:38
3440
发布2019-07-23 10:18:38
举报
文章被收录于专栏:AI小白入门AI小白入门

Chapter 5~Chapter 12 详细讨论了设置开发集(development sets)和测试集(test sets)


Chapter 5、Your development and test sets (您的开发和测试集)

让我们回到前面的例子:猫的图片问题,其实可以看成一个二分类的问题,当图片是猫时,这是正样本(positive examples),当图片不是猫时,这些样本是负样本(negative examples)。在机器学习中一般按照比例70%/30%来切分成训练集(traindata set)/测试集(testdata set)。

当我们按照这种方式训练了一个模型时(分类器),这个模型在训练集和测试集都表现的很好,但是当你把这个模型部署到移动APP时,你发现效果很糟糕!

出现这种情况的原因是什么呢?

我们发现用户上传的图片与您构建训练集的网站图片有所不同:用户上传的照片使用手机拍摄,这些照片往往分辨率较低,比较模糊,并且采光不好。 由于您的训练集/测试集是由网站图片构建的,您的算法没有很好的兼顾到你所关心的智能手机图片的实际分布。这也就是说我们的训练集的分布(上面例子中的网站图片)不同于你最终关心的分布(手机图片),这就是问题所在。

我们通常定义:

  • 训练集(Training set) - 学习算法通过训练集调整参数。
  • 开发集(development set) - 用于调整参数,选择特征,以及对学习算法做出其他决定。 有时也称为留出交叉验证集(hold-out cross validation set)。
  • 测试集(Test set) - 用于评估算法的性能,但不能用这个部分数据集去学习算法参数。

你定义一个开发集和测试集,你的团队会尝试很多想法,如不同的学习算法参数,看看什么是最好的。 开发集和测试集能够使你的团队快速看到你的算法做得有多好。换句话说,开发和测试集的目的是指导你的团队对机器学习系统进行最重要的更改。

当我们出现未来数据(移动app图片)在性质上与您的训练集(网站图像)不同时,就应该调整测试集和开发集数据,而不是仅仅用那切分出来的30%,这样训练出来的模型部署之后效果肯定会糟糕,因为训练集和测试集的数据分布不一样。


Chapter 6、Your dev and test sets should come from the same distribution (您的开发集和测试集应该来自相同的分布)

一旦确定了开发集和测试集,那么我们就会专注于提高开发集的性能,所以开发集应该反映我们想提高任务数据的真实分布

假设我们开发的模型在开发集上性能不错但是在测试集上性能表现不佳。这个时候如果我们的开发集和测试集有相同的分布,那么我们可以明确问题所在:模型在开发集上过拟合了。这样的话我们就可以对症下药:比如增加开发集的数据。可是如果开发集和测试集有不同的分布,那么出现这种情况的原因就不好确定了,这个时候可能:

  • 开发集过拟合
  • 测试集比开发集更难。所以你的算法可能做的和预期一样好,因此没有进一步的重大改进的可能了。
  • 测试集不一定更难,但只是和开发集不同。所以在开发集上表现很好但并不能在测试集上表现一样好。这种情况下,之前很多提高开发集性能的努力可能都白费了。

如果开发集和测试集不匹配,那么很难确定哪些做法是可以的,哪些做法是不好的,所以很难确定后续优化的idea。开发学习算法的一个重要研究问题是在一个分布上进行训练,并很好地推广到另一个分布。 但是,如果您的目标是在特定的机器学习应用程序上取得进展而不是进行研究,那么建议尝试从相同的分布中选择开发集和测试集。这会让你的团队更有效率。


Chapter 7、How large do the dev/test sets need to be? (开发集/测试集需要多大?)

开发集应该足够大,以检测您尝试的算法之间的差异。

例如,如果分类器A具有90.0%的准确度,分类器B具有90.1%的准确度,那么100个样本规模的开发集将不能检测出这0.1%的差异。常见的开发集的大小在1,000到10,000个样本之间。有10,000个样本,你将有可能检测到这0.1%的提升。

对于一些成熟的应用,例如广告,网络搜索和商品推荐 – 有很多团队,甚至为提升0.01%积极努力,因为它对公司的利润有直接影响。在这种情况下,开发集可以远大于10,000,以便检测出这种细微的提升。

测试集的大小应该多大?它应该足够大,使得对系统的整体性能有一个高的置信度。一个比较常见的启发式方法是将30%的数据用于测试集。当你有适量的样本,比如100到10,000的样本,它会工作的很好。但在大数据的时代,我们遇到很多机器学习问题有时会超过十亿个样本,这种情况下分配给开发集/测试集的比例一直在缩小,即使开发集 /测试集中的样本绝对数量一直在增长。除了需要评估算法的性能之外,没有必要提供过大的开发集/测试集。


Chapter 8、Establish a single-number evaluation metric for your team to optimize(为你的团队进行算法优化建立一个单一数字的评估指标)

当我们面对大量的分类器中进行选择时,使用单一数字的评估指标可以加快你做出决策的能力。所有这些都给出了明确的性能排名,从而给出一个清晰的前进方向。

分类准确率(Accuracy)是一种单一的评价指标,比如我们说分类器A有97%准确率,分类器B有90%准确率,那么我们说分类器A优于分类器B。

而查准率(Precision)和查全率(Recall)就不是一个单一数字的评估指标:它给出了两个数字来评估分类器。拥有多个数字的评估指标使得比较算法更加困难。假设你的算法表现如下:

如果你真的即关心查准率(Precision)又关心查全率(Recall),我推荐使用一种标准方法将它们组合成一个单一的数字。例如,可以取Precision和Recall的平均值,最终得到单个数字。或者,你可以计算“F1度量(F1 score)”,这是一种基于其平均值改善的方法,比简单地取平均值效果要好:

另一种例子,假如你分别要在四个主要市场((i)美国,(ii)中国,(iii)印度和(iv)其他地区)跟踪猫分类器的准确率。这里提供了四个指标。通过对这四个数据进行平均或加权平均,最终得到一个单一数字度量。取平均值或加权平均值是将多个指标合并为一个的最常见的方法之一。


Chapter 9、Optimizing and satisficing metrics(优化指标和满足指标)

这里还有一种组合多个评估指标的方法。

假设你同时关心算法的准确率和运行时间。你需要在如下三个分类器中进行选择:

这种情况下,如果将准确率和运行时间通过如下一个公式得到单个评估指标会看起来不太自然,例如:Accuracy − 0.5∗RunningTime

这个时候我们可以这样做:首先,定义一个“acceptable”的运行时间。例如任何运行时间在100ms以内的算法都是可接受的。然后,根据满足运行时间标准的分类器,最大化准确率。这里,运行时间就是一个“satisficing metric”,你的分类器必须要在这个指标上表现地“good enough”就行,这就意味着它最多为100ms。准确率是一个“optimizing metric”。

这种方法可以推广到多个情况,如果你正在权衡N个不同的标准,你可以考虑将其中N-1个标准设置为为“satisficing”指标。也就是说你只需要他们满足特定的值即可。然后将最后一个定义为“optimizing”指标。

一旦你的团队按照评估指标进行优化,他们将能够取得更快的进展。


Chapter 10、Having a dev set and metric speeds up iterations(有一个开发集和评估指标来加速迭代)

对于一个新问题,其实很难事先知道用什么方法是最合适的。即使经验丰富的机器学习研究人员通常也会在尝试过很多想法之后,才能发现令人满意的东西。在构建机器学习系统时,我经常会:

  1. 首先有一些如何构建系统的想法(idea)
  2. 用代码(code)来实现这些idea
  3. 进行实验(experiment),来告诉我的这个idea工作的如何。(通常我的前几个想法并不能work)基于这些学习,回去从而产生更多的idea,并不断迭代。

这是一个不断迭代的过程。你循环得越快,你的进展也就越快。这就是 开发/测试集 和评估指标非常重要的原因:每次尝试一个idea时,在开发集上衡量idea的表现,将使你快速判断你是否在朝着正确的方向前进。

相反,如果你没有特定的开发集和评估指标。那么每次团队开发出一个新的猫分类器时,你必须把它移植到你的app中,并体验几个小时来感受一下这个新的分类器性能是否有提升。这将非常慢!

此外,如果你的团队将分类器的准确率从95.0%提升到95.1%,你可能无法通过体验app来感受到0.1%的提升。而通过不断积累这些许多个0.1%的改进,你的系统将取得很大的进步。

有一个开发集和评估指标,可以使你很快地检测出哪些想法给你的系统带来了小(或大)的提升,因此你可以快速决定哪些想法可以继续改善,哪些可以舍弃。


Chapter 11、When to change dev/test sets and metrics(什么时候需要更改开发/测试集和评估指标)

当开始一个新项目时,我会试图快速选择开发/测试集 ,因为这样可以给团队制定一个明确的目标。

如果你之后发现初始的开发/测试集或评估指标与目标有失偏颇,那么使用一切手段快速更改它们。例如,如果在你的开发集和评估指标上分类器A比分类器B表现好,但你的团队认为分类器B在实际产品中表现的更优越,这可能表示你需要更改开发/测试集或评估指标。

造成开发集/评估指标不正确地把分类器A排得更高的原因可能有:

  • 实际数据分布和开发/测试集不同。假设你的初始开发/测试集主要是一些成年猫的照片。你查看猫app,发现用户上传了比预期多很多的幼猫的照片。所以,开发/测试集的数据分布并不能代表实际的数据分布。这种情况下,更新你的开发/测试集,使其更具代表性。
  • 你已经在开发集上过拟合了。在开发集上反复评估想法的过程导致算法逐渐对开发集“过拟合”。当完成开发后,你将在测试集上评估你的算法。如果你的算法在开发集上的表现远好于在测试集上的表现,这意味着你已经过拟合开发集。这种情况下,更新开发集。但不要使用测试集来对算法做任何决定,如果这样做,你将开始过拟合测试集,并且不能再依靠它来完全无偏见的评估系统的性能(你可能会在发表研究论文或做出重要商业决策是使用这个指标)。
  • 评估指标衡量的并不是项目所需要优化的东西。假设对于你的猫app,你的评估指标是分类准确率。当前在该指标下分类器A优于分类器B。但是假设你尝试了这两种算法,发现分类器A会偶尔允许色情图片通过。那么即使分类器A准确率更高,偶尔的色情图片所带来的坏影响也意味着其表现是不可接受的。你需要做什么呢? 这里,该评估指标不能辨别出对产品而言算法B比算法A更好这一事实。所以,你不能再相信该指标能挑选出最佳算法。是时候改变评估指标了。例如,你可以更改评估指标,严厉惩罚色情图片分类错误。我强烈建议你选择一个新的评估指标,并用新的标准来为团队明确定义一个新的目标,而不是在一个不可信的评估指标下处理太长时间,并恢复到手工选择分类器。

在项目中改变开发/测试集和评估指标是很常见的。拥有一个初始的开发/测试集和评估指标能帮助你快速迭代。如果你发现 开发/测试集和评估指标不再使你的团队在正确方向上前进,这不是什么大问题!只需要改变它们,并确保你的团队知道新的方向。


Chapter 12、Takeaways: Setting up development and test sets(小结:建立开发集和测试集)

  1. 从分布中选择开发集和测试集,该分布反映你期望在未来获得什么样的数据,并希望在上面做得很好。这可能和你训练数据的分布不一样。
  2. 如果可能的话,选择来自同一分布的开发集和测试集。
  3. 为你的团队选择单一数字的评估指标进行优化。如果你关心多个目标,考虑把它们合并到一个公式中(例如平均多个错误指标),或设定满足指标和优化指标。
  4. 机器学习是一个高度迭代的过程:在发现你满意的方法之前你可能需要尝试很多的idea。
  5. 开发/测试集和单一数字评估指标可以帮助你快速评估算法,从而迭代的更快。当开始一个全新的应用时,尝试快速建立开发/测试集和评估指标,最好在一周之内。当然,在成熟应用上花费更长的时间是ok的。
  6. 当你拥有大量数据时,依据70%:30%的比例划分训练/测试集这一经验性的方法不太适用;开发/测试集可以占远小于30%的数据量。
  7. 你的开发集应该足够大,以检测出算法准确性有意义的改变,但没必要更大。你的测试集应该足够大,大到能对你的系统整体性能有一个确信的评估。
  8. 如果你的开发集和评估指标不再使你的团队在正确方向上前进,快速改变它们:

(i)如果你过拟合了开发集,去获得更多的开发集数据。

(ii)如果你所关心的实际分布和开发/测试集的分布不同,那么去获得新的开发/测试集数据。

(iii)如果你的评估指标不再能衡量对你来说最重要的东西,改变评估指标。

参考:

1.http://www.mlyearning.org/

2.https://xiaqunfeng.gitbooks.io/machine-learning-yearning/content/


更多个人笔记请关注:

知乎专栏:https://www.zhihu.com/people/yuquanle/columns

公众号:StudyForAI(小白人工智能入门学习)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI小白入门 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Chapter 5~Chapter 12 详细讨论了设置开发集(development sets)和测试集(test sets)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档