✧ 交叉验证基础

K折 · 留一 · 重复交叉验证
📚 模型评估与预测精准度提升实战
🎯 章节 3 · 核心重难点
🧪 交叉验证 原理与变体
🔁 为什么需要交叉验证? 避免过拟合 & 稳定评估

交叉验证 (Cross-Validation) 是评估模型泛化能力的黄金标准。它将数据集划分为互补子集,轮流训练与验证, 有效降低单次划分带来的方差,让性能估计更接近真实水平。以下是三种最主流的交叉验证方法。

📊 ① K折交叉验证 (K-Fold CV)
K 值训练/验证比例特点 & 适用场景
580% 训练 / 20% 验证常用折中,偏差-方差平衡好
1090% 训练 / 10% 验证更低的偏差,稍高方差;最流行
366.6% 训练 / 33.3% 验证快速实验,但偏差较高
⭐ 经验通常选择 K=5 或 K=10,兼顾计算开销与估计稳定性

✅ 执行步骤

  • 将数据随机打乱并均分为 K 个互斥子集(折)
  • 每次保留其中 1 折作为验证集,其余 K-1 折训练
  • 重复 K 次,得到 K 个评估分数
  • 最终指标 = K 次分数的平均值 ± 标准差

📌 注意事项

  • 分层抽样 (Stratified) 保持类别比例
  • 随机打乱避免顺序偏差
  • K 越大,训练集越相似,方差增大
K折交叉验证 (K=5) 数据划分示意 训练集 Fold 1 训练集 Fold 2 验证集 Fold 3 训练集 Fold 4 训练集 Fold 5 重复 K 次,每次换一个验证折 ⚡ 最终分数 = (Score₁ + Score₂ + … + Scoreₖ) / K
🧩 ② 留一法 (Leave-One-Out CV)
📐 原理 当 K = N(样本量)时,每个样本单独作为验证集,其余 N-1 个样本训练。 相当于进行 N 次训练-验证。极端但无偏。
  • ✅ 几乎无偏差,充分利用数据
  • ⚠️ 计算开销极大 (N 次训练)
  • 📌 适用于小数据集 (样本 < 100)
  • 🔍 每次训练集高度相似,模型方差可能较大
💡 留一法 vs K折
偏差LOO 更低K折 稍高
方差LOO 更高K折 更稳定
计算N 次训练K 次训练
🔄 ③ 重复交叉验证 (Repeated CV)

重复交叉验证 将 K 折交叉验证重复 R 次,每次使用不同的随机种子打乱数据。 最终得到 R×K 个分数,进一步降低评估方差,提供更稳健的置信区间。

🔁 典型设置
  • 5 折 × 10 次重复 = 50 个评估分数
  • 10 折 × 5 次重复 = 50 个评估分数
  • 推荐 5×5 或 10×10 作为稳健配置
📈 优势
  • 大幅降低单次划分的随机性
  • 可计算均值和标准差,做统计检验
  • 适合小数据集或重要模型对比
🧪 代码实战 Python · sklearn
# ===== K折交叉验证 (K=5) =====
from sklearn.model_selection import cross_val_score, KFold, LeaveOneOut, RepeatedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(n_estimators=50, random_state=42)

# 1) K折
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores_k5 = cross_val_score(model, X, y, cv=kf, scoring='accuracy')
print(f'K=5 准确率: {scores_k5.mean():.3f} ± {scores_k5.std():.3f}')

# 2) 留一法 (LOOCV)
loo = LeaveOneOut()
scores_loo = cross_val_score(model, X, y, cv=loo, scoring='accuracy')
print(f'LOOCV 准确率: {scores_loo.mean():.3f} (方差 {scores_loo.std():.3f})')

# 3) 重复交叉验证 (5折×10次)
rkf = RepeatedKFold(n_splits=5, n_repeats=10, random_state=42)
scores_rkf = cross_val_score(model, X, y, cv=rkf, scoring='accuracy')
print(f'重复5×10 准确率: {scores_rkf.mean():.3f} ± {scores_rkf.std():.3f}')
📋 三种方法对比总结
方法训练次数偏差方差计算成本推荐场景
K折 (K=5/10)K中等低低-中通用、大数据
留一法 (LOOCV)N (样本数)最低高极高小样本 (<100)
重复交叉验证R × K中等极低高模型对比、稳定性分析