← 返回题目列表

什么是交叉验证?K 折交叉验证怎么做?

高频 中等 第 7 / 25 题 更新于 2026/09/25
模型评估交叉验证K折泛化
学习 AI 实战项目

简化版

K 折交叉验证把开发数据分成 K 份,轮流用 K−1 折训练、1 折验证,得到每个样本的一次折外预测。可对等大折的指标取平均;折大小不同要加权,AUC/F1 等非线性指标还应明确是“折指标平均”还是合并 OOF 预测后计算,两者不等价。它减少对单次切分的依赖并复用有限数据,但正确性首先取决于切分是否尊重用户组、时间和空间依赖。常见 K=5 或 10 只是经验起点。

详细版

K 折交叉验证流程:

1. 把训练集随机均分成 K 份:D₁, D₂, ..., D_K
2. for i in 1..K:
     用「除 Dᵢ 外的 K-1 份」训练模型
     在 Dᵢ 上评估,记录得分 sᵢ
3. 汇总:等大折可平均 sᵢ;不等大折按验证样本/目标权重汇总
   也可保存全部 OOF 预测后计算一次指标,并说明口径
  • 每份都当且仅当一次验证集,每个样本都被验证到一次。

为什么用交叉验证:

好处说明
评估更稳K 次平均,减少单次划分的偶然性
更充分复用有限数据所有数据都参与训练和验证
可靠选参/比模型超参调优、模型选择更可信

常见变体:

变体用途
留一法 LOO(K=n)小数据;充分但极慢
分层 K 折分类/不平衡,保持各折类别比例
时间序列 CV时序数据,按时间切、不用未来
重复 K 折多次不同划分再平均,更稳

完整版教学

一、为什么需要交叉验证——单次划分不可靠

评估模型泛化能力,最朴素的做法是留出法:把数据分成训练集和验证集(如 80/20),在训练集训练、验证集评估。但这有两个问题:

  1. 评估依赖「这一次划分」的运气:恰好分到验证集的样本简单/难,会让评估偏高/偏低,方差大、不稳定。
  2. 浪费数据:留作验证的那部分不参与训练,数据少时损失明显。

交叉验证通过「轮流让每部分都当一次验证集、多次评估取平均」解决这两个问题——评估更稳、数据利用更充分。它是超参数调优和模型比较的标准做法。

二、K 折交叉验证怎么做

K 折交叉验证(K-Fold CV) 是最常用的形式:

1. 把训练数据随机均分成 K 份(折),大小尽量相等
2. 做 K 轮,每轮:
   - 选其中 1 折作验证集
   - 用其余 K-1 折训练模型
   - 在这 1 折验证集上评估,得到一个得分
3. K 轮下来每折都当过一次验证集
4. 把 K 个得分平均,作为模型的泛化性能估计(通常也报标准差)

图示(K=5):

轮次1: [验][训][训][训][训]
轮次2: [训][验][训][训][训]
轮次3: [训][训][验][训][训]
轮次4: [训][训][训][验][训]
轮次5: [训][训][训][训][验]
       → 5 个得分取平均

关键好处:每个样本恰好产生一次折外验证结果、参与其余折的训练。折间分数可展示切分敏感性,但各折共享大量训练数据、并非独立重复实验,折间标准差不能直接当作泛化指标的置信区间。

三、K 怎么选——偏差方差与成本的权衡

  • K 小(如 3):每次训练数据较少,与最终全量重训性能的目标可能差得更多,但计算便宜、验证折较大。
  • K 大(如 10):训练规模更接近全量,但拟合次数多、验证折更小且训练集高度重叠。偏差与方差受算法稳定性和指标共同影响,不能保证 K 越大偏差越小或估计越稳。
  • 常用 K=5 或 K=10——经验上在偏差、方差和计算成本之间平衡得较好。

四、重要变体一:留一法(LOO)

留一交叉验证(Leave-One-Out,LOO) 是 K = 样本数 n 的极端情形:每次只留一个样本做验证,用其余 n-1 个训练,做 n 次。

  • 优点:每轮用 n−1 个样本训练,训练规模最接近全量;给定数据与确定算法时划分结果确定。
  • 缺点:要训练 n 次,极慢(大数据不可行);且各次训练集几乎相同,评估方差可能较大。
  • 适用:小数据集,样本珍贵、算得起时。

五、重要变体二:分层 K 折(分类常用)

普通 K 折是随机划分,可能导致某折里正负样本比例失衡(尤其类别不平衡时,某折可能几乎没有正类)。分层 K 折(Stratified K-Fold) 在划分时保持每一折的类别比例和整体一致。

  • 独立同分布的分类任务、尤其类别不平衡时通常用分层 K 折,保证每折都能代表整体分布,评估更可靠。
  • 回归任务有时也按目标分布分层。

分层只保持标签比例,不会处理重复患者、同一用户多条记录或时间依赖;这些情况下 GroupKFold、StratifiedGroupKFold 或时间顺序切分比随机分层更重要。否则训练折与验证折共享实体,得分会因泄露而虚高。

每类样本数还应至少支持所选 K。若少数类只有 3 个样本却做 5 折,分层无法创造足够样本,应降低 K、补数据或采用更合适的小样本评估方案。

六、重要变体三:时间序列交叉验证

时序数据不能用普通 K 折——随机划分会把未来样本混进训练集,造成数据泄露(用未来预测过去,见数据泄露专题)。要用时间序列交叉验证:

按时间顺序,训练集始终在验证集之前:
训练[1..100]      → 验证[101..120]
训练[1..120]      → 验证[121..140]
训练[1..140]      → 验证[141..160]  ...

始终「用过去训练、预测未来」,绝不用未来数据训练,符合时序场景的真实预测方式。

七、和超参数调优、数据泄露的关系

  • 调参 / 选模型:网格搜索、随机搜索都在交叉验证上评估每组超参,选平均得分最好的(详见调参专题)。
  • 防泄露:所有预处理(标准化、缺失填充、特征选择)必须放进每一折内部、只在该折训练部分 fit,不能在整个数据集上先做——否则验证折信息泄露、评估虚高(用 Pipeline 保证,见数据泄露专题)。
  • 嵌套交叉验证:既要调参又要无偏评估时,用外层 CV 评估、内层 CV 调参,避免「用同一份数据既调参又评估」的乐观偏差。
  • 测试集始终独立:交叉验证在训练数据内部进行,最终泛化能力仍要用从未参与的测试集确认。

八、用五折得分计算均值、波动与训练成本

100 个样本做 5 折,每轮约 80 个训练、20 个验证,共拟合 5 次。若五折 AUC 为 0.78,0.81,0.75,0.84,0.82,均值为 0.80,样本标准差约 0.035;只报 0.80 会隐藏模型对划分的敏感性。最终选定方案后,通常还要在全部训练数据上重训,再对独立测试集评估一次。

数据结构合适切分器关键防线
独立同分布单标签分类Stratified K-Fold保持类别比例
同一用户多条记录Group K-Fold同一组不能跨训练/验证
时间序列expanding/rolling split训练时间早于验证
调参后无偏估计Nested CV内层选参、外层评估
外层第 i 折验证
  └─ 外层训练部分内再做内层 CV 选超参
       └─ 用选定超参重训外层训练部分 → 评估外层验证折

分层只控制标签比例,不能解决同一患者、设备或文档的重复实体泄漏。时间序列还可能需要 gap/embargo,避免特征窗口与验证期相互污染。

记忆钩子:交叉验证首先要模拟上线时“哪些数据在预测时可见”,K 取多少反而是第二层问题。

九、常见误区与追问

  • 误区:随机分层 K 折适用于所有分类任务。 存在用户组、时间或空间依赖时,应优先尊重依赖结构。
  • 误区:交叉验证后不需要独立测试集。 反复选模型会对 CV 结果过拟合,最终确认仍需未参与选择的数据。
  • 追问:预处理应该在哪里 fit? 必须在每个训练折内部拟合,再作用于对应验证折。
  • 追问:K 越大评估一定越稳定吗? 偏差、相关性、方差和计算成本共同变化,并非单调更好。
  • 追问:为什么要报折间标准差? 均值相同的模型可能稳定性不同,但折得分相关,不能把它当独立重复实验。

十、加强记忆

交叉验证让模型评估更稳、更省数据。K 折:把数据均分 K 份,轮流用 K-1 份训练、1 份验证,共 K 次、每份都当一次验证集,K 个得分取平均——比单次留出法减少偶然性、更充分复用有限数据,是调参和选模型的标准做法,常用 K=5 或 10。变体:留一法 LOO(K=n,小数据、训练折最接近全数据但计算昂贵,估计性质需结合算法讨论)、分层 K 折(保持各折类别比例,独立样本分类中常用)、时间序列 CV(按时间切、用过去预测未来、防泄露)、重复 K 折。红线:所有预处理只在每折训练部分 fit(防泄露)、测试集始终独立、既调参又评估用嵌套 CV。