← 返回题目列表

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

高频 中等 第 7 / 25 题 更新于 2026/07/28
模型评估交叉验证K折泛化

简化版

交叉验证(Cross Validation) 是更充分、更可靠地评估模型泛化能力的方法。K 折交叉验证:把训练数据均分成 K 份(折),每次用其中 K-1 份训练、剩下 1 份验证,轮流让每一份都当一次验证集,共训练 K 次,把 K 次的评估结果取平均作为模型性能估计。好处:每个样本都被用来验证过一次、评估更稳定、更充分复用有限数据、减少「一次划分的偶然性」,常用来选超参数和比较模型。变体:留一法(LOO,K=样本数)、分层 K 折(保持各折类别比例,用于不平衡/分类)、时间序列交叉验证(按时间切,不能用未来)。常用 K=5 或 10。

详细版

K 折交叉验证流程:

1. 把训练集随机均分成 K 份:D₁, D₂, ..., D_K
2. for i in 1..K:
     用「除 Dᵢ 外的 K-1 份」训练模型
     在 Dᵢ 上评估,记录得分 sᵢ
3. 最终性能 = (s₁+s₂+...+s_K) / K   (常再报标准差)
  • 每份都当且仅当一次验证集,每个样本都被验证到一次。

为什么用交叉验证:

好处说明
评估更稳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-1 次——数据全用上了,评估基于 K 次平均、更稳定,还能用标准差看模型稳定性。

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

  • K 小(如 3):每次训练用的数据少(更接近小训练集),评估偏差大一点;训练次数少、快。
  • K 大(如 10):每次训练用接近全部数据,评估偏差小;但训练 K 次、慢,且各折训练集高度重叠,评估的方差可能变大。
  • 常用 K=5 或 K=10——经验上在偏差、方差和计算成本之间平衡得较好。

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

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

  • 优点:几乎用满所有数据训练,评估偏差最小、结果确定(无随机划分)。
  • 缺点:要训练 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。