在集成學習值Adaboost算法原理和代碼小結(轉載)中,咱們對Boosting家族的Adaboost算法作了總結,本文就對Boosting家族中另外一個重要的算法梯度提高樹(Gradient Boosting Decison Tree, 如下簡稱GBDT)作一個總結。GBDT有不少簡稱,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其實都是指的同一種算法,本文統一簡稱GBDT。GBDT在BAT大廠中也有普遍的應用,假如要選擇3個最重要的機器學習算法的話,我的認爲GBDT應該佔一席之地。html
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的思想能夠用一個通俗的例子解釋,假若有我的30歲,咱們首先用20歲去擬合,發現損失有10歲,這時咱們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪咱們用3歲擬合剩下的差距,差距就只有一歲了。若是咱們的迭代輪數尚未完,能夠繼續迭代下面,每一輪迭代,擬合的歲數偏差都會減少。函數
從上面的例子看這個思想仍是蠻簡單的,可是有個問題是這個損失的擬合很差度量,損失函數各類各樣,怎麼找到一種通用的擬合方法呢?性能
咱們已經介紹了GBDT的基本思路,可是沒有解決損失函數擬合方法的問題。針對這個問題,大牛Freidman提出了用損失函數的負梯度來擬合本輪損失的近似值,進而擬合一個CART迴歸樹。第t輪的第i個樣本的損失函數的負梯度表示爲:$$r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)}$$利用$(x_i,r_{ti})\;\; (i=1,2,..m)$,咱們能夠擬合一顆CART迴歸樹,獲得了第t顆迴歸樹,其對應的葉節點區域$R_{tj}, j =1,2,..., J$。其中J爲葉子節點的個數。學習
針對每個葉子節點裏的樣本,咱們求出使損失函數最小,也就是擬合葉子節點最好的的輸出值$c_{tj}$以下:$$c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c_t)$$這樣咱們就獲得了本輪的決策樹擬合函數以下:$$h_t(x) = \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})$$優化
從而本輪最終獲得的強學習器的表達式以下:$$f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj}) $$經過損失函數的負梯度來擬合,咱們找到了一種通用的擬合損失偏差的辦法,這樣無輪是分類問題仍是迴歸問題,咱們經過其損失函數的負梯度的擬合,就能夠用GBDT來解決咱們的分類迴歸問題。區別僅僅在於損失函數不一樣致使的負梯度不一樣而已。spa
好了,有了上面的思路,下面咱們總結下GBDT的迴歸算法。爲何沒有加上分類算法一塊兒?那是由於分類算法的輸出是不連續的類別值,須要一些處理才能使用負梯度,咱們在後面講。htm
輸入:訓練集樣本$T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}$, 最大迭代次數T, 損失函數L。blog
輸出:強學習器f(x)
a)對樣本i=1,2,...m,計算負梯度:$$r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)}$$
b)利用$(x_i,r_{ti})\;\; (i=1,2,..m)$, 擬合一顆CART迴歸樹,獲得第t顆迴歸樹,其對應的葉子節點區域爲$R_{tj}, j =1,2,..., J$。其中J爲迴歸樹t的葉子節點的個數。
c) 對葉子區域j =1,2,..J,計算最佳擬合值:$$c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c)$$
d) 更新強學習器:$$f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj}) $$
3.獲得強學習器f(x)的表達式:$$f(x) = f_T(x) =f_0(x) + \sum\limits_{t=1}^{T}\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})$$
這裏咱們再看看GBDT分類算法,GBDT的分類算法從思想上和GBDT的迴歸算法沒有區別,可是因爲樣本輸出不是連續的值,而是離散的類別,致使咱們沒法直接從輸出類別去擬合類別輸出的偏差。
爲了解決這個問題,主要有兩個方法,一個是用指數損失函數,此時GBDT退化爲Adaboost算法。另外一種方法是用相似於邏輯迴歸的對數似然損失函數的方法。也就是說,咱們用的是類別的預測機率值和真實機率值的差來擬合損失。本文僅討論用對數似然損失函數的GBDT分類。而對於對數似然損失函數,咱們又有二元分類和多元分類的區別。
對於二元GBDT,若是用相似於邏輯迴歸的對數似然損失函數,則損失函數爲:$$L(y, f(x)) = log(1+ exp(-yf(x)))$$
其中$y \in\{-1, +1\}$。則此時的負梯度偏差爲:$$r_{ti} = -\bigg[\frac{\partial L(y, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} = y_i/(1+exp(y_if(x_i)))$$
對於生成的決策樹,咱們各個葉子節點的最佳殘差擬合值爲:$$c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} log(1+exp(-y_i(f_{t-1}(x_i) +c)))$$
因爲上式比較難優化,咱們通常使用近似值代替:$$c_{tj} = \sum\limits_{x_i \in R_{tj}}r_{ti}\bigg / \sum\limits_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|)$$
除了負梯度計算和葉子節點的最佳殘差擬合的線性搜索,二元GBDT分類和GBDT迴歸算法過程相同。
多元GBDT要比二元GBDT複雜一些,對應的是多元邏輯迴歸和二元邏輯迴歸的複雜度差異。假設類別數爲K,則此時咱們的對數似然損失函數爲:$$L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x) $$
其中若是樣本輸出類別爲k,則$y_k=1$。第k類的機率$p_k(x) $的表達式爲:$$p_k(x) = exp(f_k(x)) \bigg / \sum\limits_{l=1}^{K} exp(f_l(x)) $$
集合上兩式,咱們能夠計算出第$t$輪的第$i$個樣本對應類別$l$的負梯度偏差爲:$$r_{til} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f_k(x) = f_{l, t-1}\;\; (x)} = y_{il} - p_{l, t-1}(x_i)$$
觀察上式能夠看出,其實這裏的偏差就是樣本$i$對應類別$l$的真實機率和$t-1$輪預測機率的差值。
對於生成的決策樹,咱們各個葉子節點的最佳殘差擬合值爲:$$c_{tjl} = \underbrace{arg\; min}_{c_{jl}}\sum\limits_{i=0}^{m}\sum\limits_{k=1}^{K} L(y_k, f_{t-1, l}(x) + \sum\limits_{j=0}^{J}c_{jl} I(x_i \in R_{tj}))$$
因爲上式比較難優化,咱們通常使用近似值代替:$$c_{tjl} = \frac{K-1}{K} \; \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)}$$
除了負梯度計算和葉子節點的最佳殘差擬合的線性搜索,多元GBDT分類和二元GBDT分類以及GBDT迴歸算法過程相同。
這裏咱們再對經常使用的GBDT損失函數作一個總結。
對於分類算法,其損失函數通常有對數損失函數和指數損失函數兩種:
對於迴歸算法,經常使用損失函數有以下4種:
和Adaboost同樣,咱們也須要對GBDT進行正則化,防止過擬合。GBDT的正則化主要有三種方式。
GBDT終於講完了,GDBT自己並不複雜,不過要吃透的話須要對集成學習的原理,決策樹原理和各類損失函樹有必定的瞭解。因爲GBDT的卓越性能,只要是研究機器學習都應該掌握這個算法,包括背後的原理和應用調參方法。目前GBDT的算法比較好的庫是xgboost。固然scikit-learn也能夠。
最後總結下GBDT的優缺點。
GBDT主要的優勢有:
GBDT的主要缺點有:
參考文章:
[2]GBDT原理詳解
[3]統計學習方法.李航