机器学习笔记GBDT(一):原理
目錄
文章目錄
- 目錄
- 前言
- 1. GBDT概述
- 2. GBDT的負梯度擬合
- 3. GBDT回歸算法
- 1) 初始化弱學習器
- 2) 對于迭代輪數t=1,2,...,T有:
- 3) 得到強學習器f(x)的表達式:
- 4. GBDT分類算法
- 4.1 二元GBDT分類算法
- 4.2 多元GBDT分類算法
- 5. GBDT常用損失函數
- 6. GBDT的正則化
- 7. GBDT小結
- GBDT的主要優點有:
- GBDT的主要缺點是:
- 問題一:Adaboost和GBDT的區別是什么?
- 問題二:GBDT如何減少異常點的影響?
前言
機器學習相關內容現在非常流行,為了走得更遠,非常需要我們有一個堅實的基礎,因此,現在,開始好好復習一些經典算法,并做好算法總結。
本文介紹Boosting家族中另一個重要的算法–梯度提升樹(Gradient Boosting Decision Tree,簡稱GBDT)。GBDT有很多簡稱,比如GBT(Gradient Boosting Tree),GTB(Gradient Tree Boosting), GBRT(Gradient Boosting Regression Tree),MART(Multiple Additive Regression Tree),其實都是指的同一種算法,本文統一簡稱GBDT。
1. GBDT概述
GBDT也是集成學習Boosting家族的成員,但是和傳統的Adaboost有很大的不同。回顧一下Adaboost,我們是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪一輪地迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱學習器限定了只能使用CART回歸樹模型,同時迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假設前一輪迭代得到的強學習器是:ft?1(x)f_{t-1}(x)ft?1?(x),損失函數是L(y,ft?1(x))L(y,f_{t-1}(x))L(y,ft?1?(x)),本輪迭代的目標是找到一棵CART回歸樹模型的弱學習器ht(x)h_t(x)ht?(x),讓本輪的損失L(y,ft(x)=L(y,ft?1(x)+ht(x))L(y,ft(x)=L(y,f_{t?1}(x)+h_t(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)r_{ti}=-{\frac{\partial L{(y_i,f(x_i))}}{\partial f(x_i)}}_{f(x)=f_{t-1}(x)}rti?=??f(xi?)?L(yi?,f(xi?))?f(x)=ft?1?(x)?
利用(xi,rti)(i=1,2,..m)(x_i,r_{ti})(i=1,2,..m)(xi?,rti?)(i=1,2,..m),我們可以擬合一棵CART回歸樹,得到第t棵回歸樹,其對應的葉子節點區域Rtj,j=1,2,..,jR_{tj},j=1,2,..,jRtj?,j=1,2,..,j,其中J為葉子節點的個數。
針對每一個葉子節點里的樣本,我們求出使損失函數最小,也就是擬合葉子節點最好的輸出值ctjc_{tj}ctj?,如下所示:
ctj=argminc∑xi∈RtjL(yi,ft?1(xi)+c)c_{tj}=argmin_c \sum_{x_i \in R_{tj} }L(y_i,f_{t-1}(x_i)+c)ctj?=argminc?xi?∈Rtj?∑?L(yi?,ft?1?(xi?)+c)
(注意:這里的c可以理解為用來擬合之前的GBDT個體學習器學習后所剩下的殘差,因此與權重系數無關。比如某個樣本要擬合數字10,之前的幾個GBDT學習器已經擬合到了9.5。那么我們現在要找到一個c,使當前的GBDT包含這個樣本的節點的誤差最小。那么這個值c在考慮節點其它樣本誤差的同時希望能夠盡量地接近0.5,減少誤差。)
這樣就得到了本輪的決策樹擬合函數,如下所示:
ht(x)=∑j=1JctjI(x∈Rtj)h_t(x)=\sum_{j=1}^Jc_{tj}I(x \in R_{tj})ht?(x)=∑j=1J?ctj?I(x∈Rtj?)
從而得到本輪最終的強學習器,表達式如下所示:
ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)f_t(x)=f_{t-1}(x)+\sum_{j=1}^Jc_{tj}I(x \in R_{tj})ft?(x)=ft?1?(x)+∑j=1J?ctj?I(x∈Rtj?)
通過損失函數的負梯度來擬合,找到了一種通用的擬合損失誤差的方法,這樣無輪是分類問題還是回歸問題,我們通過其損失函數的負梯度的擬合,就可以用GBDT來解決我們的分類和回歸問題。區別僅僅在于損失函數不同導致的負梯度不同而已。
3. GBDT回歸算法
接下來,我們總結一下GBDT的回歸算法。
因為,分類算法的輸出是不連續的類別值,需要一些處理才能使用負梯度,我們在下一節講。
輸入是訓練集樣本T=(x1,y1),(x2,y2),(x3,y3),...(xm,ym)T={(x_1,y_1),(x_2,y_2),(x_3,y_3),...(x_m,y_m)}T=(x1?,y1?),(x2?,y2?),(x3?,y3?),...(xm?,ym?),最大迭代次數T,損失函數L。
輸出是強學習器f(x)。
1) 初始化弱學習器
f0(x)=argminc∑i=1mL(yi,c)f_0(x)=argmin_c \sum_{i=1}^mL(y_i,c) f0?(x)=argminc?i=1∑m?L(yi?,c)
2) 對于迭代輪數t=1,2,…,T有:
a) 對于樣本i=1,2,…,m,計算負梯度
rti=??L(yi,f(xi))?f(xi)f(x)=ft?1(x)r_{ti}=-{\frac{\partial L{(y_i,f(x_i))}}{\partial f(x_i)}}_{f(x)=f_{t-1}(x)}rti?=??f(xi?)?L(yi?,f(xi?))?f(x)=ft?1?(x)?
b) 利用(xi,rti)(i=1,2,..m)(x_i,r_{ti})(i=1,2,..m)(xi?,rti?)(i=1,2,..m),我們可以擬合一棵CART回歸樹,得到第t棵回歸樹,其對應的葉子節點區域Rtj,j=1,2,..,jR_{tj},j=1,2,..,jRtj?,j=1,2,..,j,其中J為回歸樹的葉子節點的個數。
c) 對于葉子區域j=1,2,…,J,計算最佳擬合值
ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)f_t(x)=f_{t-1}(x)+\sum_{j=1}^Jc_{tj}I(x \in R_{tj})ft?(x)=ft?1?(x)+∑j=1J?ctj?I(x∈Rtj?)
d) 更新強學習器
ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)f_t(x)=f_{t-1}(x)+\sum_{j=1}^Jc_{tj}I(x \in R_{tj})ft?(x)=ft?1?(x)+∑j=1J?ctj?I(x∈Rtj?)
3) 得到強學習器f(x)的表達式:
f(x)=fT(x)=f0(x)+∑t=1T∑j=1JctjI(x∈Rtj)f(x)=f_T(x)=f_0(x)+\sum_{t=1}^T\sum_{j=1}^Jc_{tj}I(x \in R_{tj})f(x)=fT?(x)=f0?(x)+t=1∑T?j=1∑J?ctj?I(x∈Rtj?)
4. GBDT分類算法
接下來介紹GBDT分類算法,GBDT的分類算法從思想上和GBDT的回歸算法沒有區別,但是由于樣本輸出不是連續的值,而是離散的類別,導致無法直接從輸出類別去擬合類別輸出的誤差。
要解決這個問題有兩種方法,一種是用指數損失函數,此時GBDT退化為Adaboost算法;另一種是使用類似于Logistic回歸的對數似然損失函數的方法。也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失。本文僅討論使用對數似然損失函數的GBDT分類算法。對于對數似然損失函數,又有二元分類和多元分類的區別。
4.1 二元GBDT分類算法
對于二元GBDT,如果使用類似于Logistic回歸的對數似然損失函數,則損失函數為:
L(y,f(x))=log(1+exp(?yf(x)))L(y,f(x))=log(1+exp(-yf(x)))L(y,f(x))=log(1+exp(?yf(x)))
其中y∈{-1,+1}。則此時的負梯度誤差為
rti=??L(yi,f(xi))?f(xi)f(x)=ft?1(x)=yi/(1+exp(yif(xi)))r_{ti}=-{\frac{\partial L{(y_i,f(x_i))}}{\partial f(x_i)}}_{f(x)=f_{t-1}(x)}=y_i/(1+exp(y_if(x_i)))rti?=??f(xi?)?L(yi?,f(xi?))?f(x)=ft?1?(x)?=yi?/(1+exp(yi?f(xi?)))
對于生成的決策樹,各個葉子節點的最佳殘差擬合值為
ctj=argmin∑xi∈Rtjlog(1+exp(?yi(ft?1(xi)+c)))c_{tj}=argmin \sum_{x_i\in R_{tj}}log(1+exp(-y_i(f_{t-1}(x_i)+c)))ctj?=argminxi?∈Rtj?∑?log(1+exp(?yi?(ft?1?(xi?)+c)))
由于上式比較難優化,一般使用近似值代替
ctj=∑xi∈Rijrti/∑xi∈Rtj∣rti∣(1?∣rti∣)c_{tj}=\sum_{x_i \in R_{ij}}r_{ti}/\sum_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|)ctj?=∑xi?∈Rij??rti?/∑xi?∈Rtj??∣rti?∣(1?∣rti?∣)
除了負梯度計算和葉子節點的最佳殘差擬合的線性搜索,二元GBDT分類和GBDT回歸算法過程相同。
4.2 多元GBDT分類算法
多元GBDT要比二元GBDT復雜一些,對應的是多元Logistic回歸和二元Logistic回歸的復雜度差別。假設類別數為K,則此時的對數似然損失函數為:
L(y,f(x))=?∑k=1Kyklogpk(x)L(y,f(x))=-\sum_{k=1}^Ky_klogp_k(x)L(y,f(x))=?∑k=1K?yk?logpk?(x)
如果樣本輸出類別為k,則yk=1y_k=1yk?=1。第k類的概率pk(x)p_k(x)pk?(x)的表達式為:
pk(x)=exp(fk(x))/∑l=1Kexp(fl(x))p_k(x)=exp(f_k(x))/\sum_{l=1}^Kexp(f_l(x))pk?(x)=exp(fk?(x))/∑l=1K?exp(fl?(x))
結合上面兩式,可以計算出第t輪的第i個樣本對應類別lll的負梯度誤差為
rtil=?[?L(yi,f(xi))?f(xi)]fk(x)=fl,t?1,x=yil?pl,t?1(xi)r_{til}=-[\frac{\partial L(y_i,f(x_i))}{ \partial f(x_i)}]_{f_{k}(x)=f_{l,{t-1},x}}=y_{il}-p_{l,t-1}(x_i)rtil?=?[?f(xi?)?L(yi?,f(xi?))?]fk?(x)=fl,t?1,x??=yil??pl,t?1?(xi?)
觀察上式可以看出,其實這里的誤差就是樣本i對應類別lll的真實概率和t-1輪預測概率的差值。
對于生成的決策樹,各個葉子節點的最佳負梯度擬合值為
ctjl=argmin∑i=0m∑k=1KL(yk,ft?1,l(x)+∑j=0JcjlI(xi∈Rtj))c_{tjl}=argmin\sum_{i=0}^m\sum_{k=1}^KL(y_k,f_{t-1,l(x)}+\sum_{j=0}^Jc_{jl}I(x_i \in R_{tj}))ctjl?=argmin∑i=0m?∑k=1K?L(yk?,ft?1,l(x)?+∑j=0J?cjl?I(xi?∈Rtj?))
由于上式比較難優化,一般使用近似值代替
ctjl=K?1K∑xI∈Rtjlrtjl∑xi∈Rtil∣r[til∣(1?∣rtil∣)c_{tjl}=\frac{K-1}{K}\frac{\sum_{x_I \in R_{tjl}}r_{tjl}}{\sum_{x_i \in R_{til}}|r_[til|(1-|r_{til}|)}ctjl?=KK?1?∑xi?∈Rtil??∣r[?til∣(1?∣rtil?∣)∑xI?∈Rtjl??rtjl??
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,多元GBDT分類和二元GBDT分類以及GBDT回歸算法過程相同。
5. GBDT常用損失函數
這里我們再總結一下常用的GBDT損失函數。
對于分類算法,其損失函數一般有對數損失函數和指數損失函數兩種:
a) 如果是指數損失函數,則損失函數表達式為
L(y,f(x))=exp(?yf(x))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))^2L(y,f(x))=(y?f(x))2
b) 絕對損失,這個損失函數也很常見
L(y,f(x))=∣y?f(x)∣L(y,f(x))=|y-f(x)|L(y,f(x))=∣y?f(x)∣
對應負梯度誤差為:
sign(yi?f(xi))sign(y_i-f(x_i))sign(yi??f(xi?))
c) Huber損失,它是均方差和絕對損失的折衷產物,對于遠離中心的異常點,采用絕對損失,而中心附近的點采用均方差。這個界限一般用分位數點度量。損失函數如下:
L(y,f(x))={0.5?(y?f(x))2if∣y?f(x)∣≤δδ(∣y?f(x)∣?0.5?δ)if∣y?f(x)∣>δL(y,f(x))=\begin{cases} 0.5*(y-f(x))^2 &\text{if} |y-f(x)| \leq \delta \\ \delta (|y-f(x)|-0.5*\delta) &\text{if} |y-f(x)| > \delta \end{cases} L(y,f(x))={0.5?(y?f(x))2δ(∣y?f(x)∣?0.5?δ)?if∣y?f(x)∣≤δif∣y?f(x)∣>δ?
對應的負梯度誤差為:
r(yi,f(xi))={yi?f(xi)if∣y?f(x)∣≤δδsign(yi?f(xI))if∣y?f(x)∣>δr(y_i,f(x_i))=\begin{cases} y_i-f(x_i) &\text{if} |y-f(x)| \leq \delta \\ \delta sign(y_i-f(x_I)) &\text{if} |y-f(x)| > \delta \end{cases} r(yi?,f(xi?))={yi??f(xi?)δsign(yi??f(xI?))?if∣y?f(x)∣≤δif∣y?f(x)∣>δ?
d) 分位數損失,它對應的是分位數回歸的損失函數,表達式為:
L(y,f(x))=∑y≥f(x)θ∣y?f(x)∣+∑y<f(x)(1?θ)∣y?f(x)∣L(y,f(x))=\sum_{y \ge f(x)}\theta|y-f(x)|+\sum_{y<f(x)}(1-\theta)|y-f(x)| L(y,f(x))=y≥f(x)∑?θ∣y?f(x)∣+y<f(x)∑?(1?θ)∣y?f(x)∣
其中θ為分位數,需要在回歸前指定,對應的負梯度誤差為:
r(yi,f(xi))={θif?yi≥f(xi)θ?1if?yi<f(xi)r(y_i,f(x_i))=\begin{cases} \theta &\text{if } y_i \geq f(x_i) \\ \theta -1 &\text {if } y_i<f(x_i) \end{cases} r(yi?,f(xi?))={θθ?1?if?yi?≥f(xi?)if?yi?<f(xi?)?
對于Huber損失和分位數損失,主要用于健壯回歸,也就是減少異常點對損失函數的影響。
6. GBDT的正則化
和Adaboost一樣,GBDT也需要進行正則化,防止過擬合。GBDT的正則化主要有三種方式。
1,類似Adaboost的正則化項,即步長(learning rate)。定義為ννν,對前面弱學習器的迭代
fk(x)=fk?1(x)+hk(x)f_k(x)=f_{k-1}(x)+h_k(x)fk?(x)=fk?1?(x)+hk?(x)
如果加上正則化項,則有
fk(x)=fk?1(x)+vhk(x)f_k(x)=f_{k-1}(x)+vh_k(x)fk?(x)=fk?1?(x)+vhk?(x)
ν的取值范圍是0<ν≤1。對于同樣的訓練集學習效果,較小的ν意味著需要更多的弱學習器迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。
2, 按照比例進行子采樣(subsample),使用該子訓練樣本來做模型擬合,取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是有放回抽樣,而這里使用的是無放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低,推薦在[0.5, 0.8]之間。
使用了子采樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采樣,程序可以通過采樣分發到不同的任務去做boosting的迭代過程,最后形成新樹,從而減少弱學習器難以并行學習的弱點。GBDT的并行以及后來出現的xgBoost的并行主要是針對單棵樹特征處理和選擇的并行(特征排序),以及在模型完成后進行預測時的并行。
3) 對于弱學習器即CART回歸樹進行正則化剪枝。
7. GBDT小結
GDBT本身并不復雜,不過要吃透的話需要對集成學習的原理,決策樹原理和各種損失函數有一定的了解。由于GBDT的卓越性能,只要是研究機器學習都應該掌握這個算法,包括背后的原理和應用調參方法。目前GBDT的算法比較好的庫是xgboost。當然scikit-learn也可以。
最后總結一下GBDT的優缺點。
GBDT的主要優點有:
GBDT的主要缺點是:
問題一:Adaboost和GBDT的區別是什么?
答:Adaboost和GBDT不一樣的地方最明顯的就是損失函數了。Adaboost的目標是找到一個可以使當前損失函數最小的弱分類器,具體的數學解就是偏導數等于零的解。而GBDT不同的地方是讓偏導數等于零這個解不是對所有的損失函數都有效的,在Adaboost里面做分類的時候,指數函數做損失函數,這個解是可求的,但是換成一般函數怎么辦呢?然后就在損失函數梯度提升樹(GBDT)原理那里做一階泰勒展開,因為展開后的方程變成了一個常數加上一階梯度和新的弱分類器的乘積,所以梯度和弱分類器的乘積越小,損失函數就越小,因此要拿逆梯度來擬合新的弱分類器,這時候可以把弱分類器分類作為步長,讓損失函數沿著梯度做逆梯度下降。至于一些正則化項的存在很大程度是為了限制步長和弱分類器的復雜度,限制弱分類器的復雜度很好理解,限制步長就是因為在逆梯度方向一步不能邁的太大。
問題二:GBDT如何減少異常點的影響?
答:主要用到了以下3種方法:1) 使用健壯的損失函數,比如Huber損失函數和分位數(Quantile)損失函數;2) 增加正則化項;3) 采用無放回的子采樣。
另外,對于異常點的魯棒性,隨機森林要比GBDT好的多。主要原因是GBDT的模型在迭代過程中較遠的異常點殘差往往會比正常點大,導致最終建立的模型出現偏差。一般的經驗是,異常點少的樣本集GBDT表現更加優秀,而異常點多的樣本集,隨機森林表現更好。
總結
以上是生活随笔為你收集整理的机器学习笔记GBDT(一):原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java封装demo_java封装
- 下一篇: ul li前面的点怎么变大_硅片尺寸变大