You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:17:21