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

使用Optuna训练LGBMClassifier报错的正确实现方法

Optuna+LightGBM调参报错修复方案

问题根因

  • 模块导入错误:手动编写Optuna objective函数做自定义超参搜索时,不需要导入optuna.integration.lightgbm下的封装类,该类的构造方法用可变参数传参,不符合scikit-learn的接口规范,直接使用原生lightgbm库的分类器即可。
  • Objective返回值不符合要求:Optuna的objective函数必须返回单个数值型指标(比如准确率、F1值、logloss),用于对比不同trial的效果,当前代码直接返回预测结果和模型对象,Optuna无法执行优化逻辑。
  • 参数存在冗余冲突:原生LightGBM的sklearn接口不存在max_features参数,和你已经配置的feature_fraction功能重复,会触发参数报错。
  • 调用逻辑错误:study.optimize()方法本身无返回值,无法直接获取最优模型和预测结果,需要在搜索完成后基于最优参数重训模型。

修正代码

首先修正导入部分:

import lightgbm as lgbm
from optuna.integration import LightGBMPruningCallback
import optuna
from sklearn.metrics import accuracy_score # 可替换为你实际需要的评估指标,如f1_score、log_loss

然后修正objective函数:

def objective(trial, X_train, y_train, X_test, y_test):
    param_grid = {
        "n_estimators": trial.suggest_categorical("n_estimators", [10000]),
        "learning_rate": trial.suggest_float("learning_rate", 0.01, 0.3, log=True),
        "num_leaves": trial.suggest_int("num_leaves", 20, 3000, step=20),
        "max_depth": trial.suggest_int("max_depth", 3, 12), 
        "min_data_in_leaf": trial.suggest_int("min_data_in_leaf", 100, 10000, step=1000),
        "lambda_l1": trial.suggest_int("lambda_l1", 0, 100, step=5),
        "min_gain_to_split": trial.suggest_float("min_gain_to_split", 0, 15),
        "bagging_fraction": trial.suggest_float(
            "bagging_fraction", 0.2, 0.95, step=0.1
        ),
        "bagging_freq": trial.suggest_categorical("bagging_freq", [1]),
        "feature_fraction": trial.suggest_float(
            "feature_fraction", 0.2, 0.95, step=0.1
        ),
        "n_jobs": -1,
        "random_state": 1121218,
    }
    
    model = lgbm.LGBMClassifier(objective="multiclass", **param_grid)
    model.fit(
        X_train,
        y_train,
        eval_set=[(X_test, y_test)],
        eval_metric="multi_logloss",
        early_stopping_rounds=5,
        callbacks=[
            LightGBMPruningCallback(trial, "multi_logloss")
        ],
        verbose=False
    )
    # 计算需要优化的指标,此处以多分类准确率为例,可根据需求替换
    preds = model.predict(X_test)
    acc = accuracy_score(y_test, preds)
    # 仅返回待优化的数值指标
    return acc

最后修正调参调用逻辑:

%%time
study = optuna.create_study(direction="maximize", study_name="LGBM Classifier")
func = lambda trial: objective(trial, X_train, y_train, X_test, y_test)
study.optimize(func, n_trials=100)

# 搜索完成后基于最优参数重训模型
best_params = study.best_params
# 补全固定参数
best_params["n_jobs"] = -1
best_params["random_state"] = 1121218
best_model = lgbm.LGBMClassifier(objective="multiclass", **best_params)
best_model.fit(
    X_train,
    y_train,
    eval_set=[(X_test, y_test)],
    eval_metric="multi_logloss",
    early_stopping_rounds=5,
    verbose=False
)
# 生成预测结果
preds = best_model.predict_proba(X_test)

补充说明

如果你不需要自定义搜索逻辑,想直接用Optuna内置的LightGBM自动调参能力,直接调用optuna.integration.lightgbm.LightGBMTuner接口即可,不需要手动编写objective和trial循环,两种用法不要混用,否则容易出现接口兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:39:23