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

HalvingGridSearchCV中best_score_与最高mean_test_score不符的问题咨询

HalvingGridSearchCV中best_score_与cv_results_最高分数不匹配的问题分析

问题背景

在imbalanced-learn流水线中使用scikit-learn的HalvingGridSearchCV对XGBoost模型做超参数调优时,发现best_score_(及对应best_params_)与cv_results_中的最高mean_test_score不匹配,部分场景下差异显著。原预期best_score_应与cv_results_中的最高平均测试分数一致,因为该分数代表最优模型。

相关代码:

from imblearn.ensemble import BalancedBaggingClassifier
from imblearn import FunctionSampler
from imblearn.pipeline import Pipeline
from xgboost import XGBClassifier
from sklearn.model_selection import TimeSeriesSplit

# 数据加载
X, y = ...

# 构建流水线模型
model = Pipeline([
        ('sampling', FunctionSampler(
            ...  # 自定义采样逻辑
        )),
        ('classification', BalancedBaggingClassifier(
            base_estimator=XGBClassifier(
                            eval_metric='aucpr', use_label_encoder=False)
         ))
    ])

# 超参数网格
params = {
            'classification__base_estimator__max_depth': [3, 5, 7, 10],
            'classification__base_estimator__gamma': [0., 1e-4, 1e-2, 0.1, 1.]
        }

# 时间序列交叉验证
cv = TimeSeriesSplit(n_splits=5)
# Halving网格搜索
clf = HalvingGridSearchCV(
            estimator=model,
            param_grid=params,
            scoring='average_precision',
            factor=3,
            min_resources=2500,
            cv=cv,
            verbose=1,
            refit=True,
        )
clf.fit(X, y)

调优结果:

  • best_score_:0.3516,对应参数:max_depth=10,gamma=1.
  • cv_results_中最高mean_test_score:0.4006,对应参数:max_depth=7,gamma=0.1
    部分场景下,best_score_对应的参数组合甚至不在top5最高mean_test_score之列。

问题解答

1. 为何best_score_与cv_results_最高mean_test_score不匹配?

核心原因是HalvingGridSearchCV的逐步资源分配机制,这是它与普通GridSearchCV的核心差异:

  • HalvingGridSearchCV采用"迭代淘汰"逻辑:
    1. 第一轮仅用min_resources指定的小批量数据(示例中为2500条)训练所有参数组合,筛选出表现前1/factor(示例中为1/3)的候选;
    2. 第二轮用min_resources * factor(7500条)的数据训练上一轮的候选,再次筛选;
    3. 重复此过程,直到最后一轮使用最大可用训练数据训练剩余候选。
  • cv_results_中的mean_test_score是每个参数组合在其参与的轮次中的交叉验证平均分数,这些分数可能来自小数据量的轮次——小数据量下模型更容易拟合局部模式,甚至过拟合,因此分数会偏高;
  • best_score_是**最后一轮(资源最多的轮次)**中表现最优模型的交叉验证分数,此时模型用更多数据训练,更贴近真实泛化能力,分数通常会比小数据量轮次的分数低;
  • 额外因素:你的流水线包含BalancedBaggingClassifier和FunctionSampler,两者都带有随机性(比如Bagging的样本抽样、自定义采样的随机逻辑),不同轮次的随机波动也会加剧分数差异。

XGBoost本身不会直接导致这种差异,但如果参数设置(如max_depth=10)在小数据量下过拟合,大数据量下泛化性能下降,会进一步放大这种分数差。

2. 部署模型时如何解读差异?选择cv_results_高分模型的权衡因素

差异解读

  • cv_results_中的高分:大概率是小数据量轮次的结果,反映的是模型在局部/早期数据上的拟合能力,而非真实泛化能力;
  • best_score_:反映的是模型在全量训练数据上的交叉验证性能,更贴近部署后的真实表现,尤其是时间序列场景下,大数据量模型能更好捕捉长期趋势。

选择cv_results_高分模型的权衡

如果考虑替代best_estimator_,需注意以下几点:

  • 泛化风险:高分模型可能是小数据量下的过拟合产物,部署后面对新数据(尤其是时间序列中后续的新数据)时,性能可能大幅下降;
  • 数据适配性:时间序列数据存在分布漂移,小数据量模型仅适配早期数据分布,无法应对后期数据的变化;
  • 模型稳定性:小数据量下的分数方差通常更大,高分可能是随机波动导致,重复训练可能无法复现;
  • 重新拟合成本:cv_results_中的模型仅用对应轮次的数据训练,若要部署,需用全量数据重新拟合,但重新拟合后其分数可能大幅下降,甚至不如best_estimator_;
  • 业务优先级:如果你的业务场景更关注早期数据的拟合效果,且能接受后期性能下降,可尝试,但需做好风险评估。

一般情况下,优先选择best_estimator_,它是HalvingGridSearchCV经过多轮筛选后,用全量数据拟合出的最优模型,泛化能力更可靠。


内容的提问来源于stack exchange,提问作者xan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:45:41