如何获取LightGBM最佳迭代轮次的binary_logloss值?
问题描述
我正尝试使用Optuna对LightGBM二分类模型的参数进行调优,需要定义目标函数来汇报Optuna要优化的指标,希望使用LightGBM训练过程中默认输出的binary_logloss函数。但运行以下代码时出现KeyError('binary_logloss'),无法获取最佳迭代轮次的binary_logloss值:
def objective(trial): params = { 'objective': 'binary', 'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1e-2), 'num_leaves': trial.suggest_int('num_leaves', 2, 128) } model = lgb.train(params, dtrain, valid_sets= [dtrain, dvalid], num_boost_round=10000, early_stopping_rounds=200) return model.best_score['valid_0']['binary_logloss'] # 此处报错
解决方法
出现该错误的核心原因是:LightGBM在未显式指定metric参数时,二分类任务默认记录的损失指标键名为logloss而非binary_logloss,调用不存在的键会引发报错。可以通过以下两种方式解决:
方式1:使用默认指标键名
直接修改返回语句,使用默认的logloss键:
return model.best_score['valid_0']['logloss']
注:如果你的早停逻辑是基于验证集dvalid,更建议返回验证集的损失(对应valid_1),避免过拟合:
return model.best_score['valid_1']['logloss']
方式2:显式指定指标参数
在模型参数中明确指定metric为binary_logloss,这样best_score中就会使用该键名:
def objective(trial): params = { 'objective': 'binary', 'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1e-2), 'num_leaves': trial.suggest_int('num_leaves', 2, 128), 'metric': 'binary_logloss' # 显式指定指标 } model = lgb.train(params, dtrain, valid_sets= [dtrain, dvalid], num_boost_round=10000, early_stopping_rounds=200) return model.best_score['valid_0']['binary_logloss'] # 现在可正常调用
额外提示:如果不确定best_score的结构,可以先执行print(model.best_score)查看所有可用的指标键名,避免键名匹配错误。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

