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

rob*_*ess 169 machine-learning

有关如何最好地将数据划分为训练和验证集的经验法则吗?是否建议平均50/50分割?或者,与验证数据相关的培训数据是否有明显优势(反之亦然)?或者这个选择几乎取决于应用程序?

我分别主要使用80%/ 20%的培训和验证数据,但我选择了这个部门而没有任何原则性原因.在机器学习方面经验丰富的人能告诉我吗?

Ben*_*son 191

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

如果您总共有100个实例,那么您可能会遇到交叉验证,因为没有一个拆分可以让您在估算中获得满意的差异.如果您有100,000个实例,那么选择80:20分割还是90:10分割并不重要(如果您的方法特别计算密集,您可以选择使用较少的训练数据).

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

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

  • 关键是当你在玩参数时,观察变化的影响,你应该使用你的*validation*数据进行测试.如果您开始查看测试数据,并根据获得最高分的方法选择策略,您将获得对方法性能的夸大感觉.设置完所有参数并做出决策后,*然后*运行测试数据.这可以让您知道您将获得真正新的,未观察到的数据的性能(这可能是您感兴趣的!) (2认同)

Kir*_*ril 48

你会惊讶地发现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%用于培训.

  • 如果我有一个神经网络,我的测试大小应该是1吗? (3认同)
  • 对于那些可能像我一样(不确定原因)加载它的人,该论文是:"验证集训练集比例大小的缩放定律"(I. Guyon,1996,未发表的技术报告,AT&T贝尔实验室). (2认同)
  • 经验法则是否有意义?如果您有两个可调参数,则比率为0.77,这意味着您将使用77%进行验证。恕我直言,问题在于自由参数定义。对于线性SVM,您可以为误差项设置惩罚参数C,这是一个参数,但是对于SVM,其复杂度更高。 (2认同)

Upu*_*ara 44

去年,我跟随教授:Andrew Ng的在线机器学习课程.他的建议是

培训:60%

交叉验证:20%

测试:20%

  • 现代大数据时代的https://www.coursera.org/learn/deep-neural-network/lecture/cxG1s/train-dev-test-sets`,例如,你可能总共拥有一百万个例子,那么趋势是你的开发(交叉验证)和测试集已经变得总量的小得多.他建议它可能是99.5:0.25:0.25. (17认同)
  • 确切地。另外,这个帖子还有点问题。也许作者想写“验证”?交叉验证是另一回事。 (5认同)

Dav*_*992 6

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

如果您拥有非常大的数据集(例如1,000,000个示例),则可能不需要拆分80/10/10,因为无需10%= 100,000个示例就可以证明模型可以正常工作。

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

  • 验证集中的 0.5% 可能就足够了,但我认为你正在冒很大且不必要的风险,因为你不知道是否足够。如果您使用的验证集太小,您的训练很容易出错,但使用大的验证集几乎不可能出错。 (2认同)