关于如何将数据集划分为训练集和验证集,是否存在经验法则?

是否有一个经验法则来最好地将数据划分为训练集和验证集?平分妥当吗?或者相对于验证数据,拥有更多的训练数据是否有明显的优势(反之亦然)?或者这个选择很大程度上取决于应用程序?

我主要分别使用80% / 20%的训练数据和验证数据,但我选择这种划分没有任何原则性的理由。能找个在机器学习方面更有经验的人给我出主意吗?

236669 次浏览

你会惊讶地发现80/20是一个非常常见的比率,通常被称为帕累托原则。如果你使用这个比例,通常是一个安全的赌注。

然而,根据您采用的培训/验证方法,这个比例可能会发生变化。例如:如果您使用10次交叉验证,那么您将在每次折叠中得到10%的验证集。

有一些关于训练集和验证集的合适比例是多少的研究:

为验证集保留的模式的比例应为 自由的数量与平方根成反比 可调参数。< / p >

在他们的结论中,他们指定了一个公式:

验证集(v)与训练集(t)的大小比,v/t,规模类似 ln(N/h-max),其中N是识别器族的数目 H-max是这些族中复杂度最大的

他们所说的复杂性是:

每一个识别器家族都有其复杂性的特点 可能与vc维相关,也可能与描述无关 长度、可调参数的数量或其他措施 复杂性。< / p >

根据第一条经验法则(即验证集应该与自由可调参数数量的平方根成反比),可以得出这样的结论:如果有32个可调参数,32的平方根是~5.65,分数应该是1/5.65或0.177 (v/t)。大约17.7%用于验证,82.3%用于培训。

去年,我参加了Andrew Ng教授的在线机器学习课程。他的建议是:

培训: 60%

交叉验证: 20%

测试: 20%

有两个相互竞争的问题:训练数据越少,参数估计的方差就越大。使用更少的测试数据,您的性能统计数据将有更大的差异。一般来说,您应该关注划分数据,使方差都不会太高,这更多地与每个类别中实例的绝对数量有关,而不是百分比。

如果你总共有100个实例,你可能会陷入交叉验证,因为没有一个单独的分割会给你的估计带来令人满意的方差。如果你有10万个实例,那么你选择80:20分割还是90:10分割并不重要(实际上,如果你的方法计算量特别大,你可以选择使用更少的训练数据)。

假设你有足够的数据来进行适当的测试数据(而不是交叉验证),下面是一种处理方差的指导方法:

  1. 将数据分成训练和测试(80/20确实是一个很好的起点)
  2. 培训数据分割为训练和验证(同样,80/20是一个公平的分割)。
  3. 对随机选择的训练数据进行子样本,用它训练分类器,并记录在验证集上的性能
  4. 尝试使用不同数量的训练数据进行一系列运行:随机抽取20%的数据,比如10次,观察验证数据的性能,然后对40%、60%、80%进行同样的操作。您应该看到数据越多性能越好,但不同随机样本之间的方差也更低
  5. 要处理由于测试数据大小而产生的方差,可以反过来执行相同的过程。训练你所有的训练数据,然后随机抽样你的验证数据的百分比多次,并观察性能。您现在应该发现,在验证数据的小样本上的平均性能与所有验证数据上的性能大致相同,但在测试样本数量较小时,方差要高得多

也许63.2% / 36.8%是一个合理的选择。原因可能是,如果你有一个总样本量n,并希望从初始n中随机抽样替换(也称为重新抽样,如在统计引导中)n案例,那么在重新抽样中选择单个案例的概率将约为0.632,前提是n不是太小,如这里所解释的:https://stats.stackexchange.com/a/88993/16263

对于n=250的样本,单个情况被重新抽样到4位的概率为0.6329。 对于n=20000的样本,概率为0.6321

这完全取决于手头的数据。如果您有相当多的数据,那么如上所述,80/20是一个不错的选择。但如果你不使用50/50分割的交叉验证,可能会帮助你更多,并防止你创建一个过度拟合训练数据的模型。

你应该再考虑一件事。

如果你有一个非常大的数据集,比如1,000,000个例子,分割80/10/10可能是不必要的,因为10% = 100,000个例子可能太多了,不能说模型工作得很好。

也许99/0.5/0.5就足够了,因为5000个例子可以代表你数据中的大部分方差,你可以很容易地在测试和开发中根据这5000个例子来判断模型是否有效。

不要仅仅因为你听说80/20是可以的就使用80/20。想想测试集的目的。

假设你有较少的数据,我建议尝试70%,80%和90%,并测试哪个会给出更好的结果。在90%的情况下,10%的测试可能会得到较差的准确性。