如何在GridSearchCV中获取各折分类报告?结果不一致求解
解决GridSearchCV与单独交叉验证结果不一致的问题
问题根源分析
你的代码里存在几个关键问题导致结果不一致:
- 模型参数不匹配:你单独循环中使用的
model_grid未明确使用GridSearchCV找到的最佳参数组合,而GridSearchCV的评分是基于它搜索到的最优模型计算的。 - 分类报告参数顺序错误:
classification_report(y_pred, y_t)把预测值和真实值的顺序搞反了,sklearn要求第一个参数是真实标签,第二个是预测标签,顺序错误会导致精度、召回率等指标计算错误。 - 随机森林的随机性:你创建RandomForestClassifier时没有设置
random_state,每次训练的模型会有差异,而GridSearchCV里的模型如果也没设的话,可能和单独训练的模型随机状态不同,导致结果波动。
修正后的代码示例
步骤1:获取GridSearchCV的最佳模型并保证可复现性
import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import RepeatedKFold, GridSearchCV from sklearn.metrics import classification_report # 原代码部分,给随机森林添加random_state保证可复现 cross_val = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0) grid_search = GridSearchCV( RandomForestClassifier(random_state=0), param_grid=param_grid, cv=cross_val, scoring='f1_macro' ) grid_search.fit(X, y) # 获取GridSearchCV找到的最佳模型参数和模型实例 best_params = grid_search.best_params_ best_model = grid_search.best_estimator_
步骤2:用相同交叉验证划分和最佳模型生成分类报告
# 遍历GridSearchCV使用的交叉验证划分 for fold_idx, (train, test) in enumerate(grid_search.cv.split(X, y)): X_tr, X_t = X[train], X[test] y_tr, y_t = y[train], y[test] # 使用最佳参数重新训练当前折的模型(保证和CV过程一致) fold_model = RandomForestClassifier(**best_params, random_state=0) fold_model.fit(X_tr, y_tr) y_pred = fold_model.predict(X_t) # 正确生成分类报告(真实标签在前,预测标签在后) print(f"===== 第{fold_idx+1}折分类报告 =====") report = classification_report(y_t, y_pred) print(report) # 若需要结构化数据,可生成字典格式报告 report_dict = classification_report(y_t, y_pred, output_dict=True)
额外说明
- 如果你想查看每个参数组合在各折的类别级指标,需要遍历
grid_search.cv_results_中的params字段,对每个参数组合重新在对应折上训练并生成报告,但此操作计算量较大。 - 所有涉及随机过程的组件(RepeatedKFold、RandomForestClassifier)必须设置
random_state,才能保证结果完全可复现,避免随机性带来的差异。
内容的提问来源于stack exchange,提问作者Nina Leest
相关产品推荐
相关产品推荐

