1. 程式人生 > >梯度提升決策樹(GBDT)

梯度提升決策樹(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)。

一、Regression Decision Tree:迴歸樹

迴歸樹總體流程類似於分類樹,區別在於,迴歸樹的每一個節點都會得一個預測值,以年齡為例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化平方誤差。也就是被預測出錯的人數越多,錯的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據。分枝直到每個葉子節點上人的年齡都唯一或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。(引用自一篇部落格,詳見參考文獻3)

迴歸樹示例

  迴歸樹演算法如下圖(截圖來自《統計學習方法》5.5.1 CART生成):

迴歸樹生成演算法

二、Boosting Decision Tree:提升樹演算法

提升樹是迭代多棵迴歸樹來共同決策。當採用平方誤差損失函式時,每一棵迴歸樹學習的是之前所有樹的結論和殘差,擬合得到一個當前的殘差迴歸樹,殘差的意義如公式:殘差 = 真實值 - 預測值 。提升樹即是整個迭代過程生成的迴歸樹的累加。
  舉個例子,參考自一篇部落格(參考文獻 4),該部落格舉出的例子較直觀地展現出多棵決策樹線性求和過程以及殘差的意義。
  訓練一個提升樹模型來預測年齡:
  訓練集是4個人,A,B,C,D年齡分別是14,16,24,26。樣本中有購物金額、上網時長、經常到百度知道提問等特徵。提升樹的過程如下:

提升樹示例

該例子很直觀的能看到,預測值等於所有樹值得累加,如A的預測值 = 樹1左節點 值 15 + 樹2左節點 -1 = 14。
  因此,給定當前模型 fm-1(x),只需要簡單的擬合當前模型的殘差。現將回歸問題的提升樹演算法敘述如下:

提升樹演算法

三、Gradient Boosting Decision Tree:梯度提升決策樹

提升樹利用加法模型和前向分步演算法實現學習的優化過程。當損失函式時平方損失和指數損失函式時,每一步的優化很簡單,如平方損失函式學習殘差迴歸樹。

損失函式列表

  但對於一般的損失函式,往往每一步優化沒那麼容易,如上圖中的絕對值損失函式和Huber損失函式。針對這一問題,Freidman提出了梯度提升演算法:利用最速下降的近似方法,即利用損失函式的負梯度在當前模型的值,作為迴歸問題中提升樹演算法的殘差的近似值,擬合一個迴歸樹。(注:鄙人私以為,與其說負梯度作為殘差的近似值,不如說殘差是負梯度的一種特例)演算法如下(截圖來自《The Elements of Statistical Learning》):

梯度提升決策樹演算法

演算法步驟解釋:

  • 1、初始化,估計使損失函式極小化的常數值,它是隻有一個根節點的樹,即ganma是一個常數值。
  • 2、
    (a)計算損失函式的負梯度在當前模型的值,將它作為殘差的估計
    (b)估計迴歸樹葉節點區域,以擬合殘差的近似值
    (c)利用線性搜尋估計葉節點區域的值,使損失函式極小化
    (d)更新迴歸樹
  • 3、得到輸出的最終模型 f(x)

四、重要引數的意義及設定

推薦GBDT樹的深度:6;(橫向比較:DecisionTree/RandomForest需要把樹的深度調到15或更高)
  以下摘自知乎上的一個問答(詳見參考文獻8),問題和回覆都很好的闡述了這個引數設定的數學原理。
  【問】xgboost/gbdt在調參時為什麼樹的深度很少就能達到很高的精度?
  用xgboost/gbdt在在調參的時候把樹的最大深度調成6就有很高的精度了。但是用DecisionTree/RandomForest的時候需要把樹的深度調到15或更高。用RandomForest所需要的樹的深度和DecisionTree一樣我能理解,因為它是用bagging的方法把DecisionTree組合在一起,相當於做了多次DecisionTree一樣。但是xgboost/gbdt僅僅用梯度上升法就能用6個節點的深度達到很高的預測精度,使我驚訝到懷疑它是黑科技了。請問下xgboost/gbdt是怎麼做到的?它的節點和一般的DecisionTree不同嗎?
  【答】
  這是一個非常好的問題,題主對各演算法的學習非常細緻透徹,問的問題也關係到這兩個演算法的本質。這個問題其實並不是一個很簡單的問題,我嘗試用我淺薄的機器學習知識對這個問題進行回答。
  一句話的解釋,來自周志華老師的機器學習教科書( 機器學習-周志華):Boosting主要關注降低偏差,因此Boosting能基於泛化效能相當弱的學習器構建出很強的整合;Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網路等學習器上效用更為明顯。
  隨機森林(random forest)和GBDT都是屬於整合學習(ensemble learning)的範疇。整合學習下有兩個重要的策略Bagging和Boosting。
  Bagging演算法是這樣做的:每個分類器都隨機從原樣本中做有放回的取樣,然後分別在這些取樣後的樣本上訓練分類器,然後再把這些分類器組合起來。簡單的多數投票一般就可以。其代表演算法是隨機森林。Boosting的意思是這樣,他通過迭代地訓練一系列的分類器,每個分類器採用的樣本分佈都和上一輪的學習結果有關。其代表演算法是AdaBoost, GBDT。
  其實就機器學習演算法來說,其泛化誤差可以分解為兩部分,偏差(bias)和方差(variance)。這個可由下圖的式子匯出(這裡用到了概率論公式D(X)=E(X2)-[E(X)]2)。偏差指的是演算法的期望預測與真實預測之間的偏差程度,反應了模型本身的擬合能力;方差度量了同等大小的訓練集的變動導致學習效能的變化,刻畫了資料擾動所導致的影響。這個有點兒繞,不過你一定知道過擬合。
  如下圖所示,當模型越複雜時,擬合的程度就越高,模型的訓練偏差就越小。但此時如果換一組資料可能模型的變化就會很大,即模型的方差很大。所以模型過於複雜的時候會導致過擬合。
  當模型越簡單時,即使我們再換一組資料,最後得出的學習器和之前的學習器的差別就不那麼大,模型的方差很小。還是因為模型簡單,所以偏差會很大。

模型複雜度與偏差方差的關係圖

  也就是說,當我們訓練一個模型時,偏差和方差都得照顧到,漏掉一個都不行。
  對於Bagging演算法來說,由於我們會並行地訓練很多不同的分類器的目的就是降低這個方差(variance) ,因為採用了相互獨立的基分類器多了以後,h的值自然就會靠近.所以對於每個基分類器來說,目標就是如何降低這個偏差(bias),所以我們會採用深度很深甚至不剪枝的決策樹。
  對於Boosting來說,每一步我們都會在上一輪的基礎上更加擬合原資料,所以可以保證偏差(bias),所以對於每個基分類器來說,問題就在於如何選擇variance更小的分類器,即更簡單的分類器,所以我們選擇了深度很淺的決策樹。

五、拓展

最近引起關注的一個Gradient Boosting演算法:xgboost,在計算速度和準確率上,較GBDT有明顯的提升。xgboost 的全稱是eXtreme Gradient Boosting,它是Gradient Boosting Machine的一個c++實現,作者為正在華盛頓大學研究機器學習的大牛陳天奇 。xgboost最大的特點在於,它能夠自動利用CPU的多執行緒進行並行,同時在演算法上加以改進提高了精度。它的處女秀是Kaggle的 希格斯子訊號識別競賽,因為出眾的效率與較高的預測準確度在比賽論壇中引起了參賽選手的廣泛關注。值得我們在GBDT的基礎上對其進一步探索學習。



作者:SiyueLin
連結:https://www.jianshu.com/p/005a4e6ac775
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。