一、GBDT的原理
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力較強的算法。
GBDT中的樹是回歸樹(不是分類樹),GBDT用來做回歸預測,調整后也可以用於分類。
GBDT的思想使其具有天然優勢可以發現多種有區分性的特征以及特征組合。業界中,Facebook使用其來自動發現有效的特征、特征組合,來作為LR模型中的特征,以提高CTR預估(Click-Through Rate Prediction)的准確性(詳見參考文獻5、6);GBDT在淘寶的搜索及預測業務上也發揮了重要作用(詳見參考文獻7)。
提升樹利用加法模型和前向分步算法實現學習的優化過程。當損失函數時平方損失和指數損失函數時,每一步的優化很簡單,如平方損失函數學習殘差回歸樹。
但對於一般的損失函數,往往每一步優化沒那么容易,如上圖中的絕對值損失函數和Huber損失函數。針對這一問題,Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用損失函數的負梯度在當前模型的值,作為回歸問題中提升樹算法的殘差的近似值,擬合一個回歸樹。(注:鄙人私以為,與其說負梯度作為殘差的近似值,不如說殘差是負梯度的一種特例)算法如下(截圖來自《The Elements of Statistical Learning》):
算法步驟解釋:
- 1、初始化,估計使損失函數極小化的常數值,它是只有一個根節點的樹,即ganma是一個常數值。
- 2、
(a)計算損失函數的負梯度在當前模型的值,將它作為殘差的估計
(b)估計回歸樹葉節點區域,以擬合殘差的近似值
(c)利用線性搜索估計葉節點區域的值,使損失函數極小化
(d)更新回歸樹 - 3、得到輸出的最終模型 f(x)
二、GBDT的參數設置
1、推薦GBDT樹的深度:6;(橫向比較:DecisionTree/RandomForest需要把樹的深度調到15或更高)
2、【問】xgboost/gbdt在調參時為什么樹的深度很少就能達到很高的精度?
用xgboost/gbdt在在調參的時候把樹的最大深度調成6就有很高的精度了。但是用DecisionTree/RandomForest的時候需要把樹的深度調到15或更高。用RandomForest所需要的樹的深度和DecisionTree一樣我能理解,因為它是用bagging的方法把DecisionTree組合在一起,相當於做了多次DecisionTree一樣。但是xgboost/gbdt僅僅用梯度上升法就能用6個節點的深度達到很高的預測精度,使我驚訝到懷疑它是黑科技了。請問下xgboost/gbdt是怎么做到的?它的節點和一般的DecisionTree不同嗎?
【答】
(1)Boosting主要關注降低偏差(bais),因此Boosting能基於泛化性能相當弱的學習器構建出很強的集成;Bagging主要關注降低方差(variance),因此它在不剪枝的決策樹、神經網絡等學習器上效用更為明顯。
(2)隨機森林(random forest)和GBDT都是屬於集成學習(ensemble learning)的范疇。集成學習下有兩個重要的策略Bagging和Boosting。
Bagging算法是這樣做的:每個分類器都隨機從原樣本中做有放回的采樣,然后分別在這些采樣后的樣本上訓練分類器,然后再把這些分類器組合起來。簡單的多數投票一般就可以。其代表算法是隨機森林。Boosting的意思是這樣,他通過迭代地訓練一系列的分類器,每個分類器采用的樣本分布都和上一輪的學習結果有關。其代表算法是AdaBoost, GBDT。
(3)其實就機器學習算法來說,其泛化誤差可以分解為兩部分,偏差(bias)和方差(variance)。這個可由下圖的式子導出(這里用到了概率論公式D(X)=E(X^2)-[E(X)]^2)。偏差指的是算法的期望預測與真實預測之間的偏差程度,反應了模型本身的擬合能力;方差度量了同等大小的訓練集的變動導致學習性能的變化,刻畫了數據擾動所導致的影響。這個有點兒繞,不過你一定知道過擬合。
如下圖所示,當模型越復雜時,擬合的程度就越高,模型的訓練偏差就越小。但此時如果換一組數據可能模型的變化就會很大,即模型的方差很大。所以模型過於復雜的時候會導致過擬合。
當模型越簡單時,即使我們再換一組數據,最后得出的學習器和之前的學習器的差別就不那么大,模型的方差很小。還是因為模型簡單,所以偏差會很大。
也就是說,當我們訓練一個模型時,偏差和方差都得照顧到,漏掉一個都不行。
對於Bagging算法來說,由於我們會並行地訓練很多不同的分類器的目的就是降低這個方差(variance) ,因為采用了相互獨立的基分類器多了以后,h的值自然就會靠近.所以對於每個基分類器來說,目標就是如何降低這個偏差(bias),所以我們會采用深度很深甚至不剪枝的決策樹。
對於Boosting來說,每一步我們都會在上一輪的基礎上更加擬合原數據,所以可以保證偏差(bias),所以對於每個基分類器來說,問題就在於如何選擇variance更小的分類器,即更簡單的分類器,所以我們選擇了深度很淺的決策樹。
三、參考文獻
1、http://www.jianshu.com/p/005a4e6ac775