K 折交叉验证将数据划分为 K 份,进行 K 次训练验证,取平均性能作为评估指标。
基本原理
将数据集随机划分为 K 份,每次取 1 份验证,K-1 份训练,循环 K 次后取均值。
示例(K=5):
1
2
3
4
| 数据集: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第1次: 训练 [3-10], 验证 [1, 2]
第2次: 训练 [1,2,5-10], 验证 [3, 4]
...
|
代码实现
1
2
3
4
5
6
| from sklearn.model_selection import KFold, cross_val_score
from sklearn.ensemble import RandomForestClassifier
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')
print("平均准确率:", scores.mean())
|
K 值选择
| K 值 | 适用场景 | 特点 |
|---|
| 5 或 10 | 常用 | 平衡计算成本与稳定性 |
| N (LOOCV) | 超小数据集 | 最稳定,计算量大 |
| 过大 | 大数据 | 计算成本高 |
| 过小 | 快速验证 | 评估不稳定 |
变体
| 方法 | 适用场景 |
|---|
| Stratified K-Fold | 类别不均衡 |
| Time Series Split | 时间序列 |
与超参数调优结合
1
2
3
4
5
| from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [50, 100], 'max_depth': [3, 5]}
grid = GridSearchCV(model, param_grid, cv=5)
grid.fit(X, y)
|
方法对比
| 方法 | 训练集 | 验证集 | 适用场景 |
|---|
| Hold-Out | 固定比例 | 固定比例 | 大数据集 |
| K-Fold | K-1 份 | 1 份 | 中等数据 |
| Stratified K-Fold | K-1 份 | 1 份 | 类别不均衡 |
| Time Series Split | 时间顺序 | 未来数据 | 时间序列 |
Comments