如何将数据集划分为训练集和validation集有一个经验法则吗?
如何最好地将数据划分为训练集和validation集,是否有一个经验法则? 甚至50/50分割是可取的? 或者有更多的训练数据相对于validation数据有明显的优势(反之亦然)? 或者是这个select非常依赖于应用程序?
我一直在分别使用80%/ 20%的培训和validation数据,但是我没有任何原则性地select这个部门。 能有机会学习更有经验的人给我build议吗?
有两个相互矛盾的问题:用更less的训练数据,你的参数估计有更大的差异。 用较less的testing数据,你的performance统计将有更大的差异。 一般来说,你应该关心的是如何划分数据,使得方差不是太高,这与每个类别的绝对数量有关,而不是百分比。
如果总共有100个实例,那么您可能会遇到交叉validation问题,因为没有任何一个分割会给您的估计带来令人满意的变化。 如果你有100,000个实例,select80:20分割还是90:10分割并不重要(如果你的方法是特别计算密集的话,你可以select使用更less的训练数据)。
假设你有足够的数据来做适当的保持testing数据(而不是交叉validation),下面是一个有用的方法来处理差异:
- 把你的数据分解成训练和testing(80/20确实是一个很好的起点)
- 将训练数据分解为训练和validation(再次,80/20是公平的分割)。
- 随机select您的训练数据,用此训练分类器,并在validation集上logging性能
- 用不同数量的训练数据进行一系列的运行:随机抽样20%,比如10次,观察性能,然后分别用40%,60%,80%进行testing。 您应该看到更多的数据,而且在不同随机样本中的变异也更大
- 为了处理由于testing数据的大小而导致的差异,请执行相同的步骤。 训练所有的训练数据,然后随机抽样多次validation数据的百分比,并观察性能。 您现在应该发现,validation数据的小样本的平均性能与所有validation数据的性能大致相同,但是对于较less数量的testing样本,方差更高
你会惊讶地发现80/20是一个相当常见的比率,通常被称为帕累托原则 。 如果你使用这个比率,通常是安全的。
但是,根据您使用的培训/validation方法,比例可能会改变。 例如:如果您使用10倍交叉validation,那么您将在每次折叠时以10%的validation集合结束。
对于训练集和validation集之间的适当比例有一些研究:
为validation集保留的模式部分应与自由可调参数数量的平方根成反比。
他们在结论中指定了一个公式:
validation集(v)到训练集(t)的大小比率v / t,比如ln(N / h-max),其中N是识别器族的数目,h-max是这些族的最大复杂度。
他们所说的复杂性是:
识别器的每个家族的特征在于其复杂性,其可能与VC维度 ,描述长度,可调节参数的数量或其他复杂度量相关或不相关。
采用第一条经验法则(即validation集应与自由可调参数数的平方根成反比),可以得出结论:如果有32个可调参数,则32的平方根为〜5.65,分数应为1 / 5.65或0.177(v / t)。 预留17.7%左右,培训82.3%。
去年,我跟随了Andrew Ng的在线机器学习课程。 他的build议是
培训:60%
交叉validation:20%
testing:20%
也许63.2%/ 36.8%是合理的select。 原因是如果你有一个总的样本大小为n,并且想要随机地用n个样本中的replace样本(又如重新样本,就像在统计引导程序中那样) n个样本中的一个样本,如果n不是太小,重新取样大约是0.632,如下所示: https : //stats.stackexchange.com/a/88993/16263
对于n = 250的样本,select重复取样为4位的个案的概率为0.6329。 对于n = 20000的样本,概率是0.6321。
这一切都取决于手头的数据。 如果你有相当数量的数据,那么80/20是一个不错的select,如上所述。 但是如果你没有交叉validation,50/50分组可能会帮助你更多,并阻止你创build一个模型过度适合你的训练数据。
那么你应该考虑一件事。
如果你有非常大的数据集,比如10万个例子,80/10/10可能是不必要的,因为10%= 100000个例子不需要告诉模型可以正常工作。
也许99 / 0.5 / 0.5就足够了,因为5000个例子可以代表大部分的数据变化,你可以很容易地根据这5000个例子在testing和开发中的工作。