数据STUDIO

超简单!用 Optuna 中的 LightGBM Tuner 进行超参数优化


数据STUDIO 编译|选自: mediun
在本文中,我们将介绍 Optuna 中的 LightGBM Tuner。Optuna 是一个专为机器学习设计的超参数优化框架,而 LightGBM Tuner 是 Optuna 用于优化 LightGBM 超参数的集成模块之一。LightGBM Tuner 的使用很简单,可以通过更改 Python 代码中的一个导入语句来使用 LightGBM Tuner。使用专家启发式算法,LightGBM Tuner 调整超参数所使用的时间将会更短。

在 LightGBM 上调整超参数的简单方法

LightGBM 提供了一个基于决策树算法的快速、高性能的梯度提升框架。它虽然功能强大,但它包含许多要调整的超参数。如控制决策树的叶子数量的超参数,每个决策树要采样的特征比例,以及分配给决策树叶子的最小样本数等等。如果我们手动调整它们,则需要多次试验。而框架 Optuna 旨在有效地找到更好的超参数。

使用 Optuna 调整 LightGBM 的超参数时,一个简单的示例代码可能如下所示:

def objective(trial):
    data, target = sklearn.datasets.load_breast_cancer(return_X_y=True)
    train_x, test_x, train_y, test_y = train_test_split(data, target, test_size=0.25)
    dtrain = lgb.Dataset(train_x, label=train_y)
 
    param = {
        'objective': 'binary',
        'metric': 'binary_logloss',
        '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, 256),
        'feature_fraction': trial.suggest_uniform('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_uniform('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
    }
 
    gbm = lgb.train(param, dtrain)
    preds = gbm.predict(test_x)
    pred_labels = np.rint(preds)
    accuracy = sklearn.metrics.accuracy_score(test_y, pred_labels)
    return accuracy
 
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
 
print('Number of finished trials:', len(study.trials))
print('Best trial:', study.best_trial.params)

在此示例中,Optuna 尝试找到七个不同超参数的最佳组合,如 "feature_fraction"、"num_leaves"。组合的总数是所有超参数搜索空间的乘积,产生了一个巨大的搜索空间,如下图所示。

更多关于Optuna详情请参见👇 (点击查看) : 自动化超参数优化最强神器:Optuna
Optuna vs Hyperopt 超参数优化哪家强?

Step-wise逐步算法

超参数优化的一个主要难点是要通过尽可能少的试验获得更好的评估。尤其是在机器学习任务中的一次试验通常需要花费较长的计算时间,因此尽量避免多次实验。

虽然有不少的搜索方法可以达到这样的需求,但在一定的搜索空间中,有一种使用良好且高效的手动调整 LightGBM 超参数的方法,称为Step-wise逐步算法。它按顺序调整重要的超参数变量。

在上述方法中,超参数变量是按顺序确定的。这会产生一个紧凑的搜索空间,即所有空间的总和,如下所示。



LightGBM Tuner 是一个实现逐步算法的模块。

LightGBM Tuner 的使用

LightGBM Tuner 作为 Optuna v0.18.0 中的实验性功能发布。可以通过更改导入语句来尝试它,如下所示:



完整代码:

# lightgbm_tuner_simple.py
import numpy as np
import optuna.integration.lightgbm as lgb

from lightgbm import early_stopping
from lightgbm import log_evaluation
import sklearn.datasets
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split


if __name__ == "__main__":
    data, target = sklearn.datasets.load_breast_cancer(return_X_y=True)
    train_x, val_x, train_y, val_y = train_test_split(data, target, test_size=0.25)
    dtrain = lgb.Dataset(train_x, label=train_y)
    dval = lgb.Dataset(val_x, label=val_y)

    params = {
        "objective": "binary",
        "metric": "binary_logloss",
        "verbosity": -1,
        "boosting_type": "gbdt",
    }

    model = lgb.train(
        params,
        dtrain,
        valid_sets=[dtrain, dval],
        callbacks=[early_stopping(100), log_evaluation(100)],
    )

    prediction = np.rint(model.predict(val_x, num_iteration=model.best_iteration))
    accuracy = accuracy_score(val_y, prediction)

    best_params = model.params
    print("Best params:", best_params)
    print("  Accuracy = {}".format(accuracy))
    print("  Params: ")
    for key, value in best_params.items():
        print("    {}: {}".format(key, value))
当在 Python 代码中调用 lgb.train() 时,开始进行超参数调整。调优结果中的“best parameters”和“search history”可以通过将 Python 对象作为关键字参数传递给 lgb.train() 来获得。
best_params, tuning_history = dict(), list()
booster = lgb.train(params, dtrain, valid_sets=dval,
                    verbose_eval=0,
                    best_params=best_params,
                    tuning_history=tuning_history)
 
print('Best Params:', best_params)
print('Tuning history:', tuning_history)
在当前的实现中, lgb.train() 函数是唯一支持的 LightGBM API。

基准测试

LightGBM Tuner 能否实现比 naive 调优方法更好的性能?为了回答这个问题,我们使用几个流行的数据集对超参数搜索方法的性能进行了基准测试。使用的数据集如下表所示。

在这个基准测试中,我们选择了三种方法进行比较。

  • [ Tuner ] LightGBM Tuner 使用 Step-wise 算法进行调优
  • [ TPE ] TPE(树结构 Parzen 估计器) + Naive 调优
  • [ Random ] 随机采样 + Naive调优

TPE 是使用随机模型的有效搜索方法之一,是 Optuna 中使用的默认采样算法。在这个基准测试中,通过评估评估分数和试验次数之间的权衡,我们比较了三种搜索方法的性能。

为了消除随机性的影响,我们对每个数据集进行了总共 20 次实验,并通过试验平均评估分数,如下所示。



下图总结了基准测试的结果。

红色十字标记显示了使用 LightGBM 的默认参数而不进行任何调整时的结果。横轴表示试验次数,纵轴表示以往试验的最佳评价结果。AUC(Area under the ROC Curve)作为评价指标,数值越高表示效果越好。

在这个基准测试中,我们发现 LightGBM Tuner 在 9 个数据集中的 6 个上取得了更好的评估结果。

定量分析:检查关键超参数

如基准测试结果所示,LightGBM Tuner 可以胜过其他方法。我们将使用真实数据深入挖掘 LightGBM 的行为,并考虑如何进一步改进调优算法。

LightGBM Tuner 选择单个超参数变量来逐步调整。例如,分别为 feature_fraction 、 num_leaves 等。在我们的基准测试结果中,哪些超参数对于调整优化过程很重要?以下小提琴图显示了调整每个变量时验证分数变化的结果。

宽度越大,评价值的效果越大。这表明调整变量的效果是显着的。如上图所示,根据数据集的不同,最重要的变量是不同的。在我们的基准测试中,最重要的变量是 feature_fraction 、 num_leaves 或 bagging_fraction 之一。LightGBM Tuner 的当前实现固定了调整变量的顺序和每个变量的试验次数。通过搜索影响大的超参数并以理想的顺序调整它们,可能会进一步改进。

结论

我们引入了 LightGBM Tuner,这是 Optuna 中的一个新集成模块,可以有效地调整超参数并对其性能进行实验性基准测试。此外,通过对实验结果的分析,我们确认了重要的超参数在不同的数据集中有所不同,并讨论了调优算法的进一步改进。

LightGBM Tuner 的一个优点是,您只需更改一行即可尝试,无需考虑任何超参数。实验结果表明,它可以成为一个强大的工具,特别是对于新的 LightGBM 用户。

原文链接:
https://medium.com/optuna/lightgbm-tuner-new-optuna-integration-for-hyperparameter-optimization
更多机器学习优质内容,可关注公众号👇

🏴‍☠️宝藏级🏴‍☠️ 原创公众号『 数据STUDIO 』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括 可戳 👉 Python | MySQL | 数据分析 | 数据可视化 | 机器学习与数据挖掘 | 爬虫 等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递