核心要点

  • 把数据分 K 份,每折轮流当验证集、其余训练,平均 K 次指标,得到更稳定的泛化估计。

  • 相比单次 hold-out,CV 充分利用小数据、降低评估方差,但代价是训练 K 次。

  • 所有预处理(标准化、特征选择、过采样)必须在每折训练集内 fit,否则统计量泄漏进验证集。

  • 分类用 Stratified K-Fold 保持类别比例,时序数据用 TimeSeriesSplit 避免用未来预测过去。

简要回答

把数据分成 K 份,每次用 K-1 份训练、1 份验证,轮换 K 次取平均指标,充分利用有限数据且评估更稳定。

标准回答

为什么需要

单次划分出的验证集偶然性大,评估结果随划分波动,小数据集尤其不可靠。交叉验证用多次轮换的平均来降低这种评估方差。

K 折流程

  1. 把数据随机分成 K 折(常用 K=5 或 10)。
  2. 对 i = 1..K:用除第 i 折外的数据训练,第 i 折做验证。
  3. 平均 K 次指标作为最终泛化估计(还可看标准差衡量稳定性)。

关键:防数据泄漏

标准化、特征选择、过采样等所有「会用到标签或全量统计」的步骤,都必须在每折的训练集内 fit,再 transform 到验证集,不能用全量数据预处理后再划分。

常见变体

  • Stratified K-Fold:分类任务保持各折类别比例一致。
  • TimeSeriesSplit:时序数据按时间切,只用过去预测未来,避免穿越。

常见误区

⚠️ 常见踩坑

最常见的是「预处理泄漏」:先对全量数据做标准化/特征选择/SMOTE 再划分 CV,验证集偷看了训练集统计量,评分虚高、上线掉点。另一个误区是对时序数据用普通随机 K-Fold,等于用未来预测过去,必须改用 TimeSeriesSplit。

追问

追问 1什么时候用留一法(LOOCV)?

样本极少(如 n<30)且单次训练成本低时,LOOCV 几乎用尽数据;否则计算量为 n 倍训练,深度模型通常用 k-fold(k=5/10)或 hold-out + 早停。

追问 2交叉验证能用于深度学习吗?

可以但成本高:需训练 k 个模型。小数据集可用 stratified k-fold;大模型常用单次划分 + 验证集早停,或用 nested CV 做超参搜索。注意数据泄漏(先划分再增强/归一化)。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。