LightGBM調參指南(帶貝葉斯優化代碼)
同樣是基於決策樹的集成演算法,GBM的調參比隨機森林就複雜多了,因此也更為耗時。幸好LightGBM的高速度讓大夥下班時間提早了。接下來將介紹官方LightGBM調參指南,最後附帶小編良心奉上的貝葉斯優化代碼供大家試用。
原文地址:https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters-tuning.md
LightGBM參數列表
建議大家在使用LightGBM前,先仔細閱讀參數介紹,畢竟LightGBM還能實現很多有趣的演算法如隨機森林,dart以及goss,以及眾多使用輔助功能。
參數介紹傳送門如下:
https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.md
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)
上面的代碼僅作參考,實際中請根據自身對參數及實際數據的理解再作修改。
有關LightGBM的介紹到此告一段落,有關LightGBM的回顧介紹如下:
[測評]快的不要不要的GPU版LightGBM
[翻譯]如何安裝比XGBoost還快的LightGBM?
敬請期待我們的公眾號——統計譯文!
推薦閱讀:
※R|ggplot2(一)|一個完整的繪圖流程
※【譯文】R語言不平衡數據分類指南
※【機器學習】確定最佳聚類數目的10種方法
※第二篇——用幾分鐘了解R語言入門知識