# 6. 你的开发集和测试集应当来自相同的分布

根据你的最大市场，你将你的猫咪应用数据分成了四个区域：（i）美国，（ii）在中国，（iii）印度和（iv）其他。为了拿出开发集和测试集，把美国和印度作为开发集；中国和其他作为测试集。换句话说，我们可以随机指定两个区域作为开发集，另外两个作为测试集，对吗？

![](https://726924510-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LATGeHOwfM9im7p_Lly%2F-LAVzgqj0RLTAvNaS99z%2F-LAVzi_UgGd6w_txTr3l%2F6.1.jpg?generation=1524193227332197\&alt=media)

一旦你定义了开发集和测试集，你的团队将会专注于提高开发集的性能。所以，开发集应该反映你最想提高的任务：应当在四个区域做好，而不是两个区域。

开发集和测试集分布不同带来的第二个问题是：有可能你的团队做的算法可以在开发集上运行的非常好，但是在测试集上表现的非常糟糕。我已经看到了这个令人非常沮丧和浪费精力的结果。要避免这个事情发生在你身上。

作为一个例子，假设你的团队开发了一个在开发集上运行良好但在测试集上表现非常差的系统。如果你的开发集和测试集来自于同一分布，那么你非常清楚的知道哪里出了问题：你过拟合了开发集。显而易见的办法是获取更多的开发集数据。

但是如果你的开发集和测试集来自于不同的分布，那你的选择就不那么清晰了。有几件事情可能出错了。

1. 你过拟合了开发集。
2. 测试集相对于开发集更难识别或预测。你的算法已经做到了所能期望的最好表现，并且没有明显可以提高的可能。
3. 测试集并不难于开发集，只不过是不同于开发集。所以在开发集表现良好的并不能在测试集上表现良好。在这种情况下，大量的用于提高测试集性能的工作可能只是浪费精力。

开发机器学习应用已经足够困难。不匹配的开发集和测试集上回引入更多的不确定性，关于提升开发集的效果是否会提高测试集效果的不确定性。使用不匹配的开发集和测试集会使弄清楚什么是有效果什么是没有效果的问题上更加困难，从而使决定何种工作应该优先做变得困难。

如果你正在处理第三方基准测试，他们的创建者可能有指定不同分布的开发集和测试集。与开发集与测试集来自同一分布相比，运气而不是技能将会在基准测试中产生更大影响。开发学习算法的一个很重要的问题是在一个分布上进行训练，并且很好的泛化（推广）到另一个分布。但是，如果你的目标是在特定的机器应用程序上取得进展，而不是进行研究，我建议你从相同分布中抽取开发集和测试集。这会让你的团队更加有效率。
