foolyc

MLY S05 Your development and test sets

你的开发和测试集

回到最初提到的识别猫图片的例子:假设你运行一个手机应用,用户会向应用上载各种不同的图片,而你想自动识别出猫的图片。

你的团队从不同网站下载了很多猫的图片(正样本)和其他图片(负样本)构建了训练的数据集,并将数据集按照70%和30%的比例分成训练集和测试集。通过这些数据训练,得到了一个在训练集和测试集上效果很好的识别器。

但是当你将训练好的识别器部署到手机应用上时,你却发现效果非常差。

那么是什么情况呢?

你发现手机应用上用户们上传的照片和你从网站下下载用作训练数据集的图片有很大差异:手机应用用户上传的用手机拍摄的照片,分辨率低/模糊/光线差。由于你使用网站下载的图片作为训练数据集,但对于智能手机拍摄照片,你的算法泛化能力并不好。

在大数据纪元以前,将数据集按照70%/30%比例随机分为训练集和测试集是机器学习中的常用准则。这种做法可以work,但是在越来越多的应用中,训练集(在我们的例子中就是下载的网站图片)和测试集(手机拍摄的图片)分布差异非常大,此时这种做法却是个很差的想法。

我们通常定义:

  • 训练集 —- 算法训练使用的数据
  • 开发集 —- 这部分数据用来调整参数,选择特征,以及关于学习算法的其他决定。有时也被称为预留交叉验证集(hold-out cross validation set)
  • 测试集 —- 这部分数据用于评估算法性能,但是不作为优化算法或调整参数的依据

一旦确定开发集和测试集之后,你的团队将会尝试很多想法,比如使用不同的学习参数,来让算法更加有效。开发集和测试集可以让团队更快地评估自己的算法。

换而言之,开发集和测试集的目的是指导你的团队对机器学习系统做出最重要的改变

因此,你应该做的是:

根据你未来期望获得的数据和预期的性能来选择恰当的开发集和测试集。

换而言之,你的测试集不能简单用所有数据的30%, 特别是当你预期得到的数据(这个案例中是手机app上的图片)和你的训练数据(网站上下载的图片)在实际上不一样时。

当你的手机app没有上线时,你并没有用户,因此你也没有用户上传的图片,也就是你预期你的算法能handle well 的数据。但是你可以尽量做到近似,例如让朋友用手机拍摄照片并发送给你。而一旦你的app上线之后,你就可以用用户们上传的图片作为开发集和测试集。

如果你实在没办法弄到数据来近似你的预期数据,那你也可以暂时使用网站上的图片。但是你必须认识到,你得到的系统可能泛化能力不好。

有时可能我们需要决定投资多少去获取好的开发集和测试集。但是切记不要假定你的训练集分布和测试集分布必须是一样的。尝试去挑选能反映你预期性能的数据作为测试样本,而不是那些你的训练数据。

本文由foolyc创作和发表,采用BY-NC-SA国际许可协议进行许可
转载请注明作者及出处,本文作者为foolyc
本文标题为MLY S05 Your development and test sets
本文链接为http://foolyc.com//2017/03/29/MLY-S05-Your-development-and-test-sets/.