梯度提升树(GBDT)原理小结
在集成學習之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應該占一席之地。
1. GBDT概述
GBDT也是集成學習Boosting家族的成員,但是卻和傳統的Adaboost有很大的不同?;仡櫹翧daboost,我們是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪輪的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱學習器限定了只能使用CART回歸樹模型,同時迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假設我們前一輪迭代得到的強學習器是ft?1(x)ft?1(x), 損失函數是L(y,ft?1(x))L(y,ft?1(x)), 我們本輪迭代的目標是找到一個CART回歸樹模型的弱學習器ht(x)ht(x),讓本輪的損失函數L(y,ft(x)=L(y,ft?1(x)+ht(x))L(y,ft(x)=L(y,ft?1(x)+ht(x))最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失盡量變得更小。
GBDT的思想可以用一個通俗的例子解釋,假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。
從上面的例子看這個思想還是蠻簡單的,但是有個問題是這個損失的擬合不好度量,損失函數各種各樣,怎么找到一種通用的擬合方法呢?
2. GBDT的負梯度擬合
在上一節中,我們介紹了GBDT的基本思路,但是沒有解決損失函數擬合方法的問題。針對這個問題,大牛Freidman提出了用損失函數的負梯度來擬合本輪損失的近似值,進而擬合一個CART回歸樹。第t輪的第i個樣本的損失函數的負梯度表示為
rti=?[?L(yi,f(xi)))?f(xi)]f(x)=ft?1(x)rti=?[?L(yi,f(xi)))?f(xi)]f(x)=ft?1(x)
利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m),我們可以擬合一顆CART回歸樹,得到了第t顆回歸樹,其對應的葉節點區域Rtj,j=1,2,...,JRtj,j=1,2,...,J。其中J為葉子節點的個數。
針對每一個葉子節點里的樣本,我們求出使損失函數最小,也就是擬合葉子節點最好的的輸出值ctjctj如下:
ctj=argminc∑xi∈RtjL(yi,ft?1(xi)+c)ctj=argmin?c∑xi∈RtjL(yi,ft?1(xi)+c)
這樣我們就得到了本輪的決策樹擬合函數如下:
ht(x)=∑j=1JctjI(x∈Rtj)ht(x)=∑j=1JctjI(x∈Rtj)
從而本輪最終得到的強學習器的表達式如下:
ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)
通過損失函數的負梯度來擬合,我們找到了一種通用的擬合損失誤差的辦法,這樣無輪是分類問題還是回歸問題,我們通過其損失函數的負梯度的擬合,就可以用GBDT來解決我們的分類回歸問題。區別僅僅在于損失函數不同導致的負梯度不同而已。
?3.?GBDT回歸算法
好了,有了上面的思路,下面我們總結下GBDT的回歸算法。為什么沒有加上分類算法一起?那是因為分類算法的輸出是不連續的類別值,需要一些處理才能使用負梯度,我們在下一節講。
輸入是訓練集樣本T={(x,y1),(x2,y2),...(xm,ym)}T={(x,y1),(x2,y2),...(xm,ym)}, 最大迭代次數T, 損失函數L。
輸出是強學習器f(x)
1) 初始化弱學習器
f0(x)=argminc∑i=1mL(yi,c)f0(x)=argmin?c∑i=1mL(yi,c)
2) 對迭代輪數t=1,2,...T有:
a)對樣本i=1,2,...m,計算負梯度
rti=?[?L(yi,f(xi)))?f(xi)]f(x)=ft?1(x)rti=?[?L(yi,f(xi)))?f(xi)]f(x)=ft?1(x)
b)利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m), 擬合一顆CART回歸樹,得到第t顆回歸樹,其對應的葉子節點區域為Rtj,j=1,2,...,JRtj,j=1,2,...,J。其中J為回歸樹t的葉子節點的個數。
c) 對葉子區域j =1,2,..J,計算最佳擬合值
ctj=argminc∑xi∈RtjL(yi,ft?1(xi)+c)ctj=argmin?c∑xi∈RtjL(yi,ft?1(xi)+c)
d) 更新強學習器
ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)
3) 得到強學習器f(x)的表達式
f(x)=fT(x)=f0(x)+∑t=1T∑j=1JctjI(x∈Rtj)f(x)=fT(x)=f0(x)+∑t=1T∑j=1JctjI(x∈Rtj)
4. GBDT分類算法
這里我們再看看GBDT分類算法,GBDT的分類算法從思想上和GBDT的回歸算法沒有區別,但是由于樣本輸出不是連續的值,而是離散的類別,導致我們無法直接從輸出類別去擬合類別輸出的誤差。
為了解決這個問題,主要有兩個方法,一個是用指數損失函數,此時GBDT退化為Adaboost算法。另一種方法是用類似于邏輯回歸的對數似然損失函數的方法。也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失。本文僅討論用對數似然損失函數的GBDT分類。而對于對數似然損失函數,我們又有二元分類和多元分類的區別。
4.1 二元GBDT分類算法
對于二元GBDT,如果用類似于邏輯回歸的對數似然損失函數,則損失函數為:
L(y,f(x))=log(1+exp(?yf(x)))L(y,f(x))=log(1+exp(?yf(x)))
其中y∈{?1,+1}y∈{?1,+1}。則此時的負梯度誤差為
rti=?[?L(y,f(xi)))?f(xi)]f(x)=ft?1(x)=yi/(1+exp(yif(xi)))rti=?[?L(y,f(xi)))?f(xi)]f(x)=ft?1(x)=yi/(1+exp(yif(xi)))
對于生成的決策樹,我們各個葉子節點的最佳負梯度擬合值為
ctj=argminc∑xi∈Rtjlog(1+exp(?yi(ft?1(xi)+c)))ctj=argmin?c∑xi∈Rtjlog(1+exp(?yi(ft?1(xi)+c)))
由于上式比較難優化,我們一般使用近似值代替
ctj=∑xi∈Rtjrti/∑xi∈Rtj|rti|(1?|rti|)ctj=∑xi∈Rtjrti/∑xi∈Rtj|rti|(1?|rti|)
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,二元GBDT分類和GBDT回歸算法過程相同。
4.2 多元GBDT分類算法
多元GBDT要比二元GBDT復雜一些,對應的是多元邏輯回歸和二元邏輯回歸的復雜度差別。假設類別數為K,則此時我們的對數似然損失函數為:
L(y,f(x))=?∑k=1Kyklogpk(x)L(y,f(x))=?∑k=1Kyklogpk(x)
其中如果樣本輸出類別為k,則yk=1yk=1。第k類的概率pk(x)pk(x)的表達式為:
pk(x)=exp(fk(x))/∑l=1Kexp(fl(x))pk(x)=exp(fk(x))/∑l=1Kexp(fl(x))
集合上兩式,我們可以計算出第tt輪的第ii個樣本對應類別ll的負梯度誤差為
rtil=?[?L(yi,f(xi)))?f(xi)]fk(x)=fl,t?1(x)=yil?pl,t?1(xi)rtil=?[?L(yi,f(xi)))?f(xi)]fk(x)=fl,t?1(x)=yil?pl,t?1(xi)
觀察上式可以看出,其實這里的誤差就是樣本ii對應類別ll的真實概率和t?1t?1輪預測概率的差值。
對于生成的決策樹,我們各個葉子節點的最佳負梯度擬合值為
ctjl=argmincjl∑i=0m∑k=1KL(yk,ft?1,l(x)+∑j=0JcjlI(xi∈Rtjl))ctjl=argmin?cjl∑i=0m∑k=1KL(yk,ft?1,l(x)+∑j=0JcjlI(xi∈Rtjl))
由于上式比較難優化,我們一般使用近似值代替
ctjl=K?1K∑xi∈Rtjlrtil∑xi∈Rtil|rtil|(1?|rtil|)ctjl=K?1K∑xi∈Rtjlrtil∑xi∈Rtil|rtil|(1?|rtil|)
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,多元GBDT分類和二元GBDT分類以及GBDT回歸算法過程相同。
5. GBDT常用損失函數
這里我們再對常用的GBDT損失函數做一個總結。
對于分類算法,其損失函數一般有對數損失函數和指數損失函數兩種:
a) 如果是指數損失函數,則損失函數表達式為
L(y,f(x))=exp(?yf(x))L(y,f(x))=exp(?yf(x))
其負梯度計算和葉子節點的最佳負梯度擬合參見Adaboost原理篇。
b)?如果是對數損失函數,分為二元分類和多元分類兩種,參見4.1節和4.2節。
對于回歸算法,常用損失函數有如下4種:
a)均方差,這個是最常見的回歸損失函數了
L(y,f(x))=(y?f(x))2L(y,f(x))=(y?f(x))2
b)絕對損失,這個損失函數也很常見
L(y,f(x))=|y?f(x)|L(y,f(x))=|y?f(x)|
對應負梯度誤差為:
sign(yi?f(xi))sign(yi?f(xi))
c)Huber損失,它是均方差和絕對損失的折衷產物,對于遠離中心的異常點,采用絕對損失,而中心附近的點采用均方差。這個界限一般用分位數點度量。損失函數如下:
?
L(y,f(x))={12(y?f(x))2δ(|y?f(x)|?δ2)|y?f(x)|≤δ|y?f(x)|>δL(y,f(x))={12(y?f(x))2|y?f(x)|≤δδ(|y?f(x)|?δ2)|y?f(x)|>δ
對應的負梯度誤差為:
?
r(yi,f(xi))={yi?f(xi)δsign(yi?f(xi))|yi?f(xi)|≤δ|yi?f(xi)|>δr(yi,f(xi))={yi?f(xi)|yi?f(xi)|≤δδsign(yi?f(xi))|yi?f(xi)|>δ
d) 分位數損失。它對應的是分位數回歸的損失函數,表達式為
L(y,f(x))=∑y≥f(x)θ|y?f(x)|+∑y<f(x)(1?θ)|y?f(x)|L(y,f(x))=∑y≥f(x)θ|y?f(x)|+∑y<f(x)(1?θ)|y?f(x)|
其中θθ為分位數,需要我們在回歸前指定。對應的負梯度誤差為:
?
r(yi,f(xi))={θθ?1yi≥f(xi)yi<f(xi)r(yi,f(xi))={θyi≥f(xi)θ?1yi<f(xi)
對于Huber損失和分位數損失,主要用于健壯回歸,也就是減少異常點對損失函數的影響。
6. GBDT的正則化
和Adaboost一樣,我們也需要對GBDT進行正則化,防止過擬合。GBDT的正則化主要有三種方式。
第一種是和Adaboost類似的正則化項,即步長(learning rate)。定義為νν,對于前面的弱學習器的迭代
fk(x)=fk?1(x)+hk(x)fk(x)=fk?1(x)+hk(x)
如果我們加上了正則化項,則有
fk(x)=fk?1(x)+νhk(x)fk(x)=fk?1(x)+νhk(x)
νν的取值范圍為0<ν≤10<ν≤1。對于同樣的訓練集學習效果,較小的νν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。
?
第二種正則化的方式是通過子采樣比例(subsample)。取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間。
使用了子采樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采樣,程序可以通過采樣分發到不同的任務去做boosting的迭代過程,最后形成新樹,從而減少弱學習器難以并行學習的弱點。
?
第三種是對于弱學習器即CART回歸樹進行正則化剪枝。在決策樹原理篇里我們已經講過,這里就不重復了。
7. GBDT小結
GBDT終于講完了,GDBT本身并不復雜,不過要吃透的話需要對集成學習的原理,決策樹原理和各種損失函樹有一定的了解。由于GBDT的卓越性能,只要是研究機器學習都應該掌握這個算法,包括背后的原理和應用調參方法。目前GBDT的算法比較好的庫是xgboost。當然scikit-learn也可以。
最后總結下GBDT的優缺點。
GBDT主要的優點有:
1) 可以靈活處理各種類型的數據,包括連續值和離散值。
2) 在相對少的調參時間情況下,預測的準確率也可以比較高。這個是相對SVM來說的。
3)使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。
GBDT的主要缺點有:
1)由于弱學習器之間存在依賴關系,難以并行訓練數據。不過可以通過自采樣的SGBT來達到部分并行。
?
以上就是GBDT的原理總結,后面會講GBDT的scikit-learn調參,敬請期待。
來源:https://www.cnblogs.com/pinard/p/6140514.html
總結
以上是生活随笔為你收集整理的梯度提升树(GBDT)原理小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度从俄罗斯进口石油的优缺点,印度从俄罗
- 下一篇: boosting家族之综合理论篇