您的开发和测试集 让我们回到我们早期猫图片的那个例子:你运行一个移动app,用户正在上传很多不同事物的图片到该app中。你想自动找到猫的图片。 您的团队通过从不同网站上下载猫(positive examples,正样本)和非猫(negative examples,负样本)的图获得一个大的训练集。 他们将数据集按照比例70%/ 30%分成训练集/测试集。 使用这些数据,他们构建了一个在训练集和测试集上都表现很好的的猫检测器。 但是当你将这个分类器部署到移动app时,你发现表现真的很糟糕!
发生了什么? 您发现用户上传的图片与您构建训练集的网站图片有所不同:用户上传的照片使用手机拍摄,这些照片往往分辨率较低,比较模糊,并且采光不好。 由于您的训练集/测试集是由网站图片构建的,您的算法没有很好的兼顾到你所关心的智能手机图片的实际分布。 在大数据的时代之前,在机器学习中使用随机的70%/ 30%来分割训练集和测试集是常见的规则。 这种做法可以工作,但在越来越多的应用程序,如训练集的分布(上面例子中的网站图像)不同于你最终关心的分布(手机图像),这是一个坏主意。
我们通常定义:
-
训练集 - 学习算法运行在这上面。
-
Dev(开发)集 - 用于调整参数,选择特征,以及对学习算法做出其他决定。 有时也称为维持交叉验证集(hold-out cross validation set)。
-
测试集 - 用于评估算法的性能,但不要做出关于使用什么学习算法或参数的任何决定。
你定义一个开发集和测试集,你的团队会尝试很多想法,如不同的学习算法参数,看看什么是最好的。 开发集和测试集能够使你的团队快速看到你的算法做得有多好。
换句话说,开发和测试集的目的是指导你的团队对机器学习系统进行最重要的更改。 所以,你应该做如下事情:
-
选择开发和测试集,以反映您期望在未来获得的数据,并希望做好。
换句话说,您的测试集不应该只是可用数据的30%这么简单,特别是如果您期望您的未来数据(移动app图片)在性质上与您的训练集(网站图像)不同时。
如果您尚未启动移动app,可能还没有任何用户,因此可能无法获取准确反映您未来需要做的更好的数据。 但你可能仍然尝试去靠近它。 例如,请你的朋友拍一些手机图片,并发送给你。 一旦app启动后,您可以使用实际的用户数据更新您的开发集/测试集。 如果你真的没有任何方法来获得接近你期望的未来数据,也许你可以从使用网站图像开始。 但是你应该意识到这将导致系统不能一般化的很好的风险。 我们需要判断去决定多少投资开发好的开发集和测试集。 但是不要假定你的训练分布与你的测试分布是一样的。 尝试选择反映您最终想要表现良好的测试样本,而不是训练遇到的任何数据。