以optuna LightGBMTunerCV作为在optuna中进一步搜索的起点

4
我正在尝试使用LightGBM解决回归问题(平均绝对误差/L1-或类似的Huber或伪Huber损失),并且我主要想调整我的超参数。 optuna 中的 LightGBMTunerCV 提供了一个不错的起点,但之后我想更深入地搜索(同时不失去自动化的调参器学习的内容)。此外,我希望将交叉验证得分的平均值与标准差作为评估模型的指标(即我认为较低的标准差是同一分布下未见数据表现更加稳定的良好迹象)。
我已经做了类似于这样的事情:
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 使用平均分数(而不是平均值+标准差),并且没有办法轻松更改它?是否可以以某种方式对研究中的试验进行后处理以添加标准偏差?

我甚至还没有看到一个清晰的示例,说明如何使用 FixedTrial 强制运行最佳调整参数的研究(即使我理解这应该是可能的),这可能是另一种方法。

1个回答

2

在学习类中有一种称为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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接