GBDT相對於經典的決策樹,算是一種比較成熟並且能夠實際應用的決策樹算法了。咱們想要理解GBDT這種決策樹,得先從感性上理解這棵樹的工做方式。
首先咱們要了解到,DBDT是一種迴歸樹(Regression Decision tree)。迴歸樹與分類樹的差距請看個人文章《經典的迴歸樹算法》。
咱們知道,分類樹在每一次分支的時候,窮舉每個特徵的每個閾值,而後按照大於或者小於閾值的方式將其相互分開。這就是分類樹的算法。
而迴歸樹也十分相似,可是在每一個節點都會獲得一個預測值。算法
以年齡爲例,該預測值等於屬於這個節點的全部人年齡的平均值。分枝時窮舉每個feature的每一個閾值找最好的分割點,但衡量最好的標準再也不是最大熵,而是最小化均方差--即(每一個人的年齡-預測年齡)^2 的總和 / N,或者說是每一個人的預測偏差平方和 除以 N。這很好理解,被預測出錯的人數越多,錯的越離譜,均方差就越大,經過最小化均方差可以找到最靠譜的分枝依據。分枝直到每一個葉子節點上人的年齡都惟一(這太難了)或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不惟一,則以該節點上全部人的平均年齡作爲該葉子節點的預測年齡。網絡
這實際上是一個很好的思惟方式。
Boosting,提高。這涉及到機器學習中的集成學習。原理就是經過多個特徵生成多個樹,來決策一件事情。也就是「三個臭皮匠,頂一個諸葛亮」的原理。這是如何實現的呢?咱們舉一個簡單的例子。BDT的核心就在於,每一棵樹學的是以前全部樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。好比A的真實年齡是18歲,咱們訓練的時候,第一棵樹的擬合事後預測年齡是12歲,咱們與真實數據比對差了6歲,即殘差爲6歲。那麼在第二棵樹裏咱們把A的年齡設爲6歲去擬合學習,若是第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;若是第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學。
若是還有疑問,請看下面這個例子:
仍是年齡預測,簡單起見訓練集只有4我的,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工做兩年的員工。若是是用一棵傳統的迴歸決策樹來訓練,會獲得以下圖1所示結果:機器學習
這是一棵普通的迴歸樹,咱們能夠看到,咱們經過年齡平均值將少年和青年分開
,再用上網時長將每一個分支繼續細分到不能分割或者達到要求爲止。
接下來看BDT實現:函數
在第一棵樹分枝和圖1同樣,因爲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,即每一個人都獲得了真實的預測值。post
換句話說,如今A,B,C,D的預測值都和真實年齡一致了:學習
GBDT核心思想就是這樣,可是既然普通的樹和GBDT結果同樣,那爲何還須要GBDT呢?
緣由就是過擬合。過擬合就是模型在訓練數據集上表現的過於好,分的過於細。以至於容錯能力很低,也能夠稱做」泛化能力「低。這就會致使在實際測試數據中表現明顯差不少。咱們發現圖1爲了達到100%精度使用了3個feature(上網時長、時段、網購金額),其中分枝「上網時長>1.1h」 很顯然已通過擬合了,這個數據集上A,B也許剛好A天天上網1.09h, B上網1.05小時,但用上網時間是否是>1.1小時來判斷全部人的年齡很顯然是有悖常識的;
相對來講圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,後一個feature是問答比例,顯然圖2的依據更靠譜(這是杜撰的數據,爲了顯示效果誇張的一下,實際有實驗證實以上論點)。測試
咱們前面一直都在討論GBDT的基本原理,是從宏觀上對於這種算法有個感性的認識。可是咱們要想進一步理解GBDT,就得知道負梯度擬合,或者咱們也叫梯度提高。
咱們都知道,在機器學習算法中,爲了下降偏差函數,咱們會有一個方法叫作梯度降低法。其作法是偏差函數中,每一步都走當前的梯度方向,也就是降低最快的方向進行降低,這樣屢次迭代步長以後,偏差函數就會降到一個局部最低點(凸函數中也是全局最低點),也就獲得了最小的偏差函數。
咱們嘗試使用這種方法去訓練一棵迴歸樹,或者更精確的說,是一棵CART,若有朋友不太熟悉CART,請看我以前的文章《CART》。正如前面所提到,咱們GBDT每次訓練的時候都是擬合上一棵樹的殘差,那麼咱們使用損失函數來擬合這棵樹:3d
使用損失函數的負梯度來擬合它的殘差:cdn
這樣將全部的負梯度加起來以後就會獲得一個總體的梯度降低。使得整個系統的偏差函數最小。
我貼出梯度提高算法以輔助理解,內容來自李航的《統計學習方法》:blog
咱們來看看這梯度提高算法的流程:
若是不夠理解,請將這個負梯度擬合的殘差直接帶入以前文章《CART》例子中的殘差數據中去,這樣就有一個例子可供參考輔助理解。