1. 程式人生 > >05 整合學習 - Boosting - GBDT初探

05 整合學習 - Boosting - GBDT初探

04 整合學習 - Boosting - AdaBoost演算法構建

回顧:
1、Bagging-隨機森林是一個並行模型,Boosting是一個序列模型,所以Boosting模型運算效率會低一些。
2、Bagging演算法解決的是模型過擬合問題,Boosting模型解決的是欠擬合問題。

十一、梯度提升迭代決策樹 - GBDT

GBDT(Gradient Boosting Decison Tree 梯度提升決策樹)
別名:GBTGTBGBRTMART

GBDT也是Boosting演算法的一種,但和AdaBoost演算法不同。
● AdaBoost演算法是利用前一輪的弱學習器的誤差來更新樣本權重值,然後一輪輪得迭代。
● GBDT也是迭代,但是GBDT要求弱學習器必須是CART模型,而且GBDT在模型訓練的時候,是要求模型預測的樣本損失儘可能的小。

● 作為一個提升模型,__ft-1(x)__ 是t-1步的強分類器。t-1步的強分類器和真實值之間存在一個損失函式,即用一個損失函式衡量該模型的優劣。__L(y,ft-1(x))__ 代表這樣的一個損失函式。
● 提升演算法的思想是:下一輪迭代中再訓練一個弱學習器__ht(x)__ ;弱學習器+強學習器形成新的強學習器: ft(x) = ft-1(x)+ht(x)
● 第t步生成模型的損失函式:__L(y,ft(x))__ <=> L(y,ft-1(x)+ht(x) )

__注意:__只有當上一輪的損失函式達到最小後,上一輪的強模型才算訓練完成。在這個基礎上才能開始新一輪的迭代。所以對於第t步的模型來說,之前t-1步的模型都已經是定值。

十二、GBDT的直觀理解

案例1

GDBT的直觀理解

__分析:__現在預測樣本的年齡。
1、一個樣本真實值為30歲,放進決策樹模型進行預測 x→y__,發現預測結果 y^ 是20歲。預測值和真實值相差很大,所以現在的結果是欠擬合。現在想要改變欠擬合的現狀。這裡__計算的殘差 = 真實值-預測值 = y-y^ = 30-20 = 10。

2、對計算的殘差做預測 x→(y-y^) ,發現預測結果__( y-y^ )^__是6歲。預測值 令y=( y-y^ )^=6 和上一步的計算殘差 y-y^=10 依然存在相對較大的偏差。計算這一步的__計算殘差__ = 真實值-預測值 = (y-y^) - ( y-y^ )^ = y-y^-y

= 10-6 = 4

3、對計算的殘差做預測 __x→y-y^-y__,令 __y = (y - y^ - y)^ =3__和上一步的計算殘差 __y-y^-y = 4 依然存在一點的偏差,計算這一步的__計算殘差 = 真實值-預測值 y-y^- __y__-__y__=1;

4、對計算的殘差做預測 x→ y-y^- y__-__y 。這次預測值 = 真實值 ,即 __y-y^- __y__-__y = y* = 1;

5、__y__ __=1__、__y = 3__、__y=6__、 __y^=20__;累加這些值:1+3+6+20 = 30 = 真實值y。即圖中紅色的結果。

以上1~5的步驟就是GBDT的擬合過程。

思考: 結合上面的五個步驟,思考GBDT在擬合一種什麼樣的關係?
● 將每次預測後得到的__計算殘差__作為新的預測目標,通過相同的樣本X預測這個新目標,得到一個新的基學習器。
● 直到預測結果準確為止,或偏差趨向於0。
● 累加所有基學習器的預測結果,就是一步步消除誤差的過程。最後得到的結果肯定等於真實值。

案例2

從決策樹的角度來看GBDT是如何解決欠擬合問題的。

當給定步長的時候,給定一個步長step,在構建下一棵樹的時候使用step*殘差值作為輸入值,這種方式可以減少過擬合的發生。

決策樹-GBDT

分析: 有A、B、C、D四個人,分別對應3個屬性:年齡、收入、上網時長。我們希望根據__收入__和__上網時長__來預測當前這個人的__年齡__是多少。

A:年齡 14,收入 500,上網時間 0.5;
B:年齡 16,收入 700,上網時間 1,2;
C:年齡 24,收入 1800,上網時間 0.3;
D:年齡 26,收入 3000,上網時間 1.5;

預測步驟:
1、先看左圖,左圖構建的是一棵決策迴歸樹,預測的年齡是一個連續值。每個葉子節點裡放的都是目標-年齡;(一開始根節點上的20表示當前節點對年齡的預測是20歲左右,這個我們不關心。)

2、此時決策樹根據__收入__做分支,收入小於1k的預測是15歲,收入大於等於1k的預測是25歲。

3、計算實際值和樣本值之間的差,得: (A、B、C、D) 的殘差 = (14-15,16-15,24-25,26-25)=(-1,1,-1,1);


PS: 為什麼挑選收入作為第一個分支?
● 收入做分支時,左節點的__殘差的平方和(方差)__ = (14-15)2 +(16-15)2 = 2
如果根據上網>1和上網<1的分類結果要好:當上網>1時,年齡分別為26,16,預測值=(26+16)/2 = 42/2=21;
● 上網時間做分支時,左節點的__殘差的平方和(方差)__ = (26-21)2+(16-21)2 = 25+25=50;

所以從方差上看,選擇收入作為第一個分支效果更好。

4、 將__(A、B、C、D) 的殘差__ 作為下一個模型的預測值。__(A、B、C、D) 的殘差__ = (-1,1,-1,1)
再看右圖,右圖根據上網時間做分支。
A:年齡 14,收入 500,上網時間 0.5;
B:年齡 16,收入 700,上網時間 1,2;
C:年齡 24,收入 1800,上網時間 0.3;
D:年齡 26,收入 3000,上網時間 1.5;
上網<1h 的是A、C ;
上網>1h 的是B、D;
所以右圖根據該屬性進行劃分,最終預測得到的殘差為0。

5、根據模型來預測結果:
回顧GBDT的公式:f2(x) = f1(x) + h2(x) = h1(x) + h2(x) ;
當A(收入=500,上網時長=0.5) 時,f2(A) = h1(A) + h2(A) =15 -1=14;
在第一課決策樹中預測的結果是15,存在一定的誤差。
然後在第二棵決策樹預測的結果是-1,即誤差。
最後兩棵樹的結果相加消除了誤差。

兩個弱學習器的相加,變成了強學習器

決策樹-GBDT

最後理解一下這句話的含義:
當給定步長的時候,給定一個步長step,在構建下一棵樹的時候使用step*殘差值作為輸入值,這種方式可以減少過擬合的發生。

最終強學習器 ft(x) = step × ∑ ht(x);
0 時,對應每次迭代的基模型都會在原有的基礎上更小一點。變得小意味著我們需要__更多__的模型來達到真實的狀態。模型__更多__意味著__過擬合__。
step>1 時,意味著我們需要比原來__更少__的模型就能達到預測的效果。意味著可以__減少過擬合__的情況。

十三、GBDT和AdaBoost的區別

AdaBoost變X: 每次改變樣本資料集中的X值,預測錯的加大權重,預測對的減少權重。最後再計算每次得到的基模型的權值。

__GBDT變Y:__本身也會改變原有資料集的資料,但他不改變X,每一個基模型輸入的數值都不發生變化。但是的值會發送變化,每一步的Y都是上一個基模型的真實值和預測值之間的__殘差__。