5. 你的开发集和测试集(machine learning ye
让我们回到最初的识别猫图片的例子:你运营一个手机app,用户上传包含不同物品的图片。你希望自动识别其中包含猫的图片。
你的团队从不同的网站上下载了大量包含猫的图片(正例,positive examples)和不包含猫的图片(negative examples)。他们将这些数据按照7:3的比例拆分到训练集和测试集中。使用这些数据,他们建立了一个在训练集和测试集上表现良好的猫检测器。
但是当你将这个分类器移植到手机上时,你发现效果非常差!

发生了什么?
你发现用户上传的图片和训练集中的网络图片不一样:用户通过手机app上传图片往往低分辨率、模糊,并且照明效果更差。由于你的训练/测试集的图片都来源于网络,所以算法没有在手机图片的实际分布上泛化得很好。
在大数据时代之前,在机器学习中通常使用随机的70%和30%来分割训练集和测试集。这种划分可以work,但是在越来越多的训练集分布(上例中的网络图片)和你真正关心的分布(手机图片)不同的应用中,这是一个不好的做法。
我们通常定义:
- 训练集 —— 你的学习算法运行的集合;
- 开发集 —— 用来调参,选择特征,以及对学习算法做出其他决定。有时也被称为留出交叉验证集(hold-out cross validation set);
- 测试集 —— 用来评估算法性能,但是不能用测试集对学习算法或使用的参数做任何决定;
一旦定义了开发集和测试集,团队就可以试验很多想法,比如不同的学习算法参数,看哪个更好。开发和测试集可以让团队更快得看到你的算法做得有多好。
换句话说,开发集和测试集的目的是指导你的团队对机器学习系统做出最重要的改变。
所以你应该:
* 选择开发和测试集,以反映你期望在未来获得的数据,并希望在上面做得很好。
换句话,你的测试集不应该简单的是可获取数据的30%,特别如果你希望你得到的数据(移动app图片)和你训练集数据(网络图片)本质上并不一样。
如果你还没有发布你的app,此时你没有用户上传的数据,这样就还无法获取你希望未来在上面做得很好的数据。但是你仍旧可以试着去接近。比如,请求你的朋友用手机拍照并发给你。一旦你的app发布,你可以使用真实的用户数据更新你的开发/测试集合。
如果你确实没有任何途径获取接近你希望未来会获取的数据,你可能需要从使用网络图片开始。但是你需要意识到这可能会导致系统的泛化能力不好。
我们需要决定花费多大的代价去获取好的开发集和测试集。但是不要假定你的训练集的分布和测试集的分布是一样的。试着去挑选你最终希望表现很好的数据作为测试集,而不是你遇到的所有数据。