GBDT算法原理

GBDT即可用於解決迴歸問題,也能用於解決分類問題。在初步理解GBDT時,最好從迴歸和分類的角度分別理順思路,發現其中的不同和關鍵點,就能初步明白GBDT的算法原理。接下來從迴歸和分類的角度分別記錄下:

1、迴歸的角度——初步:

GBDT的思想可以用一個通俗的例子解釋,假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。

直觀的解釋:GBDT是一系列迴歸樹(CART)的加法組合,後一顆樹擬合之前預測結果與目標的“殘差”。具體說明如下:假設樣本集 D=(x_{1},y_{1}), (x_{2},y_{2}),...,(x_{n},y_{n}) ,第一輪用一個模型,如 F(x) 去擬合這些數據,使得這批樣本的平方損失函數(即 \frac{1}{2}\sum_{i=1}^{n}({y_{i}- F(x_{i})})^2 )最小。但是發現雖然模型的擬合效果很好,但仍然有一些差距,比如預測值 F(x_{1})=0.8,而真實值 y_{1}=0.9F(x_{2})=1.4 ,y_{2}=1.3等等。第二輪用一個新的模型 f(x) 來擬合 F(x) 未完全擬合真實樣本的殘差,即 y-F(x) 。所以對於每個樣本來說,擬合的樣本集就變成了: (x_{1},y_{1}-F(x_{1})), (x_{2},y_{2}-F(x_{2})),...,(x_{n},y_{n}-F(x_{n})) 。依次類推第三輪、第四輪,……,直到滿足終止條件,將所有學得的模型相加得到最終的結果,這就是GBDT。

 ({y_{i}- F(x_{i})}) 被稱爲殘差,這一部分也就是前一模型F({x_{i}})未能完全擬合的部分,所以交給新的模型來完成。GBDT的全稱是Gradient Boosting Decision Tree,其中gradient被稱爲梯度,更一般的理解,可以認爲是一階導,那麼這裏的殘差與梯度是什麼關係呢。在第一部分,我們提到了一個叫做平方損失函數的東西,具體形式可以寫成 \frac{1}{2}\sum_{i=1}^{n}({y_{i}- F(x_{i})})^2 ,熟悉其他算法的原理應該知道,這個損失函數主要針對迴歸類型的問題,分類則是用熵值類的損失函數。具體到平方損失函數的式子,它的一階導其實就是殘差的形式,所以基於殘差的GBDT是一種特殊的GBDT模型,它的損失函數是平方損失函數,只能處理迴歸類的問題。具體形式可以如下表示:

損失函數:L(y,F(x)) = \frac{1}{2}(y-F(X))^{2}

所以我們想最小化J = \frac{1}{2}\sum_{0}^{n}{}(y_{i}-F(x_{i}))^{2}

損失函數的一階導:\frac{\partial J}{\partial F({x}) }=\frac{\partial \sum_{i=1}^{n}(L(y_{i},F(x_{i})))}{\partial F({x_{i}}) }= \frac{\partial L(y_{i},F(x_{i}))}{\partial F({x_{i}}) }=F(x_{i})-y_{i}

 

正好殘差就是負梯度:-\frac{\partial J}{\partial F({x_{i}}) }=y_{i} - F(x_{i})

1.1爲什麼基於殘差的GBDT不是一個好的選擇

首先基於殘差的GBDT只能處理迴歸類的問題,不能處理分類問題,這是損失函數所限制的,所以更一般化的GBDT是基於梯度的算法,這也就意味着只要給出的損失函數是可導的,那麼就能用GBDT的思想去解決問題。具體解決的問題就不會僅僅限於迴歸了。

另外,基於殘差的GBDT在解決迴歸問題上也不算是一個好的選擇,一個比較明顯的缺點就是對異常值過於敏感。來看一個例子(注:這個和本文要介紹的內容關係不是很大,只是在這個位置涉及到了,舉個例子說明下損失函數的優劣對比,證明下基於殘差的GBDT不是最好的選擇。爲啥是殘差,其根源是損失函數選擇了平方損失函數):

很明顯後續的模型會對第4個值關注過多,這不是一種好的現象,所以一般迴歸類的損失函數會用絕對損失或者huber損失函數來代替平方損失函數:


以上從迴歸的角度,以特例的方式初步對GBDT進行了解釋(平方損失函數)。接下從迴歸的角度進一步深入解釋,得到通用的GBDT(負梯度)


2、迴歸的角度——深入:

2.1、GBDT的負梯度擬合

GBDT也是集成學習Boosting家族的成員,但是卻和傳統的Adaboost有很大的不同。回顧下Adaboost,我們是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪輪的迭代下去。GBDT也是迭代,使用了前向分佈算法,但是弱學習器限定了只能使用CART迴歸樹模型,同時迭代思路和Adaboost也有所不同。在GBDT的迭代中,假設我們前一輪迭代得到的強學習器是f_{t-1}(x), 損失函數是L(y,{f_{t-1}(x)}), 本輪迭代的目標是找到一個CART迴歸樹模型的弱學習器h_{t}(x),讓本輪的損失函數L(y, f_{t}(x)) = L(y,{f_{t-1}(x)+h_{t}(x)})最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失儘量變得更小。從上面的例子看這個思想還是蠻簡單的,但是有個問題是這個損失的擬合不好度量,損失函數各種各樣,怎麼找到一種通用的擬合方法呢?

上一段中介紹了GBDT的基本思路,但是沒有解決損失函數擬合方法的問題?。針對這個問題,大牛Freidman提出了用損失函數的負梯度來擬合本輪損失的近似值,進而擬合一個CART迴歸樹。第t輪的第i個樣本的損失函數的負梯度表示爲

{r_{ti}}=-[\frac{\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}]_{f(x)=f_{t-1}(x)}

利用(x_{i},r_{ti}) (i=1,2,...,n),可以擬合一顆CART迴歸樹,得到的第t棵迴歸樹,其對應的葉節點區域{R_{tj}}, j=1,2,...,J。其中J爲葉子節點的個數。針對每一個葉子節點裏的樣本,求出使損失函數最小,也就是擬合葉子節點最好的的輸出值c_{tj}如下(注:這裏的c代表的是未知變量,其求得的使損失函數L最小的值是c_{tj}):

                                                           c_{tj} = argmin\sum_{x_{i}\epsilon {R_{tj}}}{L(y_{i},f_{t-1}(x_{i})}+c)

這樣就得到了本輪的決策樹擬合函數如下:

                                                                             h_{t}(x)= \sum_{j=1}^{J}c_{tj}I(x\epsilon {R_{tj}})

經過本輪(第 t 輪)學習後得到的強學習器的表達式如下:

                                                                   f_{t}(x)= f_{t-1}(x) + \sum_{j=1}^{J}c_{tj}I(x\epsilon {R_{tj}})

通過損失函數的負梯度來擬合,找到了一種通用的擬合損失誤差的辦法,這樣無輪是分類問題還是迴歸問題,通過其損失函數的負梯度的擬合,就可以用GBDT來解決分類和迴歸問題。區別僅僅在於損失函數不同導致的負梯度不同而已。

2.2、GBDT迴歸算法

    基於上面的思路,下面總結下GBDT的迴歸算法。爲什麼沒有加上分類算法一起?因爲分類算法的輸出是不連續的類別值,需要一些處理才能使用負梯度(定義損失函數時處理,我認爲沒啥區別,其本質是損失函數的設計,因爲分類問題不能一步步擬合“殘差”,以LR的對數似然函數作爲損失函數來擬合“殘差”,其本質是用類別的預測概率值來擬合正確的概率值),下一節講。輸入是訓練集樣本D={(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{n},y_{n})}, 最大迭代次數T, 損失函數L

輸出是強學習器f(x)

    1) 初始化弱學習器(這裏初始化一個c的值,通常爲所有樣本點的平均值)

                                               f_{0}(x)=argmin\sum_{i=1}^{n}L(y_{i},c)

    2) 對迭代輪數 t=1,2,...,T 有:

      a)對樣本 i=1,2,...,n,計算負梯度

                                           {r_{ti}}=-[\frac{\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}]_{f(x)=f_{t-1}(x)}

      b)利用(x_{i},r_{ti}) (i=1,2,...,n),擬合一顆CART迴歸樹,得到第 t 顆迴歸樹,其對應的葉子節點區域爲R_{tj}, j=1,2,...,J。其中J爲迴歸樹 t 的葉子節點的個數。

      c) 對葉子區域j =1,2,3,...,J,計算最佳擬合值

                                        c_{tj} = argmin\sum_{x_{i}\epsilon {R_{tj}}}{L(y_{i},f_{t-1}(x_{i})}+c)

      d) 更新強學習器

                                           f_{t}(x)= f_{t-1}(x) + \sum_{j=1}^{J}c_{tj}I(x\epsilon {R_{tj}})

    3) 得到強學習器f(x)的表達式

                                     f(x)=f_{T}(x)=f_{0}(x)+\sum_{t=1}^{T}\sum_{j=1}^{J}{c_{tj}}I(x\epsilon {R_{tj}})

3、分類的角度:

3.1、GBDT分類算法

    接着再看看GBDT分類算法,GBDT的分類算法從思想上和GBDT的迴歸算法沒有區別,但是由於樣本輸出不是連續的值,而是離散的類別,導致無法直接從輸出類別去擬合類別輸出的誤差。爲了解決這個問題,主要有兩個方法,一個是用指數損失函數,此時GBDT退化爲Adaboost算法。另一種方法是用類似於邏輯迴歸的對數似然損失函數的方法。也就是說,用的是類別的預測概率值和真實概率值的差來擬合損失。接下來討論用對數似然損失函數的GBDT。而對於對數似然損失函數,又有二元分類和多元分類的區別。

3.2 二元GBDT分類算法

對於二元GBDT,如果用類似於邏輯迴歸的對數似然損失函數,則損失函數爲:

                                                L(y,f(x))=log(1 + exp(-yf(x)))

其中y\epsilon\left \{ \right -1,+1\}。則此時的負梯度誤差爲

                                r_{ti}= -[\frac{\partial L(y,f(x))}{\partial f(x)}]_{f(x)=f_{t-1}(x)}=\frac{y_{i}}{1+exp(y_{i}f(x_{i})))}

對於生成的決策樹,各個葉子節點的最佳殘差擬合值爲

                                  c_{tj}=argmin\sum_{x_{i}\epsilon R_{tj}}(log(1+exp(y_{i}f_{t-1}(x_{i}+c))))

由於上式比較難優化,一般使用近似值代替

                                                  c_{tj}=\frac{\sum_{x_{i\epsilon R_{tj}}}^{ }r_{ti}}{\sum_{x_{i\epsilon R_{tj}}}^{ }|r_{ti}|*(1-|r_{ti}|)}

除了負梯度計算和葉子節點的最佳殘差擬合的線性搜索,二元GBDT分類和GBDT迴歸算法過程相同?

3.3、多元GBDT分類算法

  參見:https://www.cnblogs.com/pinard/p/6140514.html

4、GBDT常用損失函數

對於分類算法,其損失函數一般有對數損失函數和指數損失函數兩種:

    a) 如果是指數損失函數,則損失函數表達式爲

                                                                              L(y,f(x)) = exp(-yf(x))

    其負梯度計算和葉子節點的最佳殘差擬合參見Adaboost原理篇

    b) 如果是對數損失函數,分爲二元分類和多元分類兩種,參見3.1節和3.2節。 

對於迴歸算法,常用損失函數有如下4種:

    a)均方差,這個是最常見的迴歸損失函數

                                                                             L(y,f(x))=(y-f(x))^2

    b)絕對損失,這個損失函數也很常見

                                                                              L(y,f(x))=|y-f(x)|

                    對應負梯度誤差爲:

                                                                                   sign(y_{i}-f(x_{i}))

    c)Huber損失,它是均方差和絕對損失的折衷產物,對於遠離中心的異常點,採用絕對損失,而中心附近的點採用均方差。這個界限一般用分位數點度量。損失函數如下:

                                              

    對應的負梯度誤差爲:

                                                  

    d) 分位數損失。它對應的是分位數迴歸的損失函數,表達式爲

                                             

      其中θθ爲分位數,需要我們在迴歸前指定。對應的負梯度誤差爲:

                                                        

    對於Huber損失和分位數損失,主要用於健壯迴歸,也就是減少異常點對損失函數的影響。

5. GBDT的正則化

和Adaboost一樣,也需要對GBDT進行正則化,防止過擬合。GBDT的正則化主要有三種方式。

第一種是和Adaboost類似的正則化項,即步長(learning rate)。定義爲νν,對於前面的弱學習器的迭代

                                                                           f_{t}(x) = f_{t-1}(x)+h_{t}(x)

如果加上了正則化項(v的取值範圍爲00< v\leq 1。對於同樣的訓練集學習效果,較小的v意味着需要更多的弱學習器的迭代次數。通常用步長和迭代最大次數一起來決定算法的擬合效果。),則有:

                                                                        f_{t}(x) = f_{t-1}(x)+v*h_{t}(x)

第二種正則化的方式是通過子採樣比例(subsample)。取值爲(0,1]。注意這裏的子採樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這裏是不放回抽樣。如果取值爲1,則全部樣本都使用,等於沒有使用子採樣。如果取值小於1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間。使用了子採樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由於使用了子採樣,程序可以通過採樣分發到不同的任務去做boosting的迭代過程,最後形成新樹,從而減少弱學習器難以並行學習的弱點(不理解!不是還是要串行的訓練?)。

第三種是對於弱學習器即CART迴歸樹進行正則化剪枝。

6、其他:

1、GBDT有很多簡稱,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其實都是指的同一種算法,本文統一簡稱GBDT。GBDT在BAT大廠中也有廣泛的應用。

7、參考文獻:

1、https://zhuanlan.zhihu.com/p/29765582

2、https://www.cnblogs.com/pinard/p/6140514.html(主要複製自這篇blog)

8、遺留問題

1、GBDT用於多分類的公式推導。

2、正則化的第二種,不甚理解。

3、損失函數選擇爲指數函數,退化爲Adaboost?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章