众所周知,特别是在自然语言处理中,机器学习应该分两个步骤进行,训练步骤和评估步骤,并且它们应该使用不同的数据。为什么是这样?直观地说,这个过程有助于避免过度拟合数据,但我没有看到(信息论)原因是这种情况。
与此相关的是,我已经看到了一些关于应该将多少数据集用于训练和多少用于评估的数字,例如分别为 2/3 和 1/3。选择特定分布是否有任何理论基础?
众所周知,特别是在自然语言处理中,机器学习应该分两个步骤进行,训练步骤和评估步骤,并且它们应该使用不同的数据。为什么是这样?直观地说,这个过程有助于避免过度拟合数据,但我没有看到(信息论)原因是这种情况。
与此相关的是,我已经看到了一些关于应该将多少数据集用于训练和多少用于评估的数字,例如分别为 2/3 和 1/3。选择特定分布是否有任何理论基础?
有趣的是,最受好评的答案并没有真正回答这个问题:) 所以我认为用更多的理论来支持这一点会很好 - 主要来自“数据挖掘:实用机器学习工具和技术”和Tom Mitchell 的“机器学习”。
介绍。
所以我们有一个分类器和一个有限的数据集,一定数量的数据必须进入训练集,其余的用于测试(如果需要,第三个子集用于验证)。
我们面临的困境是:要找到一个好的分类器,“训练子集”应该尽可能大,但要获得好的错误估计,“测试子集”应该尽可能大——但两个子集都取自同一个游泳池。
很明显,训练集应该大于测试集——也就是说,分割不应该是 1:1(主要目标是训练,而不是测试)——但不清楚分割应该在哪里。
坚持程序。
将“超集”拆分为子集的过程称为保持方法。请注意,您可能很容易倒霉,并且某个类的示例可能会在其中一个子集中丢失(或过度呈现),这可以通过以下方式解决
在单个(非重复)保留过程中,您可能会考虑交换测试和训练数据的角色并对两个结果进行平均,但这只有在训练集和测试集之间以 1:1 的比例分配时才合理,这是不可接受的(请参阅简介)。但这给出了一个想法,并且使用了一种改进的方法(称为交叉验证) - 见下文!
交叉验证。
在交叉验证中,您决定固定数量的折叠(数据的分区)。如果我们使用三折,则数据被分成三个相等的分区,并且
这称为三重交叉验证,如果也采用分层(通常是这样),则称为分层三重交叉验证。
但是,你瞧,标准方法不是2/3:1/3 分割。引用“数据挖掘:实用的机器学习工具和技术”,
[...] 的标准方法是使用分层 10 折交叉验证。数据被随机分成 10 个部分,其中类的表示比例与完整数据集中的比例大致相同。每个部分依次进行,剩下的十分之九训练学习方案;然后在保持集上计算其错误率。因此,学习过程在不同的训练集上总共执行了 10 次(每个训练集有很多共同点)。最后,对 10 个误差估计值进行平均,得出一个总体误差估计值。
为什么是10?因为“..使用不同学习技术对大量数据集进行的广泛测试表明,10 次折叠大约是获得最佳误差估计的正确折叠数,并且还有一些理论证据支持这一点..”我没有'没有找到他们意味着哪些广泛的测试和理论证据,但这似乎是一个很好的开始挖掘更多 - 如果你愿意的话。
他们基本上只是说
尽管这些论点绝不是结论性的,并且机器学习和数据挖掘界关于什么是最佳评估方案的争论仍在继续,但 10 折交叉验证已成为实际的标准方法。[...] 此外,确切的数字 10 并没有什么神奇之处:5 倍或 20 倍交叉验证可能几乎一样好。
引导程序,并且 - 最后!- 原始问题的答案。
但是我们还没有找到答案,为什么经常推荐 2/3:1/3。我的看法是它继承自引导方法。
它基于带替换的抽样。以前,我们将“大集合”中的一个样本恰好放入其中一个子集中。自举是不同的,一个样本很容易出现在训练和测试集中。
让我们看看一个特定的场景,我们取一个包含 n 个实例的数据集D1并对其进行替换采样n次,以获得另一个包含n 个实例的数据集D2 。
现在仔细观察。
因为D2中的某些元素(几乎可以肯定)会重复,所以在原始数据集中肯定有一些实例没有被挑选出来:我们将使用这些作为测试实例。
D2没有选择特定实例的可能性有多大?每次拍摄被拾起的概率是1/n,所以相反的是(1 - 1/n)。
当我们将这些概率相乘时,它是(1 - 1/n)^n,即e^-1,约为 0.3。这意味着我们的测试集大约是 1/3,训练集大约是 2/3。
我想这就是为什么建议使用 1/3:2/3 拆分的原因:这个比率取自自举估计方法。
把它包起来。
我想引用数据挖掘书中的一句话(我无法证明但假设是正确的),他们通常建议更喜欢 10 倍交叉验证:
对于非常小的数据集,引导过程可能是估计误差的最佳方法。然而,就像留一法交叉验证一样,它也有一些缺点,可以通过考虑一个特殊的、人工的情况来说明 [...] 一个具有两个类别的完全随机数据集。任何预测规则的真实错误率都是 50%。但是记忆训练集的方案将给出 100% 的完美重新替换分数,因此 etraining 实例 = 0,0.632 引导程序会将其与 0.368 的权重混合到给出的总体错误率仅为 31.6%(0.632 ¥ 50% + 0.368 ¥ 0%),这是一种误导性的乐观。
考虑一组有限的 m 个记录。如果将所有记录用作训练集,则可以使用以下多项式完美拟合所有点:
y = a0 + a1*X+a2*X^2 + ... + an*X^m
现在,如果您有一些新记录,未用于训练集,并且输入向量 X 的值与用于训练集的任何向量 X 不同,您能说出预测 y 的准确性吗?
我建议您查看一个示例,其中您有 1 维或 2 维输入向量 X(以可视化过度拟合多项式)并检查某些对 (X, y) 的预测误差有多大,其中 X 值只是一个与训练集的值略有不同。
我不知道这个解释是否足够理论上,但希望它有所帮助。我试图解释回归模型的问题,因为我认为它比其他模型(SVM、神经网络......)更直观易懂。
构建模型时,应至少将数据拆分为训练集和测试集(有些将数据拆分为训练集、评估集和交叉验证集)。通常 70% 的数据用于训练集,30% 用于评估,然后在构建模型时,必须检查训练误差和测试误差。如果两个误差都很大,说明你的模型太简单了(模型有很大的偏差)。另一方面,如果您的训练误差非常小,但训练误差和测试误差之间存在很大差异,则意味着您的模型过于复杂(模型具有高方差)。
选择正确折衷方案的最佳方法是绘制各种复杂模型的训练和测试误差,然后选择测试误差最小的模型(见下图)。
这是泛化的问题——也就是说,我们的假设将如何正确分类不属于训练集的未来示例。请看这个奇妙的例子,如果你的模型只适合你拥有的数据而不是新的数据会发生什么:Titius-Bode law
到目前为止,@andreiser 对 OP 关于训练/测试数据拆分的问题的第二部分给出了出色的回答,@niko 解释了如何避免过度拟合,但没有人了解这个问题的优点:为什么使用不同的数据进行训练和评估帮助我们避免过拟合。
我们的数据分为:
现在我们有了一个模型,我们称之为。我们使用训练实例对其进行拟合,并使用验证实例检查其准确性。我们甚至可以进行交叉验证。但是我们到底为什么要使用测试实例再次检查它呢?
问题是在实践中,我们尝试了许多不同的模型,,具有不同的参数。这就是发生过拟合的地方。我们选择性地选择在验证实例上表现最好的模型。但我们的目标是拥有一个总体上表现良好的模型。这就是我们有测试实例的原因——与验证实例不同,测试实例不参与选择模型。
了解验证和测试实例的不同角色是很重要的。
有关更多详细信息,请参阅《统计学习要素:数据挖掘、推理和预测》第 222 页。