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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:22:48