【问题标题】:Using optuna LightGBMTunerCV as starting point for further search with optuna使用 optuna LightGBMTunerCV 作为 optuna 进一步搜索的起点
【发布时间】:2020-12-31 16:16:31
【问题描述】:

我正在尝试将 LightGBM 用于回归问题(平均绝对误差/L1 - 或类似 Huber 或 pseud-Huber - 损失),我主要想调整我的超参数。 LightGBMTunerCV in optuna 提供了一个很好的起点,但之后我想更深入地搜索(不会丢失自动调谐器学习的内容)。此外,我想使用平均交叉验证分数 + 交叉验证分数的标准差作为我对模型进行排名的指标(即,我认为较低的 SD 是对来自相同的未见数据的更稳定性能的好兆头分布)。

我做过这样的事情:

import optuna
import optuna.integration.lightgbm as lgb

params = {
        "objective": "l1",
        "metric": "l1",
        "verbosity": -1,
        "boosting_type": "gbdt",
    }    
    
dtrain = lgb.Dataset(X, label=y)    
mystudy = optuna.create_study()    
tuner = lgb.LightGBMTunerCV(
    params, dtrain, 
    verbose_eval=False,
    time_budget=6000, 
    study = mystudy)

tuner.run()

现在我想根据这些结果进行进一步的搜索。如果我没有以前的结果,我可能会这样做:

def objective(trial):    
        param = {
            'objective': 'l1',
            'metric': 'l1',
            'verbosity': -1,
            'boosting_type': 'gbdt',        
            'lambda_l1': trial.suggest_loguniform('lambda_l1', 1e-8, 10.0),
            'lambda_l2': trial.suggest_loguniform('lambda_l2', 1e-8, 10.0),
            'num_leaves': trial.suggest_int('num_leaves', 2, 512),
            'feature_fraction': trial.suggest_uniform('feature_fraction', 0.1, 1.0),
            'bagging_fraction': trial.suggest_uniform('bagging_fraction', 0.1, 1.0),
            'bagging_freq': trial.suggest_int('bagging_freq', 1, 15),
            'min_child_samples': trial.suggest_int('min_child_samples', 2, 256),
            'seed': 1979
        }
       
    # insert code for getting X and y ready 
    dtrain = lgb.Dataset(X, label=y)

    lcv = lgb.cv(
        param, 
        dtrain, 
        verbose_eval=False)
                
    return lcv['l1-mean'][-1]+lcv['l1-stdv'][-1]

optuna.logging.set_verbosity(optuna.logging.WARNING)
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=2500)

我有点不清楚如何将以前的结果添加到研究中。不定义一项新研究可能会解决这个问题,但看起来LightGBMTunerCV 使用平均分数(不是平均+标准值)并且没有办法轻松改变它?可以以某种方式对研究中的试验进行后处理以添加 stdv 吗?

我什至还没有看到一个明确的例子,说明如何使用FixedTrial 强制研究重新运行最佳调整参数(即使我知道这应该是可能的),这可能是另一种方法.

【问题讨论】:

    标签: python lightgbm optuna


    【解决方案1】:

    学习类有一个方法叫enqueue_trial,它把trial类插入到评估队列中。

    所以你可以这样做以使用调整的参数作为起点:

    optuna.logging.set_verbosity(optuna.logging.WARNING)
    study = optuna.create_study(direction='minimize')
    
    # insert this line:
    study.enqueue_trial(tuner.best_params)
    
    study.optimize(objective, n_trials=2500)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多