[机器学习]梯度提升决策树--GBDT
概述
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹(shù)算法,該算法由多棵決策樹(shù)組成,所有樹(shù)的結(jié)論累加起來(lái)做最終答案。它在被提出之初就和SVM一起被認(rèn)為是泛化能力較強(qiáng)的算法。
GBDT中的樹(shù)是回歸樹(shù)(不是分類(lèi)樹(shù)),GBDT用來(lái)做回歸預(yù)測(cè),調(diào)整后也可以用于分類(lèi)。
集成學(xué)習(xí)==>提升方法族==>梯度提升方法==>以決策樹(shù)作為基學(xué)習(xí)器的梯度提升方法
集成學(xué)習(xí)
集成學(xué)習(xí)(ensemble learning)通過(guò)構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來(lái)完成學(xué)習(xí)任務(wù)。如何產(chǎn)生“好而不同”的個(gè)體學(xué)習(xí)器,是集成學(xué)習(xí)研究的核心。
根據(jù)個(gè)體學(xué)習(xí)器的生成方式,可以將集成學(xué)習(xí)方法大致分為兩大類(lèi):
- 1、個(gè)體學(xué)習(xí)器間存在強(qiáng)依賴(lài)關(guān)系、必須串行生成的序列化方法。
比如boosting族算法,代表性的有adaboost算法,GBDT。 - 2、個(gè)體學(xué)習(xí)器之間不存在強(qiáng)依賴(lài)關(guān)系、可同時(shí)生成的并行化方法。
比如bagging和“隨機(jī)森林”。
對(duì)于adaboost,bagging和隨機(jī)森林可以參考集成學(xué)習(xí)方法
Boosting
Boosting是一族可將弱學(xué)習(xí)器提升為強(qiáng)學(xué)習(xí)器的算法。boosting方法通過(guò)分步迭代(stage-wise)的方式來(lái)構(gòu)建模型,在迭代的每一步構(gòu)建的弱學(xué)習(xí)器都是為了彌補(bǔ)已有模型的不足。(個(gè)體學(xué)習(xí)器之間存在強(qiáng)依賴(lài)關(guān)系。)
boosting族算法的著名代表:AdaBoost。
AdaBoost算法通過(guò)給已有模型預(yù)測(cè)錯(cuò)誤的樣本更高的權(quán)重,使得先前的學(xué)習(xí)器做錯(cuò)的訓(xùn)練樣本在后續(xù)受到更多的關(guān)注的方式來(lái)彌補(bǔ)已有模型的不足。
GBDT主要由三個(gè)概念組成:
Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (算法的一個(gè)重要演進(jìn)分枝,目前大部分源碼都按該版本實(shí)現(xiàn))。搞定這三個(gè)概念后就能明白GBDT是如何工作的。
一、DT:回歸樹(shù) Regression Decision Tree
提起決策樹(shù)(DT, Decision Tree) 絕大部分人首先想到的就是C4.5分類(lèi)決策樹(shù)。但如果一開(kāi)始就把GBDT中的樹(shù)想成分類(lèi)樹(shù),那就錯(cuò)了。千萬(wàn)不要以為GBDT是很多棵分類(lèi)樹(shù)。決策樹(shù)分為兩大類(lèi),回歸樹(shù)和分類(lèi)樹(shù)。前者用于預(yù)測(cè)實(shí)數(shù)值,如明天的溫度、用戶(hù)的年齡、網(wǎng)頁(yè)的相關(guān)程度;后者用于分類(lèi)標(biāo)簽值,如晴天/陰天/霧/雨、用戶(hù)性別、網(wǎng)頁(yè)是否是垃圾頁(yè)面。這里要強(qiáng)調(diào)的是,前者的結(jié)果加減是有意義的,如10歲+5歲-3歲=12歲,后者則無(wú)意義,如男+男+女=到底是男是女?GBDT的核心在于累加所有樹(shù)的結(jié)果作為最終結(jié)果,就像前面對(duì)年齡的累加(-3是加負(fù)3),而分類(lèi)樹(shù)的結(jié)果顯然是沒(méi)辦法累加的,所以GBDT中的樹(shù)都是回歸樹(shù),不是分類(lèi)樹(shù),這點(diǎn)對(duì)理解GBDT相當(dāng)重要(盡管GBDT調(diào)整后也可用于分類(lèi)但不代表GBDT的樹(shù)是分類(lèi)樹(shù))。
回歸樹(shù)總體流程類(lèi)似于分類(lèi)樹(shù),區(qū)別在于,回歸樹(shù)的每一個(gè)節(jié)點(diǎn)都會(huì)得一個(gè)預(yù)測(cè)值,以年齡為例,該預(yù)測(cè)值等于屬于這個(gè)節(jié)點(diǎn)的所有人年齡的平均值。分枝時(shí)窮舉每一個(gè)feature的每個(gè)閾值找最好的分割點(diǎn),但衡量最好的標(biāo)準(zhǔn)不再是最大熵,而是最小化平方誤差。也就是被預(yù)測(cè)出錯(cuò)的人數(shù)越多,錯(cuò)的越離譜,平方誤差就越大,通過(guò)最小化平方誤差能夠找到最可靠的分枝依據(jù)。分枝直到每個(gè)葉子節(jié)點(diǎn)上人的年齡都唯一或者達(dá)到預(yù)設(shè)的終止條件(如葉子個(gè)數(shù)上限),若最終葉子節(jié)點(diǎn)上人的年齡不唯一,則以該節(jié)點(diǎn)上所有人的平均年齡做為該葉子節(jié)點(diǎn)的預(yù)測(cè)年齡。
回歸樹(shù)算法如下圖(截圖來(lái)自《統(tǒng)計(jì)學(xué)習(xí)方法》5.5.1 CART生成):
回歸樹(shù)生成算法
二、 GB:梯度迭代 Gradient Boosting
梯度提升(Gradient boosting)是一種用于回歸、分類(lèi)和排序任務(wù)的機(jī)器學(xué)習(xí)技術(shù)[1],屬于Boosting算法族的一部分。Boosting是一族可將弱學(xué)習(xí)器提升為強(qiáng)學(xué)習(xí)器的算法,屬于集成學(xué)習(xí)(ensemble learning)的范疇。Boosting方法基于這樣一種思想:對(duì)于一個(gè)復(fù)雜任務(wù)來(lái)說(shuō),將多個(gè)專(zhuān)家的判斷進(jìn)行適當(dāng)?shù)木C合所得出的判斷,要比其中任何一個(gè)專(zhuān)家單獨(dú)的判斷要好。通俗地說(shuō),就是“三個(gè)臭皮匠頂個(gè)諸葛亮”的道理。梯度提升同其他boosting方法一樣,通過(guò)集成(ensemble)多個(gè)弱學(xué)習(xí)器,通常是決策樹(shù),來(lái)構(gòu)建最終的預(yù)測(cè)模型。
Boosting、bagging和stacking是集成學(xué)習(xí)的三種主要方法。
不同于bagging方法,boosting方法通過(guò)分步迭代(stage-wise)的方式來(lái)構(gòu)建模型,在迭代的每一步構(gòu)建的弱學(xué)習(xí)器都是為了彌補(bǔ)已有模型的不足。Boosting族算法的著名代表是AdaBoost。AdaBoost算法通過(guò)給已有模型預(yù)測(cè)錯(cuò)誤的樣本更高的權(quán)重,使得先前的學(xué)習(xí)器做錯(cuò)的訓(xùn)練樣本在后續(xù)受到更多的關(guān)注的方式來(lái)彌補(bǔ)已有模型的不足。
相比于A(yíng)daBoost,梯度提升方法的優(yōu)點(diǎn):
雖然同屬于Boosting族,但是梯度提升方法的優(yōu)點(diǎn)比較多。
- 1、與AdaBoost算法不同,梯度提升方法在迭代的每一步構(gòu)建一個(gè)能夠沿著梯度最陡的方向降低損失(steepest-descent)的學(xué)習(xí)器來(lái)彌補(bǔ)已有模型的不足。
- 2、經(jīng)典的AdaBoost算法只能處理采用指數(shù)損失函數(shù)的二分類(lèi)學(xué)習(xí)任務(wù),而梯度提升方法通過(guò)設(shè)置不同的可微損失函數(shù)可以處理各類(lèi)學(xué)習(xí)任務(wù)(多分類(lèi)、回歸、Ranking等),應(yīng)用范圍大大擴(kuò)展。
- 3、AdaBoost算法對(duì)異常點(diǎn)(outlier)比較敏感,而梯度提升算法通過(guò)引入bagging思想、加入正則項(xiàng)等方法能夠有效地抵御訓(xùn)練數(shù)據(jù)中的噪音,具有更好的健壯性。
提升樹(shù)是迭代多棵回歸樹(shù)來(lái)共同決策。當(dāng)采用平方誤差損失函數(shù)時(shí),每一棵回歸樹(shù)學(xué)習(xí)的是之前所有樹(shù)的結(jié)論和殘差,擬合得到一個(gè)當(dāng)前的殘差回歸樹(shù),殘差的意義如公式:殘差 = 真實(shí)值 - 預(yù)測(cè)值 。提升樹(shù)即是整個(gè)迭代過(guò)程生成的回歸樹(shù)的累加。GBDT的核心就在于,每一棵樹(shù)學(xué)的是之前所有樹(shù)結(jié)論和的殘差,這個(gè)殘差就是一個(gè)加預(yù)測(cè)值后能得真實(shí)值的累加量。
三、Gradient Boosting Decision Tree:梯度提升決策樹(shù)
為什么梯度提升方法傾向于選擇決策樹(shù)(通常是CART樹(shù))作為基學(xué)習(xí)器呢?
這與決策樹(shù)算法自身的優(yōu)點(diǎn)有很大的關(guān)系:
1、 決策樹(shù)可以認(rèn)為是if-then規(guī)則的集合,易于理解,可解釋性強(qiáng),預(yù)測(cè)速度快;
2、決策樹(shù)算法相比于其他的算法需要更少的特征工程,比如可以不用做特征標(biāo)準(zhǔn)化,可以很好的處理字段缺失的數(shù)據(jù),也可以不用關(guān)心特征間是否相互依賴(lài)等
3、決策樹(shù)能夠自動(dòng)組合多個(gè)特征,它可以毫無(wú)壓力地處理特征間的交互關(guān)系并且是非參數(shù)化的,因此你不必?fù)?dān)心異常值或者數(shù)據(jù)是否線(xiàn)性可分。
舉個(gè)例子,西瓜a(烏黑色、紋路清晰)可能是好瓜,西瓜b(青綠色,紋路清晰)的也可能是好瓜。決策樹(shù)一樣可以處理。
決策樹(shù)有優(yōu)點(diǎn),自然也有缺點(diǎn),不過(guò),可以通過(guò)梯度提升方法解決這個(gè)缺點(diǎn)。
單獨(dú)使用決策樹(shù)算法時(shí),有容易過(guò)擬合缺點(diǎn)。怎么解決呢?
- 通過(guò)各種方法,抑制決策樹(shù)的復(fù)雜性,降低單棵決策樹(shù)的擬合能力
- 通過(guò)梯度提升的方法集成多個(gè)決策樹(shù),則預(yù)測(cè)效果上來(lái)的同時(shí),也能夠很好的解決過(guò)擬合的問(wèn)題。
(這一點(diǎn)具有bagging的思想,降低單個(gè)學(xué)習(xí)器的擬合能力,提高方法的泛化能力。)
由此可見(jiàn),梯度提升方法和決策樹(shù)學(xué)習(xí)算法可以互相取長(zhǎng)補(bǔ)短,是一對(duì)完美的搭檔。
怎么降低單棵決策樹(shù)的復(fù)雜度?
抑制單顆決策樹(shù)的復(fù)雜度的方法有很多:
- 限制樹(shù)的最大深度、限制葉子節(jié)點(diǎn)的最少樣本數(shù)量、限制節(jié)點(diǎn)分裂時(shí)的最少樣本數(shù)量
- 吸收bagging的思想對(duì)訓(xùn)練樣本采樣(subsample),在學(xué)習(xí)單顆決策樹(shù)時(shí)只使用一部分訓(xùn)練樣本
- 借鑒隨機(jī)森林的思路在學(xué)習(xí)單顆決策樹(shù)時(shí)只采樣一部分特征
- 在目標(biāo)函數(shù)中添加正則項(xiàng)懲罰復(fù)雜的樹(shù)結(jié)構(gòu)等。
現(xiàn)在主流的GBDT算法實(shí)現(xiàn)中這些方法基本上都有實(shí)現(xiàn),因此GBDT算法的超參數(shù)還是比較多的,應(yīng)用過(guò)程中需要精心調(diào)參,并用交叉驗(yàn)證的方法選擇最佳參數(shù)。
提升樹(shù)利用加法模型和前向分步算法實(shí)現(xiàn)學(xué)習(xí)的優(yōu)化過(guò)程。當(dāng)損失函數(shù)時(shí)平方損失和指數(shù)損失函數(shù)時(shí),每一步的優(yōu)化很簡(jiǎn)單,如平方損失函數(shù)學(xué)習(xí)殘差回歸樹(shù)。
前向分布算法(Forward stagewise additive modeling)
提升方法其實(shí)是一個(gè)比adaboost概念更大的算法,因?yàn)閍daboost可以表示為boosting的前向分布算法(Forward stagewise additive modeling)的一個(gè)特例,boosting最終可以表示為:
其中的w是權(quán)重,Φ是弱分類(lèi)器(回歸器)的集合,其實(shí)就是一個(gè)加法模型(即基函數(shù)的線(xiàn)性組合)
前向分布算法實(shí)際上是一個(gè)貪心的算法,也就是在每一步求解弱分類(lèi)器Φ(m)和其參數(shù)w(m)的時(shí)候不去修改之前已經(jīng)求好的分類(lèi)器和參數(shù):
為了表示方便,我們以后用β代替w進(jìn)行描述了,圖中的b是之前說(shuō)的Φ弱分類(lèi)器
OK,這也就是提升方法(之前向分布算法)的大致結(jié)構(gòu)了,可以看到其中存在變數(shù)的部分其實(shí)就是極小化損失函數(shù) 這關(guān)鍵的一步了,如何選擇損失函數(shù)決定了算法的最終效果(名字)……這一步你可以看出算法的“趨勢(shì)”,以后再單獨(dú)把“趨勢(shì)”拿出來(lái)說(shuō)吧,因?yàn)槲腋杏X(jué)理解算法的關(guān)鍵之一就是理解算法公式的“趨勢(shì)”
各種提升方法
不同的損失函數(shù)和極小化損失函數(shù)方法決定了boosting的最終效果,我們現(xiàn)在來(lái)說(shuō)幾個(gè)常見(jiàn)的boosting:
廣義上來(lái)講,所謂的Gradient Boosting 其實(shí)就是在更新的時(shí)候選擇梯度下降的方向來(lái)保證最后的結(jié)果最好,一些書(shū)上講的“殘差” 方法其實(shí)就是L2Boosting吧,因?yàn)樗x的殘差其實(shí)就是L2Boosting的Derivative,接下來(lái)我們著重講一下弱回歸器是決策樹(shù)的情況,也就是GBDT。
加法模型(additive model)
GBDT算法可以看成是由K棵樹(shù)組成的加法模型:
其中F為所有樹(shù)組成的函數(shù)空間,以回歸任務(wù)為例,回歸樹(shù)可以看作為一個(gè)把特征向量映射為某個(gè)score的函數(shù)。該模型的參數(shù)為:Θ = {f1, f2, ... , fk} 。于一般的機(jī)器學(xué)習(xí)算法不同的是,加法模型不是學(xué)習(xí)d維空間中的權(quán)重,而是直接學(xué)習(xí)函數(shù)(決策樹(shù))集合。上述加法模型的目標(biāo)函數(shù)定義為: 其中Ω表示決策樹(shù)的復(fù)雜度,那么該如何定義樹(shù)的復(fù)雜度呢?比如,可以考慮樹(shù)的節(jié)點(diǎn)數(shù)量、樹(shù)的深度或者葉子節(jié)點(diǎn)所對(duì)應(yīng)的分?jǐn)?shù)的L2范數(shù)等等。
如何來(lái)學(xué)習(xí)加法模型呢?
解這一優(yōu)化問(wèn)題,可以用前向分布算法(forward stagewise algorithm)。因?yàn)閷W(xué)習(xí)的是加法模型,如果能夠從前往后,每一步只學(xué)習(xí)一個(gè)基函數(shù)及其系數(shù)(結(jié)構(gòu)),逐步逼近優(yōu)化目標(biāo)函數(shù),那么就可以簡(jiǎn)化復(fù)雜度。這一學(xué)習(xí)過(guò)程稱(chēng)之為Boosting。具體地,我們從一個(gè)常量預(yù)測(cè)開(kāi)始,每次學(xué)習(xí)一個(gè)新的函數(shù),過(guò)程如下:
前向分布算法過(guò)程
舉個(gè)例子,參考自一篇博客, 該博客舉出的例子較直觀(guān)地展現(xiàn)出多棵決策樹(shù)線(xiàn)性求和過(guò)程以及殘差的意義。
還是年齡預(yù)測(cè),簡(jiǎn)單起見(jiàn)訓(xùn)練集只有4個(gè)人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學(xué)生;C,D分別是應(yīng)屆畢業(yè)生和工作兩年的員工。如果是用一棵傳統(tǒng)的回歸決策樹(shù)來(lái)訓(xùn)練,會(huì)得到如下圖1所示結(jié)果:
現(xiàn)在我們使用GBDT來(lái)做這件事,由于數(shù)據(jù)太少,我們限定葉子節(jié)點(diǎn)做多有兩個(gè),即每棵樹(shù)都只有一個(gè)分枝,并且限定只學(xué)兩棵樹(shù)。我們會(huì)得到如下圖2所示結(jié)果:
在第一棵樹(shù)分枝和圖1一樣,由于A(yíng),B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預(yù)測(cè)值。此時(shí)計(jì)算殘差(殘差的意思就是: A的預(yù)測(cè)值 + A的殘差 = A的實(shí)際值),所以A的殘差就是15-16=-1(注意,A的預(yù)測(cè)值是指前面所有樹(shù)累加的和,這里前面只有一棵樹(shù)所以直接是15,如果還有樹(shù)則需要都累加起來(lái)作為A的預(yù)測(cè)值)。進(jìn)而得到A,B,C,D的殘差分別為-1,1,-1,1。然后我們拿殘差替代A,B,C,D的原值,到第二棵樹(shù)去學(xué)習(xí),如果我們的預(yù)測(cè)值和它們的殘差相等,則只需把第二棵樹(shù)的結(jié)論累加到第一棵樹(shù)上就能得到真實(shí)年齡了。這里的數(shù)據(jù)顯然是我可以做的,第二棵樹(shù)只有兩個(gè)值1和-1,直接分成兩個(gè)節(jié)點(diǎn)。此時(shí)所有人的殘差都是0,即每個(gè)人都得到了真實(shí)的預(yù)測(cè)值。
換句話(huà)說(shuō),現(xiàn)在A(yíng),B,C,D的預(yù)測(cè)值都和真實(shí)年齡一致了。Perfect!:
A: 14歲高一學(xué)生,購(gòu)物較少,經(jīng)常問(wèn)學(xué)長(zhǎng)問(wèn)題;預(yù)測(cè)年齡A = 15 – 1 = 14
B: 16歲高三學(xué)生;購(gòu)物較少,經(jīng)常被學(xué)弟問(wèn)問(wèn)題;預(yù)測(cè)年齡B = 15 + 1 = 16
C: 24歲應(yīng)屆畢業(yè)生;購(gòu)物較多,經(jīng)常問(wèn)師兄問(wèn)題;預(yù)測(cè)年齡C = 25 – 1 = 24
D: 26歲工作兩年員工;購(gòu)物較多,經(jīng)常被師弟問(wèn)問(wèn)題;預(yù)測(cè)年齡D = 25 + 1 = 26
那么哪里體現(xiàn)了Gradient呢?其實(shí)回到第一棵樹(shù)結(jié)束時(shí)想一想,無(wú)論此時(shí)的cost function是什么,是均方差還是均差,只要它以誤差作為衡量標(biāo)準(zhǔn),殘差向量(-1, 1, -1, 1)都是它的全局最優(yōu)方向,這就是Gradient。
講到這里我們已經(jīng)把GBDT最核心的概念、運(yùn)算過(guò)程講完了!沒(méi)錯(cuò)就是這么簡(jiǎn)單。
該例子很直觀(guān)的能看到,預(yù)測(cè)值等于所有樹(shù)值得累加,如A的預(yù)測(cè)值 = 樹(shù)1左節(jié)點(diǎn) 值 15 + 樹(shù)2左節(jié)點(diǎn) -1 = 14。
因此,給定當(dāng)前模型 fm-1(x),只需要簡(jiǎn)單的擬合當(dāng)前模型的殘差?,F(xiàn)將回歸問(wèn)題的提升樹(shù)算法敘述如下:
1)既然圖1和圖2 最終效果相同,為何還需要GBDT呢?
答案是過(guò)擬合。過(guò)擬合是指為了讓訓(xùn)練集精度更高,學(xué)到了很多”僅在訓(xùn)練集上成立的規(guī)律“,導(dǎo)致?lián)Q一個(gè)數(shù)據(jù)集當(dāng)前規(guī)律就不適用了。其實(shí)只要允許一棵樹(shù)的葉子節(jié)點(diǎn)足夠多,訓(xùn)練集總是能訓(xùn)練到100%準(zhǔn)確率的(大不了最后一個(gè)葉子上只有一個(gè)instance)。在訓(xùn)練精度和實(shí)際精度(或測(cè)試精度)之間,后者才是我們想要真正得到的。
我們發(fā)現(xiàn)圖1為了達(dá)到100%精度使用了3個(gè)feature(上網(wǎng)時(shí)長(zhǎng)、時(shí)段、網(wǎng)購(gòu)金額),其中分枝“上網(wǎng)時(shí)長(zhǎng)>1.1h” 很顯然已經(jīng)過(guò)擬合了,這個(gè)數(shù)據(jù)集上A,B也許恰好A每天上網(wǎng)1.09h, B上網(wǎng)1.05小時(shí),但用上網(wǎng)時(shí)間是不是>1.1小時(shí)來(lái)判斷所有人的年齡很顯然是有悖常識(shí)的;
相對(duì)來(lái)說(shuō)圖2的boosting雖然用了兩棵樹(shù) ,但其實(shí)只用了2個(gè)feature就搞定了,后一個(gè)feature是問(wèn)答比例,顯然圖2的依據(jù)更靠譜。(當(dāng)然,這里是LZ故意做的數(shù)據(jù),所以才能靠譜得如此狗血。實(shí)際中靠譜不靠譜總是相對(duì)的) Boosting的最大好處在于,每一步的殘差計(jì)算其實(shí)變相地增大了分錯(cuò)instance的權(quán)重,而已經(jīng)分對(duì)的instance則都趨向于0。這樣后面的樹(shù)就能越來(lái)越專(zhuān)注那些前面被分錯(cuò)的instance。就像我們做互聯(lián)網(wǎng),總是先解決60%用戶(hù)的需求湊合著,再解決35%用戶(hù)的需求,最后才關(guān)注那5%人的需求,這樣就能逐漸把產(chǎn)品做好,因?yàn)椴煌?lèi)型用戶(hù)需求可能完全不同,需要分別獨(dú)立分析。如果反過(guò)來(lái)做,或者剛上來(lái)就一定要做到盡善盡美,往往最終會(huì)竹籃打水一場(chǎng)空。
四、Shrinkage
Shrinkage(縮減)的思想認(rèn)為,每次走一小步逐漸逼近結(jié)果的效果,要比每次邁一大步很快逼近結(jié)果的方式更容易避免過(guò)擬合。即它不完全信任每一個(gè)棵殘差樹(shù),它認(rèn)為每棵樹(shù)只學(xué)到了真理的一小部分,累加的時(shí)候只累加一小部分,通過(guò)多學(xué)幾棵樹(shù)彌補(bǔ)不足。用方程來(lái)看更清晰,即
沒(méi)用Shrinkage時(shí):(yi表示第i棵樹(shù)上y的預(yù)測(cè)值, y(1~i)表示前i棵樹(shù)y的綜合預(yù)測(cè)值)
y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) = y真實(shí)值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, ..., yi)
Shrinkage不改變第一個(gè)方程,只把第二個(gè)方程改為:
y(1 ~ i) = y(1 ~ i-1) + step * yi
即Shrinkage仍然以殘差作為學(xué)習(xí)目標(biāo),但對(duì)于殘差學(xué)習(xí)出來(lái)的結(jié)果,只累加一小部分(step殘差)逐步逼近目標(biāo),step一般都比較小,如0.01~0.001(注意該step非gradient的step),導(dǎo)致各個(gè)樹(shù)的殘差是漸變的而不是陡變的。直覺(jué)上這也很好理解,不像直接用殘差一步修復(fù)誤差,而是只修復(fù)一點(diǎn)點(diǎn),其實(shí)就是把大步切成了很多小步。本質(zhì)上,Shrinkage為每棵樹(shù)設(shè)置了一個(gè)weight,累加時(shí)要乘以這個(gè)weight,但和Gradient并沒(méi)有關(guān)系*。 這個(gè)weight就是step。就像Adaboost一樣,Shrinkage能減少過(guò)擬合發(fā)生也是經(jīng)驗(yàn)證明的,目前還沒(méi)有看到從理論的證明。
GBDT的適用范圍
該版本GBDT幾乎可用于所有回歸問(wèn)題(線(xiàn)性/非線(xiàn)性),相對(duì)logistic regression僅能用于線(xiàn)性回歸,GBDT的適用面非常廣。亦可用于二分類(lèi)問(wèn)題(設(shè)定閾值,大于閾值為正例,反之為負(fù)例)。
五、XGboost/GBDT調(diào)參
推薦GBDT樹(shù)的深度:6;(橫向比較:DecisionTree/RandomForest需要把樹(shù)的深度調(diào)到15或更高)以下摘自知乎上的一個(gè)問(wèn)答(詳見(jiàn)參考文獻(xiàn)8),問(wèn)題和回復(fù)都很好的闡述了這個(gè)參數(shù)設(shè)置的數(shù)學(xué)原理。
【問(wèn)】xgboost/gbdt在調(diào)參時(shí)為什么樹(shù)的深度很少就能達(dá)到很高的精度?
??用xgboost/gbdt在在調(diào)參的時(shí)候把樹(shù)的最大深度調(diào)成6就有很高的精度了。但是用DecisionTree/RandomForest的時(shí)候需要把樹(shù)的深度調(diào)到15或更高。用RandomForest所需要的樹(shù)的深度和DecisionTree一樣我能理解,因?yàn)樗怯胋agging的方法把DecisionTree組合在一起,相當(dāng)于做了多次DecisionTree一樣。但是xgboost/gbdt僅僅用梯度上升法就能用6個(gè)節(jié)點(diǎn)的深度達(dá)到很高的預(yù)測(cè)精度,使我驚訝到懷疑它是黑科技了。請(qǐng)問(wèn)下xgboost/gbdt是怎么做到的?它的節(jié)點(diǎn)和一般的DecisionTree不同嗎?
【答】
??這是一個(gè)非常好的問(wèn)題,題主對(duì)各算法的學(xué)習(xí)非常細(xì)致透徹,問(wèn)的問(wèn)題也關(guān)系到這兩個(gè)算法的本質(zhì)。這個(gè)問(wèn)題其實(shí)并不是一個(gè)很簡(jiǎn)單的問(wèn)題,我嘗試用我淺薄的機(jī)器學(xué)習(xí)知識(shí)對(duì)這個(gè)問(wèn)題進(jìn)行回答。
??一句話(huà)的解釋,來(lái)自周志華老師的機(jī)器學(xué)習(xí)教科書(shū)( 機(jī)器學(xué)習(xí)-周志華):Boosting主要關(guān)注降低偏差,因此Boosting能基于泛化性能相當(dāng)弱的學(xué)習(xí)器構(gòu)建出很強(qiáng)的集成;Bagging主要關(guān)注降低方差,因此它在不剪枝的決策樹(shù)、神經(jīng)網(wǎng)絡(luò)等學(xué)習(xí)器上效用更為明顯。
??隨機(jī)森林(random forest)和GBDT都是屬于集成學(xué)習(xí)(ensemble learning)的范疇。集成學(xué)習(xí)下有兩個(gè)重要的策略Bagging和Boosting。
??Bagging算法是這樣做的:每個(gè)分類(lèi)器都隨機(jī)從原樣本中做有放回的采樣,然后分別在這些采樣后的樣本上訓(xùn)練分類(lèi)器,然后再把這些分類(lèi)器組合起來(lái)。簡(jiǎn)單的多數(shù)投票一般就可以。其代表算法是隨機(jī)森林。Boosting的意思是這樣,他通過(guò)迭代地訓(xùn)練一系列的分類(lèi)器,每個(gè)分類(lèi)器采用的樣本分布都和上一輪的學(xué)習(xí)結(jié)果有關(guān)。其代表算法是AdaBoost, GBDT。
??其實(shí)就機(jī)器學(xué)習(xí)算法來(lái)說(shuō),其泛化誤差可以分解為兩部分,偏差(bias)和方差(variance)。這個(gè)可由下圖的式子導(dǎo)出(這里用到了概率論公式D(X)=E(X2)-[E(X)]2)。偏差指的是算法的期望預(yù)測(cè)與真實(shí)預(yù)測(cè)之間的偏差程度,反應(yīng)了模型本身的擬合能力;方差度量了同等大小的訓(xùn)練集的變動(dòng)導(dǎo)致學(xué)習(xí)性能的變化,刻畫(huà)了數(shù)據(jù)擾動(dòng)所導(dǎo)致的影響。這個(gè)有點(diǎn)兒繞,不過(guò)你一定知道過(guò)擬合。
??如下圖所示,當(dāng)模型越復(fù)雜時(shí),擬合的程度就越高,模型的訓(xùn)練偏差就越小。但此時(shí)如果換一組數(shù)據(jù)可能模型的變化就會(huì)很大,即模型的方差很大。所以模型過(guò)于復(fù)雜的時(shí)候會(huì)導(dǎo)致過(guò)擬合。
??當(dāng)模型越簡(jiǎn)單時(shí),即使我們?cè)贀Q一組數(shù)據(jù),最后得出的學(xué)習(xí)器和之前的學(xué)習(xí)器的差別就不那么大,模型的方差很小。還是因?yàn)槟P秃?jiǎn)單,所以偏差會(huì)很大。
??也就是說(shuō),當(dāng)我們訓(xùn)練一個(gè)模型時(shí),偏差和方差都得照顧到,漏掉一個(gè)都不行。
??對(duì)于Bagging算法來(lái)說(shuō),由于我們會(huì)并行地訓(xùn)練很多不同的分類(lèi)器的目的就是降低這個(gè)方差(variance) ,因?yàn)椴捎昧讼嗷オ?dú)立的基分類(lèi)器多了以后,h的值自然就會(huì)靠近.所以對(duì)于每個(gè)基分類(lèi)器來(lái)說(shuō),目標(biāo)就是如何降低這個(gè)偏差(bias),所以我們會(huì)采用深度很深甚至不剪枝的決策樹(shù)。
??對(duì)于Boosting來(lái)說(shuō),每一步我們都會(huì)在上一輪的基礎(chǔ)上更加擬合原數(shù)據(jù),所以可以保證偏差(bias),所以對(duì)于每個(gè)基分類(lèi)器來(lái)說(shuō),問(wèn)題就在于如何選擇variance更小的分類(lèi)器,即更簡(jiǎn)單的分類(lèi)器,所以我們選擇了深度很淺的決策樹(shù)。
六、其他
Gradient Boosting算法:xgboost,在計(jì)算速度和準(zhǔn)確率上,較GBDT有明顯的提升。xgboost 的全稱(chēng)是eXtreme Gradient Boosting,它是Gradient Boosting Machine的一個(gè)c++實(shí)現(xiàn),作者為正在華盛頓大學(xué)研究機(jī)器學(xué)習(xí)的大牛陳天奇 。xgboost最大的特點(diǎn)在于,它能夠自動(dòng)利用CPU的多線(xiàn)程進(jìn)行并行,同時(shí)在算法上加以改進(jìn)提高了精度。它的處女秀是Kaggle的 希格斯子信號(hào)識(shí)別競(jìng)賽,因?yàn)槌霰姷男逝c較高的預(yù)測(cè)準(zhǔn)確度在比賽論壇中引起了參賽選手的廣泛關(guān)注。值得我們?cè)贕BDT的基礎(chǔ)上對(duì)其進(jìn)一步探索學(xué)習(xí)。
參考:
https://www.jianshu.com/p/6755107e816dhttps://www.jianshu.com/p/a72539acafe5轉(zhuǎn)載于:https://www.cnblogs.com/WayneZeng/p/9290696.html
總結(jié)
以上是生活随笔為你收集整理的[机器学习]梯度提升决策树--GBDT的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何绘制漂亮的多序列比对图片
- 下一篇: nyoj A+B Problem IV