张芷铭的个人博客

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-FoldK-1 份1 份中等数据
Stratified K-FoldK-1 份1 份类别不均衡
Time Series Split时间顺序未来数据时间序列

Comments