通过二项分布标准误公式量化分析:交叉验证在大数据集上收益递减,n=10000时误差仅±0.6%,此时五折CV成本与收益严重不匹配。
单次划分的误差线
留出 n 个样本并测量准确率 p。每个留出的样本是一次伯努利试验——对或错——所以正确预测的次数服从二项分布,比例的标准误为:
SE(p) = √( p(1 − p) / n )
n = 100 p = 0.90 → SE = 3.00 points
n = 500 p = 0.90 → SE = 1.34 points
n = 2,000 p = 0.90 → SE = 0.67 points
n = 10,000 p = 0.90 → SE = 0.30 points
假设:留出的样本是你所关注总体的独立抽取,且模型在测量前已固定。这两个假设在某些情况下都会失效——相关联的样本(每个客户多行)会使真实误差超出这个计算,而选择后测量(selecting after measuring)会使估计本身膨胀,best-of-k 算术已经说明了这一点。
现在这个决策有了明确的形状。95% 置信区间大约是 ±2 SE,因此在 n = 100 时准确率为 90% ± 6 个百分点。两个相差 3 个百分点的模型是无法区分的。如果这种模糊性不可接受,且无法获得更多数据,那就需要用交叉验证了。
将数据划分为 k 份。训练 k 次,每次留出不同的份,然后取平均分。每个样本只被测试一次,所以最终估计是在全部 N 行上计算的,而不是在其中一部分上,每个模型在 (k−1)/k 的数据上训练,而不是比如说 80%。
两个实际的收益。估计值是对 k 个不同留出集取平均的,所以它对某一次不幸的划分远不那么敏感。而且各折之间的散布本身就携带信息:五折报告 0.81、0.83、0.82、0.84、0.82 说明模型是稳定的,而 0.71、0.88、0.79、0.91、0.74 则说明结果严重取决于哪些行落在哪里,在调参之前应该先去找出原因。
代价正好是 k 倍的训练计算量,而且是线性的,没有折扣。这就是全部的权衡。
选择 k 本身就是一个偏差-方差问题,这就是为什么conventional答案是 5 和 10 而不是某种推导出来的值。k 越小意味着每个模型在更少比例的数据上训练——k = 2 时,只在半数数据上——所以分数相对于你最终在全部数据上拟合的模型是偏悲观的。k 越大则消除了这种偏差,因为每个训练集几乎就是完整数据集,但各折分数变得更具变异性,计算账单也线性增长。五折在 80% 的数据上训练,代价是五次运行;十折在 90% 上训练,代价是十次。如果它们之间的选择改变了你的结论,那说明这个结论不够稳健,不足以作为行动依据。
重复 k 折——用不同的随机划分多次运行整个过程并取平均——是判断结果是否依赖划分的廉价方式。它不能修复下面的方差问题,但如果均值在多次重复之间移动了两个点,就已经告诉你了一些有用的信息,代价只是一次额外的运行。
k 折无法修复的方差
这是通常被遗漏的部分。k 折分数不是独立的,因为它们的训练集高度重叠——任意两折共享 (k−2)/(k−1) 的训练数据。因此,通常把各折分数当作 k 个独立测量值来计算标准误的做法,低估了不确定性。
这不是某个以后可能会整理的技术细节。Bengio 和 Grandvalet 证明了(JMLR, 2004, "No unbiased estimator of the variance of k-fold cross-validation"),在一般情况下不存在该方差的无偏估计量。实际读法:把各折散布当作定性稳定性信号,而不是置信区间,对任何仅凭交叉验证均值就声称的"显著改进"保持怀疑。当你需要一个可辩护的区间时,真正未触碰的测试集才是诚实的工具。
单次划分就足够的情况
留出集已经足够大。n = 10,000 时误差线是 0.3 个百分点。五折交叉验证要花五倍计算量来削减其中的一小部分。省掉它。
训练很昂贵。任何涉及 GPU 运行数小时的任务都使得 k 次训练成为真正的预算项。用单次大划分,把省下来的计算用于更多配置或更多数据。
时间很重要。对于时间序列数据,普通的 k 折不是保守但可用——它是错误的——它在用未来训练。用前向链式(forward chaining)或者干脆不用。
数据很少。低于几千行时,交叉验证不是可选项;单次划分扔掉太多,估计太少。
非可选的变体
训练集、验证集和测试集:为什么需要三个划分
过拟合、欠拟合与偏差-方差权衡
精确率、召回率、F1 以及准确率何时说谎