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


194

是否有关于如何将数据最佳地分为训练和验证集的经验法则?建议采用50/50的均分方式吗?还是相对于验证数据,拥有更多的训练数据是否有明显的优势(反之亦然)?还是这个选择几乎取决于应用程序?

我主要分别使用了80%/ 20%的训练和验证数据,但我选择该部门时没有任何原则性的理由。能在机器学习方面有更多经验的人可以给我建议吗?


Answers:


220

存在两个相互竞争的问题:训练数据较少,您的参数估计值会有较大的差异。使用更少的测试数据,您的性能统计数据将具有更大的差异。广义上讲,您应该关注数据的划分,以确保方差都不会太大,这更多地取决于每个类别中实例的绝对数量而不是百分比。

如果您总共有100个实例,那么您可能会被交叉验证所困扰,因为没有任何拆分会给您估计值带来令人满意的差异。如果您有100,000个实例,则选择80:20拆分还是90:10拆分并不重要(实际上,如果您的方法特别需要计算,则可以选择使用较少的训练数据)。

假设您有足够的数据来执行适当的保留测试数据(而不是交叉验证),则以下是一种指导处理差异的方法:

  1. 将数据分为训练和测试(80/20的确是一个不错的起点)
  2. 训练数据分为训练和验证(同样,80/20是公平的划分)。
  3. 对训练数据的随机选择进行子采样,使用此训练分类器,并在验证集上记录效果
  4. 尝试使用不同数量的训练数据进行一系列运行:随机抽取20%(例如10次)并观察验证数据的效果,然后对40%,60%,80%进行同样的操作。您应该看到更多的性能和更多的数据,而且不同随机样本的方差也更低
  5. 要处理由于测试数据的大小而引起的差异,请相反执行相同的过程。对所有训练数据进行训练,然后多次随机抽样一定百分比的验证数据,并观察性能。您现在应该发现,小量验证数据样本的平均性能与所有验证数据的性能大致相同,但是对于较少数量的测试样本,方差要大得多。

谢谢,这也非常有帮助!我会试试看。仅供参考,我有大约6000个训练数据实例。我正在使用SVM,因此性能有些问题。
robguinness 2012年

1
FWIW,在性能差异可以通过所有的情况下,一旦进行分类,打进决定他们是否正确与否,然后取样这些计算决定的,而不是测试情况下,产生使用不同的测试集大小的效果
本·阿利森

6000个实例应该足以使使用10%或20%进行测试之间的差异不会太大(您可以使用我描述的方法进行确认)
Ben Allison

1
你好,我们又见面了。我对第5点有些困惑。您说过“然后多次随机抽取一定百分比的验证数据”。您是要查看测试数据吗?如果我理解正确,我应该先将数据分为训练和测试数据集,然后再将部分训练数据集进一步分成验证数据集。因此,在第5步中,如果我要测量测试数据的方差,是否应该从测试数据中随机抽样总体?还是我错过了什么?
robguinness,2012年

2
关键是,当您在处理参数时,观察更改后的效果,应该使用验证数据进行测试。如果您开始查看测试数据,然后根据获得最高分的方法来选择策略,则会对方法的性能产生夸大的感觉。设置完所有参数并做出决定后,然后对测试数据进行运行。这使您知道在全新的,未观测的数据上可能会获得什么样的性能(这可能是您感兴趣的!)
Ben Allison 2012年

54

您会惊讶地发现80/20是相当普遍的比率,通常称为帕累托原理。如果使用该比率,通常是一个安全的选择。

但是,根据您采用的培训/验证方法,比率可能会发生变化。例如:如果您使用10倍交叉验证,那么最终将得到每折叠10%的验证集。

已经对训练集和验证集之间的适当比例进行了一些研究:

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

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

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

它们所谓的复杂性是:

识别器的每个家族都以其复杂性为特征,该复杂性可能与VC维度,描述长度,可调参数的数量或其他复杂性度量无关。

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


2
对于那些可能像我一样无法加载它的人(不确定为什么)的论文是:“验证集训练集比率比例大小的缩放定律”(I. Guyon,1996年,AT&T贝尔实验室未发表的技术报告) )。
theforestecologist

2
经验法则是否有意义?如果您有两个可调参数,则比率为0.77,这意味着您将使用77%进行验证。恕我直言,问题在于自由参数定义。对于线性SVM,您可以将误差项设置为惩罚参数C,这是一个参数,但是对于SVM,复杂度会更高。
里德·理查兹

4
如果我有神经网络,则我的检验大小应该为1吗?
YellowPillow

51

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

培训:60%

交叉验证:20%

测试:20%


20
coursera.org/learn/deep-neural-network/lecture/cxG1s/… in the modern big data era, where, for example, you might have a million examples in total, then the trend is that your dev (cross validation) and test sets have been becoming a much smaller percentage of the total.他建议可能是99.5:0.25:0.25。
Nobu

9

好吧,您应该再考虑一件事。

如果您拥有非常大的数据集(例如1,000,000个示例),则可能不需要拆分80/10/10,因为无需10%= 100,000个示例即可告诉模型正常运行。

也许99 / 0.5 / 0.5就足够了,因为5,000个示例可以代表数据中的大部分差异,并且基于测试和开发中的这5,000个示例,您可以很容易地看出模型运行良好。


验证集中的0.5%足够了,但是我认为您正承担着巨大且不必要的风险,因为您不知道是否足够。如果使用的验证集太小,您的训练很容易出错,但是使用大的验证集几乎不可能使它出错。
比昂·林德奎斯特(BjörnLindqvist)

2

假设您的数据较少,我建议尝试70%,80%和90%并进行测试,以得出更好的结果。在90%的情况下,对于10%的测试,您可能会获得较差的准确性。


1

也许63.2%/ 36.8%是一个合理的选择。其原因是,如果你有一个总样本量ñ,想随机抽样与更换(又名重采样,在统计自举)ñ情况下走出最初的ñ,在被选择的个别情况的概率如果n不太小,则重新采样将约为0.632 ,如此处所述:https : //stats.stackexchange.com/a/88993/16263

对于n = 250 的样本,为重新采样至4位数选择单个案例的概率为0.6329。对于n = 20000 的样本,概率为0.6321。


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.