🎯 学习目标

  • 理解交叉验证的必要性与原理
  • 掌握K折交叉验证的实现方法
  • 了解不同交叉验证策略的适用场景
  • 学会使用sklearn进行交叉验证
模型验证概念图

为什么需要交叉验证

简单的训练集/测试集划分可能导致评估结果不稳定,特别是当数据量较小时。 交叉验证(Cross-Validation)通过多次划分数据,提供更可靠的模型性能评估, 充分利用有限的数据进行训练和验证。

🔄 K折交叉验证原理

1️⃣

划分

将数据分成K份

2️⃣

迭代

轮流用1份做验证

3️⃣

训练

其余K-1份训练

4️⃣

重复

进行K次实验

5️⃣

平均

取K次结果均值

💻 代码实现

from sklearn.model_selection import cross_val_score, KFold from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 加载数据 X, y = load_iris(return_X_y=True) # 创建模型 model = RandomForestClassifier(n_estimators=100, random_state=42) # 5折交叉验证 scores = cross_val_score(model, X, y, cv=5) print(f'各折得分: {scores}') print(f'平均得分: {scores.mean():.4f}') print(f'标准差: {scores.std():.4f}') # 自定义交叉验证策略 kfold = KFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(model, X, y, cv=kfold)

📊 常见交叉验证策略

策略 说明 适用场景
K-Fold 数据分成K份,轮流验证 通用场景
Stratified K-Fold 保持各类别比例 分类问题(类别不平衡)
Leave-One-Out 每次留1个样本验证 数据量极少时
Time Series Split 按时间顺序划分 时间序列数据
Repeated K-Fold 多次重复K折 需要更稳定评估时

🔧 分层交叉验证

from sklearn.model_selection import StratifiedKFold # 分类问题推荐使用分层交叉验证 stratified_kfold = StratifiedKFold( n_splits=5, shuffle=True, random_state=42 ) scores = cross_val_score(model, X, y, cv=stratified_kfold) print(f'分层交叉验证得分: {scores.mean():.4f}')
💡
K值选择建议

通常选择K=5或K=10。K值越大,评估偏差越小但方差越大,计算成本也越高。对于大数据集,K=5通常足够;对于小数据集,可考虑K=10或留一法。

交叉验证示意图
图:K折交叉验证将数据分为K份进行多次验证

📝 本节小结

  • • 交叉验证提供更可靠的模型性能评估
  • • K折交叉验证是最常用的策略,推荐K=5或10
  • • 分类问题应使用分层交叉验证保持类别比例
  • • 时间序列数据需要使用Time Series Split
  • • 交叉验证增加了计算量,但提高了评估稳定性