LightGBM调参指南(带贝叶斯优化代码)

同样是基于决策树的集成算法,GBM的调参比随机森林就复杂多了,因此也更为耗时。幸好LightGBM的高速度让大伙下班时间提早了。接下来将介绍官方LightGBM调参指南,最后附带小编良心奉上的贝叶斯优化代码供大家试用。
原文地址:

 

LightGBM参数列表

建议大家在使用LightGBM前,先仔细阅读参数介绍,毕竟LightGBM还能实现很多有趣的算法如随机森林,dart以及goss,以及众多使用辅助功能。

参数介绍传送门如下:

 

leaf-wise tree的调参指南

 

与大多数使用depth-wise tree算法的GBM工具不同,由于LightGBM使用leaf-wise tree算法,因此在迭代过程中能更快地收敛;但leaf-wise tree算法较容易过拟合;为了更好地避免过拟合,请重点留意以下参数:

 

1. num_leaves. 这是控制树模型复杂性的重要参数。理论上,我们可以通过设定num_leaves = 2^(max_depth) 去转变成为depth-wise tree。但这样容易过拟合,因为当这两个参数相等时, leaf-wise tree的深度要远超depth-wise tree。因此在调参时,往往会把 num_leaves的值设置得小于2^(max_depth)。例如当max_depth=6时depth-wise tree可以有个好的准确率,但如果把 num_leaves 设成 127 会导致过拟合,要是把这个参数设置成 70或 80 却有可能获得比depth-wise tree有更好的准确率。事实上,当我们用 leaf-wise tree时,我们可以忽略depth这个概念,毕竟leaves跟depth之间没有一个确切的关系。

 

2. min_data_in_leaf. 这是另一个避免leaf-wise tree算法过拟合的重要参数。该值受到训练集数量和num_leaves这两个值的影响。把该参数设的更大能够避免生长出过深的树,但也要避免欠拟合。在分析大型数据集时,该值区间在数百到数千之间较为合适。

 

3. max_depth. 也可以通过设定 max_depth 的值来限制树算法生长过深。

 

提高速度的参数

· 通过设定bagging_fraction和bagging_freq来使用 bagging算法

· 通过设定 feature_fraction来对特征采样

· 设定更小的max_bin值

· 使用save_binary 以方便往后加载数据的速度

· 设定平行计算参数

 

提高精度的参数

· 设定更大的max_bin值(但会拖慢速度)

· 设定较小的learning_rate值,较大的num_iterations值

· 设定更大的num_leaves值(但容易导致过拟合)

· 加大训练集数量(更多样本,更多特征)

· 试试boosting= dart

 

避免过拟合的参数

· 设定较小的max_bin

· 设定更小的num_leaves

· 设定min_data_in_leaf和min_sum_hessian_in_leaf

· 通过设定bagging_fraction和bagging_freq来使用 bagging算法

· 通过设定feature_fraction来对特征采样。

· 加大训练集数量(更多样本,更多特征)

· 通过设定lambda_l1, lambda_l2以及min_gain_to_split来采取正则化措施

· 通过设定max_depth以避免过拟合

 

贝叶斯优化LightGBM超参数的代码

此处借用rBayesianOptimization包完成贝叶斯超参数搜索任务:

#加载lgb以及贝叶斯优化所需包
library(lightgbm)
library(rBayesianOptimization)

#载入样例数据集
data(agaricus.train, package = "lightgbm")
dtrain <- lgb.Dataset(agaricus.train$data,
                      label = agaricus.train$label)
#定义k折交叉检验的k值
cv_folds <- KFold(agaricus.train$label, nfolds = 5,
                  stratified = TRUE, seed = 0)

#定义lgb调参函数
lgb_cv_bayes <- function(num_leaves, learning_rate) {
  cv <- lgb.cv(params = list(num_leaves = num_leaves,
                             learning_rate = learning_rate),
               device = 'cpu',
               objective = "regression",
               metric = "l2",
               data = dtrain, 
               nrounds = 100,
               folds = cv_folds, 
               early_stopping_rounds = 5, 
               verbose = 0)
  list(Score = min(unlist(cv$record_evals$valid$l2$eval)))
}
#实施贝叶斯优化调参
OPT_Res <- BayesianOptimization(lgb_cv_bayes, 
                                bounds = list(learning_rate = c(0, 1),
                                num_leaves = c(20L, 40L)),
                                init_grid_dt = NULL, 
                                init_points = 10, 
                                n_iter = 20,
                                acq = "ucb", 
                                kappa = 2.576, 
                                eps = 0.0,
                                verbose = TRUE)

上面的代码仅作参考,实际中请根据自身对参数及实际数据的理解再作修改。

转自:https://zhuanlan.zhihu.com/p/27916208

posted @ 2018-04-11 14:57  payton数据之旅  阅读(1516)  评论(0)    收藏  举报