假设你正在将机器学习应用于不同分布的训练集和开发/测试集上。例如,训练集包含了互联网图像+移动app端图像,而开发/测试集只包含移动app端图像。然而,该算法运行得不太好:它的开发/测试集误差比想要的要高得多。以下是一些可能出现问题的情况:
- 它在训练集上做的不好。这是训练集分布上的高(可避免)偏差问题。
- 它在训练集上做的很好,但是并没有很好的泛化到之前和训练集来自相同分布的没有被看到的数据上。这是高方差。
- 它很好的泛化到和训练集来自相同分布的新数据上,但没能很好的泛化开发/测试集分布的数据。我们称该问题为 数据不匹配,因为训练数据和开发/测试集数据不匹配。
例如,假设在猫咪识别任务上人可以达到几乎完美的表现。你的算法达到如下水准:
- 在训练集上1%的误差
- 在算法没有看见的和训练集来自相同分布的数据上1.5%的误差
- 在开发集上10%的误差
在这种情况下,显然存在数据不匹配问题。为了解决该问题,你可能需尝试获取和开发/测试集更类似的训练数据。我们稍后将讨论一些方法。
为了诊断算法在上述1-3问题上遭受何种程度的影响,有另一个数据集事有用的。具体来说,与其给算法所有可用的训练数据,不如将其分成两个子集:算法用于训练的实际训练集,和一个独立的数据集,我们称之为“训练开发”集,不用于训练。
现在你有四个数据子集:
- 训练集:这是算法将从中学习的数据(例如互联网图片和移动app端图片)。这不必从我们真正关心数据的相同分布(开发/测试集分布)中获取。
- 训练开发集:该数据和训练集来自相同的分布(即互联网图片和移动app端图片)。通常比训练集要小,它只需要足够大以评估和跟踪学习算法的进度就行。
- 开发集:和测试集来自相同的分布,它反映我们最终关心并想要做好的数据的分布(即移动app端图片)。
- 测试集:和开发集来自相同的分布(例如移动app端图片)。
有以上四个独立的数据集,现在你可以评估:
- 训练误差,通过对训练集进行评估。
- 算法泛化到和训练数据来自相同分布的新数据的能力,通过对训练开发集进行评估。
- 算法在你关心的任务上的性能,通过对开发、测试集进行评估。
大部分在第5~7章选择开发集大小的指导方针同样适用于训练开发集。