---
# System prepended metadata

title: LightGBM

---

# LightGBM
## 簡述
LightGBM為Gradient Boosting Decision tree的實作，可以想成是利用一堆decision tree 做aggregation的結果，而lightGBM則為非常有效率來運行的工具。
## Histogram決策樹
其先將feature做分割，使其可能從原本連續的數值轉為離散的，再將其丟入不同的bin中(每個bin表示一個區段或樹值->離散)，再lightGBM中，default的bin數量為256，而之後再依據這些bin來做切割，而這樣做的好處是較好的效率，但缺點是精準度較低，但在lightGBM中我們本就預計是利用很多較弱的tree來組出一個強的forest，所以這項缺點是可以接受的。
reference(https://www.itread01.com/content/1544818691.html)
## leaf-wise
leaf-wise為每次都會檢視目前所有葉子中，在哪裡做分割是有最好的效果，因此我我們可以快速的降低誤差，但缺點是容易造成overfitting，所以在lightGBM中我們可以設置最大深度，來防止overrfitting。
reference(https://zhuanlan.zhihu.com/p/99069186)
## Gradient-based One-Side Sampling(GOSS)
在做training時因為資料太多而導致執行的效率低落，因此在做梯度下降時我們特別著重在梯度較大的資料中，因為梯度表示在此資料上表現還不夠好，但為了避免資料的分布造成改變，我們還是會sample一些梯度較小的data，使資料集沒有發生太大的改變。
reference(https://hackmd.io/@WangJengYun/HyLtemyxI)
## Exclusive Feature Bundling
因為高維度的數據時常為稀疏的，因此lightGBM設計這個方法來減少特徵數，其核心的想法為將特徵為互斥的data做結合，以one-hot為例子，其可能會造成非常大量的feature數，但其所隱含的資訊量極少，因此我們可以將互斥的data集合起來綑綁成低維度的feature，卻不會減少資訊量，而在綑綁時因為大部分的資料不是100%的互斥，因此lightGBM允許了微小的衝突，藉此在精度與效率間保持平衡。
reference(https://zhuanlan.zhihu.com/p/99069186)
## **支持類別特徵**
在lightGBM中，因為使用的是decision tree，因此若用one-hot的feature來分類資料的話，很容易只將極小部分的資料切開，這樣使得訓練的增益非常小，因此lightGBM利用many-vs-many的方式來將資料作分隔，如下圖:![](https://i.imgur.com/XQqI63b.jpg)
而實際上我們須告訴lightgbm哪一個feature是category，並將category放入不同的bin中，如果bin的樹量少於4則直接用原本的方式切(表示category的種類很少，可以直接分)，且當catregory出現的次數太少時也回直接忽略，不裝入bin中。而bin的樹量預設為32，如果超過這個數量，則bin只會留下出現次數較多的，且在分割bin時利用many v.s. many，表示可能是將多個bin綁在一起與剩下的所有bin做比較(如圖)，因此在切割分類時能有較高的效率。
(reference:https://www.biaodianfu.com/lightgbm.html)
## 調整參數
### learning rate
默認為0.1，用來調整gradient descent所走的步伐大小，一般設置在0.05-0.1之間。
#### 
建議在其他參數確定後可將learning rate調到0.05-0.02(作者寫0.2，不知是否為筆誤)之間來做調整，若learning rate大則n_estimators小，反之亦然。
### n_estimators:
選擇訓練的次數，默認為100，一般都設置在100-1000之間，建議微調大的n_estimators加上early stop(建議為20,50,100)，觀察validation的表現在決定要跑多少回(太多回也容易造成overfitting)
### min_split_gain
執行分裂點時可以得到的最小效益，默認為0，盡量不要調整，調高會得到較淺的樹
### min_child_sample
一個葉子上最少的樹據量，默認為20，但若資料較大的話，增加此數值能使model較穩定
### min_child_wight(不懂)
一個葉子上最小的hessian和，默認為0.001，一般可設為1，不建議調整，增大數值會加深
### max_depth
限制樹的深度，建議為3-5之間，為非常重要的數值，過深會overfitting，太淺則model太弱
### num_leaves
樹上總共的葉子數，默認為31，搭配max_depth形成數的樣貌，建議調整為(0,2^max_depth-1)之間的數值，如果大於這個數值可能會產生奇怪的結果
### subsample
表示會選擇資料中的多少比例隨機選擇來做train，默認為1，建議設置0.8-1.0之間，不要調得太細
### colsample_bytree
表示每次訓練過程中，隨機選擇多少比例的feature來做train，，默認為1，建議設置為0.8-1.0之間，不要調得太細
### reg_alpha
L1正則化參數，默認為0，我們可以設置0-1000去調整參數，若最終此參數過大，則表示有些特徵可以剔除，最終應該得到L1數值較小的數值。
### reg_lambda
L2正則化參數，默認為0，可以用來限制單一特徵過大，可用來防止overfitting，與L2相同，但此值會比reg_plpha大，但若大的太誇張也表示可能有些特徵要剔除。
### 總結
先做特徵調整，在透過訓練初步決定earning_rate， n_estimators， min_child_sample， 再使用grid_search， Bayesian optimization，random search來調整max_depth，num_leaves，subsample，colsample_bytree，reg_alpha
reference:(https://zhuanlan.zhihu.com/p/376485485)