一、Boosting
GBDT屬於集成學習(Ensemble Learning)中的boosting算法。
Boosting算法過程如下:
(1) 分步去學習weak classifier,最終的strong claissifier是由分步產生的classifier’組合‘而成的
(2) 根據每步學習到的classifier去reweight樣本(分錯的樣本權重加大,反之減小)
Boosting實際采用加法模型(classifier的線性組合)+前向分布,如果每次在Boosting中的基函數(classifier)使用決策樹的算法就是Boosting Tree.
Boosting更像是一種思想, gradient boosting是一種boosting的方法. 它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向,假設分步模型下當前模型是f(x),利用損失函數L的負梯度在f(x)下的值作為boosting tree算法中的殘差(residual)去擬合一個回歸樹。
GBDT的全稱是Gradient Boosting Decision Tree,Gradient Boosting和Decision Tree是兩個獨立的概念。因此我們先說說Boosting。Boosting的概念很好理解,意思是用一些弱分類器的組合來構造一個強分類器。因此,它不是某個具體的算法,它說的是一種理念。和這個理念相對應的是一次性構造一個強分類器。像支持向量機,邏輯回歸等都屬於后者。通常,我們通過相加來組合分類器,形式如下:
GBDT和xgboost和lightGBM在競賽和工業界使用都非常頻繁,能有效的應用到分類、回歸、排序問題,GBDT 中的決策樹是回歸樹,預測結果是一個數值,在點擊率預測方面常用 GBDT,例如用戶點擊某個內容的概率。雖然使用起來不難,但是要能完整的理解還是有一點麻煩的。本文嘗試一步一步梳理GB、GBDT並簡要介紹xgboost、lightgbm,它們之間有非常緊密的聯系,GBDT是以決策樹(CART)為基學習器的GB算法,xgboost擴展和改進了GBDT,xgboost算法更快,准確率也相對高一些,lightgbm則是在xgboost的基礎上,根據xgboost存在的缺點,進一步改進優化。。
二、 Gradient Boosting(GB)
機器學習中的學習算法的目標是為了優化或者說最小化loss Function, Gradient boosting的思想是迭代生多個(M個)弱的模型,然后將每個弱模型的預測結果相加,后面的模型Fm+1(x)基於前面學習模型的Fm(x)的效果生成的,關系如下:
GB算法的思想很簡單,關鍵是怎么生成h(x)?
如果損失函數是回歸問題的平方誤差,很容易想到最理想的h(x)應該是能夠完全擬合 ,這就是常說基於殘差的學習,也就是Boosting Tree算法(《統計學習方法》中的算法8.3:回歸樹算法)。殘差學習在回歸問題中可以很好的使用,但是為了一般性(分類,排序問題),實際中往往是基於loss Function 在函數空間的的負梯度學習,對於回歸問題的損失函數為
時,殘差和負梯度也是相同的。
中的f,不要理解為傳統意義上的函數,而是一個函數向量
,向量中元素的個數與訓練樣本的個數相同,因此基於Loss Function函數空間的負梯度的學習也稱為“偽殘差”,由於此時基於損失函數空間的負梯度學習,因此就是Gradient Boosting Tree算法。
Boosting Tree算法是Gradient Boosting Tree算法的損失函數采用平方損失函數時的特殊情況,此時2(a)中損失函數的負梯度方向rmi= y - fm-1(xi),即我們所說的殘差,此時2(c)中的cmj即為該區域Rmj中y的平均值。
所以GB算法的大致步驟如下圖(《統計學習方法》中的算法8.4:梯度提升算法):
步驟(2)即為迭代生成M個基學習器的步驟
2(a)表示計算損失函數的負梯度在當前模型的值,將其作為殘差的估計值(擬殘差);
2(b)表示估計回歸樹葉子節點的區域,以擬合殘差的近似值; 其實也就是把擬殘差單做目標變量,划分目標區域,然后結合(c)進一步生成回歸樹。
,以損失函數為平方損失函數時尋找切分點的公式為例,損失函數為其他函數時,
用
替換。
2(c)表示利用線性搜索估計葉子節點區域的值,使得損失函數最小化;
2(d)更新回歸樹;
三、Gradient Boosting Decision Tree
理解GBDT重點首先是Gradient Boosting,其次才是 Decision Tree。GBDT 是 Gradient Boosting 的一種具體實例,只不過這里的弱分類器是決策樹。如果你改用其他弱分類器 XYZ(選擇的前提是低方差和高偏差。框架服從boosting 框架即可。),你也可以稱之為 Gradient Boosting XYZ。只不過 Decision Tree 很好用,GBDT 才如此引人注目。
GB算法中最典型的基學習器是決策樹,尤其是CART,正如名字的含義,GBDT是GB和DT的結合。要注意的是這里的決策樹是回歸樹,GBDT中的決策樹是個弱模型(由於boosting模型會在每一輪的基礎上更加擬合數據,可以保證bias,因此每個基學習器需要保證低variance,這與bagging模型的RF正好相反),深度較小一般不會超過5,葉子節點的數量也不會超過10,對於生成的每棵決策樹乘上比較小的縮減系數(學習率<0.1),有些GBDT的實現加入了隨機抽樣(subsample 0.5<=f <=0.8)提高模型的泛化能力。通過交叉驗證的方法選擇最優的參數。因此GBDT實際的核心問題在於2(b),基學習器的生成,也就是CART回歸樹的生成。在我之前的博客中已經詳述了CART回歸樹的生成,在這就不再介紹了。
四、GBDT用於分類
GBDT中的DT是回歸樹,但GBDT也可以解決分類問題,解決辦法是用softmax來產生原本離散型label的概率,進而可以用解決回歸問題的思路來解決分類問題。
以下內容摘自博客https://www.cnblogs.com/ModifyRong/p/7744987.html,感謝博主的分享,具體GBDT用於分類的例子在博客中有詳細介紹。
五、XGBoost
Xgboost是GB算法的高效實現,xgboost中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)。下面所有的內容來自原始paper,包括公式。
(1). xgboost在目標函數中顯示的加上了正則化項,基學習為CART時,正則化項與樹的葉子節點的數量T和葉子節點的值有關。
(2). GB中使用Loss Function對f(x)的一階導數計算出偽殘差用於學習生成fm(x),xgboost不僅使用到了一階導數,還使用二階導數。
第t次的loss:
對上式做二階泰勒展開:g為一階導數,h為二階導數
(3). 上面提到CART回歸樹中尋找最佳分割點的衡量標准是最小化均方差,xgboost尋找分割點的標准是最大化,lamda,gama與正則化項相關
xgboost算法的步驟和GB基本相同,都是首先初始化為一個常數,gb是根據一階導數ri,xgboost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。
xgboost與gdbt除了上述三點的不同,xgboost在實現時還做了許多優化:
-
- 在尋找最佳分割點時,考慮傳統的枚舉每個特征的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。
- xgboost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。
- 特征列排序后以塊的形式存儲在內存中,在迭代中可以重復使用;雖然boosting算法迭代必須串行,但是在處理每個特征列時可以做到並行。
- 按照特征列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer,然后再計算,提高算法的效率。
- xgboost 還考慮了當數據量比較大,內存不夠時怎么有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,盡可能的提高算法的效率。
六、LightGBM
概括來說,lightGBM主要有以下特點:
-
-
基於Histogram的決策樹算法
-
帶深度限制的Leaf-wise的葉子生長策略
-
直方圖做差加速
-
直接支持類別特征(Categorical Feature)
-
Cache命中率優化
-
基於直方圖的稀疏特征優化
-
多線程優化
-
前2個特點使我們尤為關注的。
Histogram算法
直方圖算法的基本思想:先把連續的浮點特征值離散化成k個整數,同時構造一個寬度為k的直方圖。遍歷數據時,根據離散化后的值作為索引在直方圖中累積統計量,當遍歷一次數據后,直方圖累積了需要的統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點。
帶深度限制的Leaf-wise的葉子生長策略
Level-wise過一次數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型復雜度,不容易過擬合。但實際上Level-wise是一種低效算法,因為它不加區分的對待同一層的葉子,帶來了很多沒必要的開銷,因為實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。
Leaf-wise則是一種更為高效的策略:每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環。因此同Level-wise相比,在分裂次數相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。
Leaf-wise的缺點:可能會長出比較深的決策樹,產生過擬合。因此LightGBM在Leaf-wise之上增加了一個最大深度限制,在保證高效率的同時防止過擬合。
七、總結
本文詳細介紹了集成模型中的Boosting思想,以及gradient Boosting、GBDT的算法流程,XGBoost以及lightGBM都是在GB以及GBDT基礎上的優化和改進,本文並沒有詳細分析原理,僅簡單的對比了優缺點。
總結GBDT的部分優點:
GBDT 它的非線性變換比較多,表達能力強,而且不需要做復雜的特征工程和特征變換。
GBDT是拿Decision Tree作為GBM里的弱分類器,GBDT的優勢 首先得益於 Decision Tree 本身的一些良好特性,具體可以列舉如下:
- Decision Tree 可以很好的處理 missing feature,這是他的天然特性,因為決策樹的每個節點只依賴一個 feature,如果某個 feature 不存在,這顆樹依然可以拿來做決策,只是少一些路徑。像邏輯回歸,SVM 就沒這個好處。
-
Decision Tree 可以很好的處理各種類型的 feature,也是天然特性,很好理解,同樣邏輯回歸和 SVM 沒這樣的天然特性。
-
對特征空間的 outlier 有魯棒性,因為每個節點都是 x < 𝑇 的形式,至於大多少,小多少沒有區別,outlier 不會有什么大的影響,同樣邏輯回歸和 SVM 沒有這樣的天然特性。
-
如果有不相關的 feature,沒什么干擾,如果數據中有不相關的 feature,頂多這個 feature 不出現在樹的節點里。邏輯回歸和 SVM 沒有這樣的天然特性(但是有相應的補救措施,比如邏輯回歸里的 L1 正則化)。
-
數據規模影響不大,因為我們對弱分類器的要求不高,作為弱分類器的決策樹的深 度一般設的比較小,即使是大數據量,也可以方便處理。像 SVM 這種數據規模大的時候訓練會比較麻煩。
當然 Decision Tree 也不是毫無缺陷,通常在給定的不帶噪音的問題上,他能達到的最佳分類效果還是不如 SVM,邏輯回歸之類的。但是,我們實際面對的問題中,往往有很大的噪音,使得 Decision Tree 這個弱勢就不那么明顯了。而且,GBDT 通過不斷的疊加組合多個小的 Decision Tree,他在不帶噪音的問題上也能達到很好的分類效果。換句話說,通過GBDT訓練組合多個小的 Decision Tree 往往要比一次性訓練一個很大的 Decision Tree 的效果好很多。因此不能把 GBDT 理解為一顆大的決策樹,幾顆小樹經過疊加后就不再是顆大樹了,它比一顆大樹更強。
參考鏈接:
https://cloud.tencent.com/developer/article/1005611
http://blog.csdn.net/gavin__zhou/article/details/71156715
https://www.cnblogs.com/wxquare/p/5541414.html
https://www.cnblogs.com/bentuwuying/p/6667267.html
https://www.cnblogs.com/ModifyRong/p/7744987.html
http://blog.csdn.net/niaolianjiulin/article/details/76584785