GBDT要點簡介

本文摘取網絡上一篇文章的要點進行講解,更多細節在:http://blog.csdn.net/w28971023/article/details/8240756

一、什麼是GBDT?

  GBDT(Gradient Boosting Decision Tree) 是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結論累加起來作爲最終結果。它在被提出之初就和SVM一起被認爲是泛化能力(generalization)較強的算法。近些年更因爲被用於搜索排序的機器學習模型而引起大家關注。

二、GBDT的組成

  GBDT主要有三部分組成,分別是GB(Gradient Boosting)、DT(Regression Decistion Tree)和Shrinkage (算法的一個重要演進分枝,目前大部分源碼都按該版本實現)。前兩個部分是GBDT的理論重點,Shrinkage爲GBDT的實現重點,三者缺一不可。

1、DT:Regression Decistion Tree

  決策樹分爲兩大類,迴歸樹和分類樹。前者用於預測實數值,如明天的溫度、用戶的年齡、網頁的相關程度;後者用於分類標籤值,如晴天/陰天/霧/雨、用戶性別、網頁是否是垃圾頁面。另外,前者的結果加減是有意義的,如10歲+5歲-3歲=12歲,後者則無意義,如男+男+女=到底是男是女? GBDT的核心在於累加所有樹的結果作爲最終結果,就像前面對年齡的累加(-3是加負3),而分類樹的結果顯然是沒辦法累加的,所以GBDT中的樹都是迴歸樹,不是分類樹,這點對理解GBDT相當重要(儘管GBDT調整後也可用於分類但不代表GBDT的樹是分類樹)。

2、GB:Gradient Boosting

  Boosting,迭代,即通過迭代多棵樹來共同決策。這怎麼實現呢?難道是每棵樹獨立訓練一遍,比如A這個人,第一棵樹認爲是10歲,第二棵樹認爲是0歲,第三棵樹認爲是20歲,我們就取平均值10歲做最終結論?–當然不是!且不說這是投票方法並不是GBDT,只要訓練集不變,獨立訓練三次的三棵樹必定完全相同,這樣做完全沒有意義。之前說過,GBDT是把所有樹的結論累加起來做最終結論的,所以可以想到每棵樹的結論並不是年齡本身,而是年齡的一個累加量。GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差爲6歲。那麼在第二棵樹裏我們把A的年齡設爲6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學。這就是Gradient Boosting在GBDT中的意義,簡單吧。

3、GBDT工作過程實例

這裏寫圖片描述
  由於A,B年齡較爲相近,C,D年齡較爲相近,他們被分爲兩撥,每撥用平均年齡作爲預測值。此時計算殘差(殘差的意思就是: A的預測值 + A的殘差 = A的實際值),所以A的殘差就是16-15=1(注意,A的預測值是指前面所有樹累加的和,這裏前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作爲A的預測值)。進而得到A,B,C,D的殘差分別爲-1,1,-1,1。然後我們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了。這裏的數據顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。

  換句話說,現在A,B,C,D的預測值都和真實年齡一致了。Perfect!:
  A: 14歲高一學生,購物較少,經常問學長問題;預測年齡A = 15 – 1 = 14
  B: 16歲高三學生;購物較少,經常被學弟問問題;預測年齡B = 15 + 1 = 16
  C: 24歲應屆畢業生;購物較多,經常問師兄問題;預測年齡C = 25 – 1 = 24
  D: 26歲工作兩年員工;購物較多,經常被師弟問問題;預測年齡D = 25 + 1 = 26

  那麼哪裏體現了Gradient呢?其實回到第一棵樹結束時想一想,無論此時的cost function是什麼,是均方差還是均差,只要它以誤差作爲衡量標準,殘差向量(-1, 1, -1, 1)都是它的全局最優方向,這就是Gradient。

4、Shrinkage

  Shrinkage(縮減)的思想認爲,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認爲每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。用方程來看更清晰,即
  沒用Shrinkage時:(yi表示第i棵樹上y的預測值, y(1~i)表示前i棵樹y的綜合預測值)
  y(i+1) = f(殘差(y1~yi)), 其中: 殘差(y1~yi) = y真實值 - y(1 ~ i)
  y(1 ~ i) = SUM(y1, …, yi)
  Shrinkage不改變第一個方程,只把第二個方程改爲:
  y(1 ~ i) = y(1 ~ i-1) + step * yi

  即Shrinkage仍然以殘差作爲學習目標,但對於殘差學習出來的結果,只累加一小部分(step*殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復誤差,而是隻修復一點點,其實就是把大步切成了很多小步。本質上,Shrinkage爲每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient並沒有關係。這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發生也是經驗證明的,目前還沒有看到從理論的證明。

發佈了59 篇原創文章 · 獲贊 208 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章