0%

6. 开发集和测试集应该来自同一分布

根据市场情况,由于存在不同地区的用户,你可以把你的猫咪APP图片数据分为四个区域:
(1) 美国
(2) 中国
(3) 印度
(4) 其它地区
为了生成一个开发集和测试集,你可能会随机的分配两个地区的数据到开发集中,另外两个作为测试集。比如:来自美国和印度的数据作为一类,来自中国和其它地区的数据作为另一类。

一旦你这样划分了数据集,你的团队可能会主要关注提高在开发集的上的性能。开发集应该能够正确的反映出你的整体情况,而不是局部情况。比如这里主要提升了APP在美国和印度区域的性能,而没有考虑到中国和其他地区。
其次,开发集和测试集如果来自不同分布还会导致另一个问题:你团队进行开发后会发现,算法在开发集(美国,印度)上的效果会非常好,但是到了测试集(中国,其它地区)上就会变得很差。我曾经看到过很多人都是因为这个问题导致白费了很多努力,所以我不希望这发生在你的身上。
举一个例子,假设你团队开发的系统在开发集上的效果非常好,但是在测试集上却表现的非常糟糕。如果你的开发集和测试集来自于同种分布,那么你可以立刻判断,你的算法在开发集上过拟合了。比较简单的解决办法是输入更多的数据进行算法性能提升。
但是如果开发集和测试集来自不同分布,那么你可能就比较不好找原因了,可能会出现以下错误:

  1. 你的算法在开发集上过拟合了
  2. 测试集比开发集更难识别,所以算法输出的结果可能就没预期那么好了,而且进行改进比较困难
  3. 测试集不一定比开发集更难识别,只是它们来自不同分布。所以在开发集上表示好的算法并不能在测试集上表现良好。(如,美国和印度猫咪的数据可能就无法反映出中国和其他区域猫咪的数据)这种情况下,你之前对算法进行改进的努力可能都白费了。

机器学习的应用本身是非常困难的。如果开发集和测试集还没有来自同一个分布,那么你将会浪费很多时间在你的算法上。甚至你不知道你该做什么,不该做什么。
如果你面对的是第三方基准测试(benchmark)的问题,可能开发集和测试集来源于不同的分布,这种时候只有运气对你算法产生的影响最大。当然,如果开发集和测试集在同一分布,那么你的算法应该能够很好的进行推广和拓展。如果你开发的应用是针对特定的方向的话,我建议在选择开发集和测试集的时候让它们在同一分布