我已经使用折交叉验证几次来评估一些学习算法的性能,但我一直对如何选择的值感到困惑。
我经常看到并使用的值,但这对我来说似乎完全是任意的,我现在只是习惯性地使用而不是仔细考虑。值的提高,您似乎获得了更好的粒度,因此理想情况下,您应该使非常大,但也存在产生偏差的风险。
我想知道的值应该取决于什么,以及在评估我的算法时应该如何考虑这一点。如果我使用交叉验证的分层版本,它会改变什么吗?
我已经使用折交叉验证几次来评估一些学习算法的性能,但我一直对如何选择的值感到困惑。
我经常看到并使用的值,但这对我来说似乎完全是任意的,我现在只是习惯性地使用而不是仔细考虑。值的提高,您似乎获得了更好的粒度,因此理想情况下,您应该使非常大,但也存在产生偏差的风险。
我想知道的值应该取决于什么,以及在评估我的算法时应该如何考虑这一点。如果我使用交叉验证的分层版本,它会改变什么吗?
的选择有些随意。这是我决定的方式:
首先,为了降低 CV 结果的方差,您可以并且应该使用新的随机拆分重复/迭代 CV。
这使得高 => 更多计算时间的论点在很大程度上无关紧要,因为无论如何您都想计算许多模型。我倾向于主要考虑计算的模型总数(类似于自举)。所以我可能会决定 100 x 10 倍 CV 或 200 x 5 倍 CV。
@ogrisel 已经解释过,通常较大的意味着较少的(悲观)偏见。(一些例外情况特别是对于是已知的,即留一法)。
如果可能的话,我使用作为,或者是样本中应该分层的组的大小。
太大意味着只有少量的样本组合是可能的,从而限制了不同的迭代次数。
这些想法在样本量较小的情况下更重要。有了更多可用的样本,并不重要。可能的组合数量很快就会变得足够大,因此(比如说)10 次 10 倍 CV 的迭代不会冒很大的重复风险。此外,更多的训练样本通常意味着您处于学习曲线的平坦部分,因此代理模型与在所有样本上训练的“真实”模型之间的差异可以忽略不计。
较大的 K 意味着对高估真实预期误差的偏差较小(因为训练折叠将更接近总数据集)但更高的方差和更长的运行时间(因为您越来越接近极限情况:Leave-One-Out CV)。
如果在 training_size = 总数据集的 90% 时学习曲线的斜率足够平坦,则可以忽略偏差,并且 K=10 是合理的。
同样,更高的 K 可以为您提供更多样本来估计您估计的更准确的置信区间(使用参数标准误差假设 CV 测试误差分布的正态性或非参数引导 CI 仅做出 iid 假设,这实际上不是很真实因为 CV 折叠不是彼此独立的)。
编辑:低估=>高估真正的预期错误
编辑:关于大 K 或 LOOCV 的更高方差的回复部分可能是错误的(并非总是如此)。在这个答案中模拟的更多细节:Bias and variance in leave-one-out vs K-fold cross validation(感谢 Xavier Bourret Sicotte 的这项工作)。
我不知道如何K
影响准确性和泛化性,这可能取决于学习算法,但对于算法复杂度与训练实例数量呈线性关系的训练算法,它肯定会几乎线性地(渐近地、线性地)影响计算复杂度。K-1
如果训练时间与训练实例的数量成线性关系,则训练的计算时间会增加倍。因此,对于小型训练集,我会考虑准确性和泛化方面,特别是考虑到我们需要从有限数量的训练实例中获得最大收益。
但是,对于大型训练集和在训练实例数量上具有高渐近计算复杂度增长的学习算法(至少是线性的),我只是选择K=2
使得具有渐近复杂度线性数量的训练算法的计算时间不会增加的训练实例。
K = N/N*0.30
评论:我们也可以选择 20% 而不是 30%,具体取决于您要选择作为测试集的大小。
如果数据集大小:N=1500;K=1500/1500*0.30 = 3.33;我们可以选择 K 值为 3 或 4
留一交叉验证中的大 K 值会导致过拟合。留一交叉验证中的小 K 值会导致拟合不足。
方法可能很幼稚,但仍然比为不同大小的数据集选择 k=10 更好。