✧ 交叉验证基础
K折 · 留一 · 重复交叉验证🔁 为什么需要交叉验证? 避免过拟合 & 稳定评估
交叉验证 (Cross-Validation) 是评估模型泛化能力的黄金标准。它将数据集划分为互补子集,轮流训练与验证, 有效降低单次划分带来的方差,让性能估计更接近真实水平。以下是三种最主流的交叉验证方法。
📊 ① K折交叉验证 (K-Fold CV)
| K 值 | 训练/验证比例 | 特点 & 适用场景 |
|---|---|---|
| 5 | 80% 训练 / 20% 验证 | 常用折中,偏差-方差平衡好 |
| 10 | 90% 训练 / 10% 验证 | 更低的偏差,稍高方差;最流行 |
| 3 | 66.6% 训练 / 33.3% 验证 | 快速实验,但偏差较高 |
| ⭐ 经验 | 通常选择 K=5 或 K=10,兼顾计算开销与估计稳定性 | |
✅ 执行步骤
- 将数据随机打乱并均分为 K 个互斥子集(折)
- 每次保留其中 1 折作为验证集,其余 K-1 折训练
- 重复 K 次,得到 K 个评估分数
- 最终指标 = K 次分数的平均值 ± 标准差
📌 注意事项
- 分层抽样 (Stratified) 保持类别比例
- 随机打乱避免顺序偏差
- 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 | 中等 | 极低 | 高 | 模型对比、稳定性分析 |