11. 何时更改开发/训练集和评估指标

每当开始一个新项目的时候,我都会试图快速地去选择开发集和训练集,因为这可以给团队一个明确定义好的目标。

我通常会要求我的团队在不到一周的时间内创建好一个初始的开发/训练集(很少情况下会长于这个时间),最好是能够提出一个不太完美的方案并快速行动起来,而不是在过度思考。但是“一周”的这个时间限制并不适用于成熟的应用,比如,反垃圾邮件就是一个成熟的深度学习应用。我曾见过那些负责成熟系统的团队们,甚至会花费数个月的时间来去获取更好的开发/训练集。

如果你后来意识到了你的初始开发/训练集或者评估指标没有达到要求,那么一定要尽快地修改它们。例如,如果你的开发集+评估指标认为分类器A好于分类器B,但是你的团队却认为分类器B其实更适合你的产品,那么这可能表示你该修改你的开发/测试集或者评估指标了。

下列是可能导致分类器A的评级偏高的三个主要原因:

  • 开发/测试集不服从实际数据的真实分布。

假设你的开发/训练集里大部分都是成年的猫。这时,你检查你的猫分类App发现用户比预期上传了更多小猫咪的图片。这个情况下,开发/测试集的分布就不能很好的代表真实数据的分布了,此时应该做的事就是更新你的开发/训练集使其更具代表性。

11. 何时更改开发/训练集和评估指标 - 图1

  • 你过拟合了开发集。

重复地使用开发集评估想法的过程会导致你的算法慢慢过拟合开发集。当你完成开发后,你会在测试集上评估你的系统,如果发现算法在你的开发集的表现明显优于测试集,这就意味已经过拟合了开发集了,这种情况下,需要获取一个新的开发集。

如果你需要跟踪团队的进度,你也可以定期使用测试集对系统进行评估,比如一周一次或者一个月一次。但不要使用测试集来做出关于改进算法任何决定,包括是否回滚到上一周的系统。一旦你这样做了,你的系统将会开始对测试集过拟合,同时再也不能依靠它来给出系统性能的完全无偏估计(Completely Unbiased Estimate)(你可能需要在发表论文或者根据某个评估指标做出重要的商业决策的时候使用这个完全无偏估计)。

  • 该评估指标衡量的不是项目需要优化的内容。

以你的猫分类App为例,你的评估指标是分类准确度,这个评估指标目前认为分类器A好于分类器B.但是当你尝试应用这两种算法的时候,发现分类器A偶尔会将色情图片识别为猫,那么即使分类器A的准确度更高,无法完全将色情图片过滤所引发的不良印象意味着它的表现也是无法被接受的。你应该怎么做?

在这个例子中,该评估指标未能准确判断出对于产品而言算法B比算法A更好这一事实。所以,你不能再相信该指标能够选出最优算法,是时候改变评估指标了。比如,你可以更改评估指标来加大对色情图片的惩罚权重。我强烈建议你选择一个新的评估指标,以此来为团队定义一个新的目标,而不是在一个没有可信度的指标下持续太长时间,最后不得不手工选择分类器。

在项目中更改开发/测试集或者评估指标是很常见的。使用初始开发/测试集和评估指标能够帮助你快速迭代。如果你发现开发/测试集或者评估指标不再为你的团队指明正确的方向,也不是什么大不了的事情!只需要修改它们,并确保你的团队了解了新的方向。