Hyperopt调优XGBoost后调参与复用超参评估指标不一致问题
结果不一致的核心原因
- 参数名拼写错误:XGBoost中定义树数量的正确参数是
n_estimators(末尾带s),你调参代码里写的是n_estimator,属于无效参数,调参过程中实际用的是XGBoost默认的100棵树;复现代码里你同时传入了n_estimator=450和n_estimators=100,最终生效的是正确参数n_estimators=100,参数生效逻辑和你预期不符。 - colsample_bytree强制类型转换错误:你在调参的目标函数里,把
colsample_bytree参数强制转成了int类型,但该参数的搜索空间是0~1之间的浮点数,转int后所有取值都会变成0,等于每轮迭代不采样任何特征,模型拟合逻辑完全异常,你复现代码里的colsample_bytree=0就是这个错误直接导致的。 - 随机种子未完全固定:调参时你在参数空间里设置了
seed=0,但初始化XGBRegressor时没有显式传入该参数,同时你也没有固定numpy、Python原生的全局随机种子,XGBoost训练过程中的子采样、特征采样等步骤存在随机性,两次训练的随机序列不一致,结果自然不同。 - hp.choice参数解析错误:你对
booster参数用了hp.choice搜索,Hyperopt的fmin返回的最优参数里,booster对应的是选项的索引值(0、1、2),不是你定义的gbtree/dart/gblinear字符串值,如果你直接把返回的索引值当做参数传入,就会出现参数不匹配的问题。 - 参数校验不到位:你打印模型参数时写的是
print(xgb_model.get_params),没有加括号调用方法,所以你看到的是方法对象,不是模型实际生效的参数,导致你误以为自己传的参数都正常运行,没提前发现拼写、类型转换的错误。 - fit参数存在差异:调参时你调用
fit方法传入了eval_set参数,复现时没有传该参数,虽然当前代码没加早停逻辑对结果影响不大,但如果后续添加早停配置会直接导致训练轮次不一致。
内容的提问来源于stack exchange,提问作者Candra Parashian
相关产品推荐
相关产品推荐

