在 Xgboost 那篇文章 (Kaggle 神器 xgboost) 中提到了 Gradient Boosted Decision Trees,今天來仔細看看 GBDT。
本文結構:
- 什么是 GBDT ?
- GBDT 與 Adaboost 的區別與聯系是什么 ?
- GBDT 與 Xgboost 的區別是什么?
什么是 GBDT?
GBDT(Gradient Boosting Decision Tree,梯度提升決策樹),由名字可以看出涉及到三點:
1. 首先是 Boosting:
前面寫過一篇 Adaboost 算法,里面簡單介紹了 Boosting 的思想:
給定初始訓練數據,由此訓練出第一個基學習器;
根據基學習器的表現對樣本進行調整,在之前學習器做錯的樣本上投入更多關注;
用調整后的樣本,訓練下一個基學習器;
重復上述過程 T 次,將 T 個學習器加權結合。
簡單講,就是每次訓練單個弱學習器時,都將上一次分錯的數據權重提高一點再進行當前單個弱學習器的學習。這樣越往后執行,訓練出的單個弱學習器就會越在意那些容易分錯(權重高)的點。當執行 M 次后,通過加權求和的方式組合成一個最終的學習器。
2. 接著是 Gradient Boosting:
Gradient boosting 是 boosting 的其中一種方法,它主要的思想是,每一次建立單個學習器時,是在之前建立的模型的損失函數的梯度下降方向。
我們知道損失函數(loss function)越大,說明模型越容易出錯,如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度(Gradient)的方向上下降。
接下來看算法具體細節:
最終模型 F 是多個弱學習器的加權組合:
整體損失函數,其中 P 為模型的參數:
我們要求使損失函數達到最小的參數:
或者寫成梯度下降的方式,就是我們將要得到的模型 fm 的參數 {αm,βm} 能夠使得 fm 的方向是之前得到的模型 Fm-1 的損失函數下降最快的方向:
因為 Fm-1 的損失函數下降最快的方向為:
那我們可以用最小二乘法來得到 αm:
在此基礎上,可以得到 βm:
最終得到整體:
完整算法:
3. 然后是 Decision Tree:
GBDT 是 GB 和 DT 的結合,就是當 GB 中的單個學習器為決策樹時的情況,此處 DT 使用的是回歸樹。
下面兩個圖分別表示 DT 和 由 100 棵樹組合成的 GB 在樹的深度為 0,3,6 時的效果,0 時就是要擬合的函數的圖像,可以看到 GB 可以在有限的深度就能得到比較光滑的的擬合:
既然都是 boosting 方法,那么 GBDT 與 Adaboost 的區別與聯系是什么?
它們都屬于 boosting 提升方法:
adaboost 可以表示為 boosting 的前向分布算法(Forward stagewise additive modeling)的一個特例。
在上圖中,如何選擇損失函數決定了算法的名字。不同的損失函數和極小化損失函數方法決定了 boosting 的最終效果,下面是幾個常見的 boosting:
AdaBoost 是通過提升錯分數據點的權重來定位模型的不足,
而 Gradient Boosting是通過算梯度(gradient)來定位模型的不足。
GBDT 與 Xgboost 的關系又是什么?
在 Kaggle 神器 xgboost 這篇文章中簡單地提了一下 xgboost 的特點,除了很多優化外它與 GBDT 的區別有:
Xgboost 是 GB 算法的高效實現,xgboost 中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)。
-
xgboost在目標函數中顯示的加上了正則化項:
-
GB 中使用 Loss Function 對 f(x) 的一階導數計算出偽殘差用于學習生成fm,xgboost 不僅使用到了一階導數,還使用二階導數:
-
CART 回歸樹中尋找最佳分割點的衡量標準是最小化均方差,xgboost 尋找分割點的標準是最大化,lamda,gama 與正則化項相關:
參考:
統計學習方法
A Gradient Boosting Machine-Jerome H. Friedman
http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
http://blog.csdn.net/yangtrees/article/details/7506052
http://blog.csdn.net/shenxiaoming77/article/details/51542982
http://blog.csdn.net/dark_scope/article/details/24863289
http://arogozhnikov.github.io/2016/06/24/gradient_boosting_explained.html
推薦閱讀 歷史技術博文鏈接匯總
http://www.lxweimin.com/p/28f02bb59fe5
也許可以找到你想要的