一句话定义:留一法(Leave-One-Out,简称 LOO)是交叉验证(Cross-Validation)最极端的形式:手上只有 N 个样本,就训练 N 个模型,每次留出 1 个样本当验证集,剩下 N−1 个全部用来训练,最后把 N 次的验证结果平均。
原理:轮流让一个人离开
想象一个只有八个人的小合唱团要考核音准。人太少,随便抽两个人当“考官”,剩下的六个人水平未必代表整体;抽到的两个人也可能恰好是唱得最好的或最差的。最公平的办法是:每次只让一个人独唱,其他七个人和声,然后换下一个人独唱,轮流八遍,最后看八次独唱的平均分。
留一法做的就是这件事。它把“验证集”压到最小,只有1个样本,从而让每次训练都用上几乎全部数据。样本本来就少的时候,这一点很关键:别的划分方法会“浪费”掉一部分数据不参与训练。
与相邻概念的区别
最常见的邻居是 k 折交叉验证(k-fold Cross-Validation):把数据切成 k 份,每次留一份做验证。留一法其实就是 k = N 的极端情形。另一类是单次划分(train/validation split),只切一次,最省算力,但结果波动最大。
| 维度 | 单次划分 | k 折交叉验证 | 留一法 |
|---|---|---|---|
| 训练次数 | 1 次 | k 次(常取 5 或 10) | N 次 |
| 每次训练用多少数据 | 可能只有六七成 | 大部分 | 几乎全部(N−1) |
| 估计偏差 | 偏大 | 中等 | 最小 |
| 结果稳定性 | 差,换个随机种子就变 | 较好 | 各次结果高度相关,平均后方差反而不一定小 |
| 计算成本 | 最低 | 中等 | 最高 |
注意最后一行:留一法的 N 个训练集彼此只差一个样本,几乎一模一样,所以 N 次得分高度相关。平均之后,它并不能像想象中那样通过平均来大幅降低方差。这一点常被误解。
代价与适用场景
代价很直接:要训练 N 次。样本上千,普通模型就跑不动了。所以留一法的主场是“样本极少”的场合:十几例罕见病例、几十组材料配方、几十次实验数据。这时 k 折的每一折都太小,估计出来的分数很不可靠,而留一法还能撑住。
两个实用提醒:
- 有些模型有闭式解或近似捷径(如线性回归、部分核方法),可以一次拟合就推出所有留一结果,不必真的训练 N 次。用之前值得查一下现成实现,别自己硬跑。
- 留一法假设样本可以互换。时间序列千万别用,它会用“未来”预测“过去”;类别极不平衡时也要小心,某个留出的正样本可能让训练集里一个正类都不剩。
一句话总结:留一法是样本稀少时“物尽其用”的笨办法,公平、偏差小,但结果相关性高、算力代价大。数据够多时,老老实实用 k 折更划算。
