# 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)