Task2 GBDT算法梳理

【Task2 GBDT算法梳理】

一、簡介:

GBDT有很多簡稱,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其實都是指的同一種算法,本文統一簡稱GBDT。

GBDT也是集成學習Boosting家族的成員,但是卻和傳統的Adaboost有很大的不同。回顧下Adaboost,我們是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪輪的迭代下去。GBDT也是迭代,使用了前向分佈算法,但是弱學習器限定了只能使用CART迴歸樹模型,同時迭代思路和Adaboost也有所不同。

在GBDT的迭代中,假設我們前一輪迭代得到的強學習器是, 損失函數是, 我們本輪迭代的目標是找到一個CART迴歸樹模型的弱學習器,讓本輪的損失函數最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失儘量變得更小。

 

 

  • 前向分佈算法

在Adaboost算法中,我們的最終目的是通過構建弱分類器的線性組合:

來得到最終分類器。

而我們在看看加法模型

            

其中,爲基函數,是基函數的參數,爲基函數的係數。

顯然式8.6是一個加法模型。

對於加法模型,在給定訓練數據及損失函數L(y, f(x))的條件下,學習加法模型f(x)就成爲經驗風險極小化損失函數極小化問題

但這是一個複雜的優化問題。

前向分佈算法(forward stagewise algorithm)求解這一優化問題的想法是:

因爲學習的是加法模型,那如果能夠從前向後,每一步只學習一個基函數及其係數,然後逐步逼近優化目標式8.14,那麼就可以簡化優化的複雜度。

具體的,每步只需優化如下損失函數:

於是,前向分佈算法總結如下:

輸入:

訓練數據集T ={(x1,y1), (x2, y2), ..., (xN, yN)};損失函數L(y, f(x));基函數集{b(x; r)};

輸出:

加法模型f(x)

解:

1,初始化f0(x)= 0

2,對m = 1, 2,.., M

a,極小化損失函數

得到參數βm, rm

b,更新

 

3,得到加法模型

這樣,前向分佈算法將同時求解從m=1到M的所有參數βm, 的優化問題簡化爲逐次求解各個βm, 的優化問題。

 

  • 負梯度擬合

針對這個問題,大牛Freidman提出了用損失函數的負梯度來擬合本輪損失的近似值,進而擬合一個CART迴歸樹。

第t輪的第i個樣本的損失函數的負梯度表示爲

利用,我們可以擬合一顆CART迴歸樹,得到了第t顆迴歸樹,其對應的葉節點區域。其中J爲葉子節點的個數。

針對每一個葉子節點裏的樣本,我們求出使損失函數最小,也就是擬合葉子節點最好的的輸出值如下:

  

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

  

  從而本輪最終得到的強學習器的表達式如下:

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

 

四、損失函數

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

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

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

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

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

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

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

  對應負梯度誤差爲:

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

對應的負梯度誤差爲:

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

    

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

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

 

五、迴歸

輸入是訓練集樣本, 最大迭代次數T, 損失函數L。

輸出是強學習器f(x)

1) 初始化弱學習器

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

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

       b)利用, 擬合一顆CART迴歸樹,得到第t顆迴歸樹,其對應的葉子節點區域爲。其中J爲迴歸樹t的葉子節點的個數。

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

d) 更新強學習器

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

六、二分類,多分類

這裏我們再看看GBDT分類算法,GBDT的分類算法從思想上和GBDT的迴歸算法沒有區別,但是由於樣本輸出不是連續的值,而是離散的類別,導致我們無法直接從輸出類別去擬合類別輸出的誤差

爲了解決這個問題,主要有兩個方法,一個是用指數損失函數,此時GBDT退化爲Adaboost算法。另一種方法是用類似於邏輯迴歸的對數似然損失函數的方法。也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失。

本文僅討論用對數似然損失函數的GBDT分類。而對於對數似然損失函數,我們又有二元分類和多元分類的區別。

6.1 二元GBDT分類算法

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

其中。則此時的負梯度誤差爲

對於生成的決策樹,我們各個葉子節點的最佳負梯度擬合值爲

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

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

 

4.2 多元GBDT分類算法

多元GBDT要比二元GBDT複雜一些,對應的是多元邏輯迴歸和二元邏輯迴歸的複雜度差別。假設類別數爲K,則此時我們的對數似然損失函數爲:

其中如果樣本輸出類別爲k,則。第k類的概率的表達式爲:

集合上兩式,我們可以計算出第tt輪的第ii個樣本對應類別ll的負梯度誤差爲

觀察上式可以看出,其實這裏的誤差就是樣本i對應類別l的真實概率和t−1輪預測概率的差值。

對於生成的決策樹,我們各個葉子節點的最佳負梯度擬合值爲

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

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

 

七、正則化

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

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

  如果我們加上了正則化項,則有

ν的取值範圍爲0<ν≤1。對於同樣的訓練集學習效果,較小的ν意味着我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。

第二種正則化的方式是通過子採樣比例(subsample)。取值爲(0,1]。注意這裏的子採樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這裏是不放回抽樣。如果取值爲1,則全部樣本都使用,等於沒有使用子採樣。如果取值小於1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間

使用了子採樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由於使用了子採樣,程序可以通過採樣分發到不同的任務去做boosting的迭代過程,最後形成新樹,從而減少弱學習器難以並行學習的弱點。

第三種是對於弱學習器即CART迴歸樹進行正則化剪枝。在決策樹原理篇裏我們已經講過,這裏就不重複了。

 

  • 優缺點

8.1、優點:

1) 可以靈活處理各種類型的數據,包括連續值和離散值。

2) 在相對少的調參時間情況下,預測的準確率也可以比較高。這個是相對SVM來說的。

3)使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。

8.2、GBDT的主要缺點:

1)由於弱學習器之間存在依賴關係,難以並行訓練數據。不過可以通過自採樣的SGBT來達到部分並行。

 

  • sklearn參數

官方文檔:

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html

 

十、應用場景

可以用於分類以及迴歸的問題。

 

十一、相關鏈接:

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

 

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