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采用"迭代淘汰"逻辑:
- 第一轮仅用
min_resources指定的小批量数据(示例中为2500条)训练所有参数组合,筛选出表现前1/factor(示例中为1/3)的候选; - 第二轮用
min_resources * factor(7500条)的数据训练上一轮的候选,再次筛选; - 重复此过程,直到最后一轮使用最大可用训练数据训练剩余候选。
- 第一轮仅用
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
相关产品推荐
相关产品推荐

