您的位置:首页 > 其它

Machine Learning Yearning(5、6、7)

2017-03-12 15:44 232 查看
第5、6、7三章,主要讲开发集和测试集,包括选型、大小、比例等。

完整手稿翻译详见:https://github.com/xiaqunfeng/machine-learning-yearning

Setting up development and test sets
Chapter 5Your development and test sets

Chapter 6Your dev and test sets should come from the same distribution

Chapter 7How large do the devtest sets need to be

Setting up development and test sets

设置开发和测试集

Chapter 5、Your development and test sets

您的开发和测试集

​ 让我们回到我们早期猫图片的那个例子:你运行一个移动app,用户正在上传很多不同事物的图片到该app中。你想自动找到猫的图片。

​ 您的团队通过从不同网站上下载猫(positive examples,正样本)和非猫(negative examples,负样本)的图获得一个大的训练集。 他们将数据集按照比例70%/ 30%分成训练集/测试集。 使用这些数据,他们构建了一个在训练集和测试集上都表现很好的的猫检测器。

​ 但是当你将这个分类器部署到移动app时,你发现表现真的很糟糕!



​ 发生了什么?

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

​ 在大数据的时代之前,在机器学习中使用随机的70%/ 30%来分割训练集和测试集是常见的规则。 这种做法可以工作,但在越来越多的应用程序,如训练集的分布(上面例子中的网站图像)不同于你最终关心的分布(手机图像),这是一个坏主意。

​ 我们通常定义:

训练集 - 学习算法运行在这上面。

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

测试集 - 用于评估算法的性能,但不要做出关于使用什么学习算法或参数的任何决定。

​ 你定义一个开发集和测试集,你的团队会尝试很多想法,如不同的学习算法参数,看看什么是最好的。 开发集和测试集能够使你的团队快速看到你的算法做得有多好。

​ 换句话说,开发和测试集的目的是指导你的团队对机器学习系统进行最重要的更改。

​ 所以,你应该做如下事情:

选择开发和测试集,以反映您期望在未来获得的数据,并希望做好。

​ 换句话说,您的测试集不应该只是可用数据的30%这么简单,特别是如果您期望您的未来数据(移动app图片)在性质上与您的训练集(网站图像)不同时。

​ 如果您尚未启动移动app,可能还没有任何用户,因此可能无法获取准确反映您未来需要做的更好的数据。 但你可能仍然尝试去靠近它。 例如,请你的朋友拍一些手机图片,并发送给你。 一旦app启动后,您可以使用实际的用户数据更新您的开发集/测试集。

​ 如果你真的没有任何方法来获得接近你期望的未来数据,也许你可以从使用网站图像开始。 但是你应该意识到这将导致系统不能一般化的很好的风险。

​ 我们需要判断去决定多少投资开发好的开发集和测试集。 但是不要假定你的训练分布与你的测试分布是一样的。 尝试选择反映您最终想要表现良好的测试样本,而不是训练遇到的任何数据。

Chapter 6、Your dev and test sets should come from the same distribution

你的开发集和测试集应该来自相同的分布

根据您最大的市场,将猫应用图片数据分为四个区域:(i)美国,(ii)中国,(iii)印度和(iv)其他。要想出一个开发集和一个测试集,我们可以随机分配这两个区域到开发集,另外两个到测试集,对吧? 比如美国和印度在开发集; 中国和其他在测试集。



​ 一旦定义了开发集和测试集,您的团队将专注于提高开发集的性能。 因此,开发集应该反映你最想提高的任务:在所有四个地区都要做得很好,而不只是两个。

​ 开发集和测试集的不同分布带来的第二个问题:有一个机会,你的团队将构建一些在开发集件上工作得很好,只是发现它在测试集上做得不好。 我曾经在很多失望和白费的努力中看到这个结果。 避免让这些发生在你身上。

​ 例如,假设您的团队开发的系统在开发集上工作的很好,但在测试集上并不如意。 如果你的开发集和测试集合来自相同的分布,那么你会有一个非常明确的诊断哪里出错了:你在开发集上过拟合(overfit)了。显而易见的方法是去获得更多的开发集数据。

​ 但是如果开发集和测试集来自不同的分布,那么你的选择是不清晰的。几方面可能会出错:

1、在开发集上过拟合。

2、测试集比开发集更难。所以你的算法可能做的和预期一样好,因此没有进一步的重大改进的可能了。

3、测试集不一定更难,但只是和开发集不同。所以在开发集上表现很好但并不能在测试集上表现一样。这种情况下,之前很多提高开发集性能的努力可能都白费了。

​ 在机器学习应用程序上工作是很艰难的。具有不匹配的开发和测试集引入了关于是否改进开发集分布也提高测试集性能额外的不确定性。具有不匹配的开发和测试集,使得更难找出什么是有效和无效的努力,因此使得更难以确定工作的优先级。

​ 如果你面临的是第三方基准测试 问题,他们的创建者可能会指定开发集和测试集来自不同的分布。相比开发和测试集来自同一分布,此时运气,而不是技术,将对这样的基准的性能有更大的影响。开发一个在一个分布上训练的很好同时能够很好的推广到另一个分布中的学习算法是一个重要的研究问题。但是如果你的目标是在一个特定的机器学习应用中取得进展,而不是研究进展,我建议尝试选择开发集和测试集从相同的分布。这将使您的团队更有效率。

Chapter 7、How large do the dev/test sets need to be?

开发集/测试集需要多大?

​ 开发集应该足够大,以检测您尝试的算法之间的差异。例如,如果分类器A具有90.0%的准确度,分类器B具有90.1%的准确度,那么100个样本的开发集将不能检测出这0.1%的差异。与我看到的其他机器学习问题相比,100个样本的开发集太小了。常见的开发集的大小在1,000到10,000个样本之间。有10,000个样本,你将有很好的机会检测到这0.1%的提升。[2]

​ 对于成熟和重要的应用,例如广告,网络搜索和产品建议 - 我也看到了很多团队,甚至为提升0.01%积极努力,因为它对公司的利润有直接影响。在这种情况下,开发集可以远大于10,000,以便检测出更小的提升。

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

——————————

[2]. 在理论上,我们可以测试算法的变化是否对开发集产生统计上显着的差异。 在实践中,大多数团队不会为此困扰(除非他们出版学术研究论文),我通常没法发现统计意义的测试对测量临时进展是有用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习
相关文章推荐