本來覺得xgboost已經(jīng)弄懂了,但聽了AI Lab陳博士的講座之后仿畸,又有了更深入的認(rèn)知,本文將詳細(xì)解釋一些細(xì)節(jié)朗和,幫助大家理解错沽。順便表示對陳博的膜拜眶拉,講的太清楚了??。
首先呢忆植,Xgboost是一個究極進(jìn)化體谒臼,它的祖先其實(shí)是棵樹蜈缤。我們來看下它的進(jìn)化史:
本文為了讓你真正懂Xgboost冯挎,將追根溯源,從他的祖先開始一層一層的講解Xgboost是怎么進(jìn)化來的??
But房官!本文默認(rèn)你是懂DecisionTree的,不清楚決策樹是啥的請自行百度??
But孵奶,but蜡峰!還是要提一嘴決策樹的表示形態(tài)了袁,這個很重要,因?yàn)閄gboost的進(jìn)化與決策樹的形態(tài)變化密不可分湿颅。
決策樹有哪些表示形態(tài)霸芈獭?
- 樹形結(jié)構(gòu)
- if-else判斷結(jié)構(gòu)
- 圖像區(qū)域劃分
- 肖爵。。臀脏。
前三種是我們常見的形式了劝堪,點(diǎn)點(diǎn)點(diǎn)我們后面再說??
好!我們正式開始研究Xgboost的進(jìn)化史揉稚,首先是Boosting秒啦。
Boosting
提升方法(boosting)就是集成方法中的一員(另一員是Bagging,其中差別不在本文討論范圍內(nèi)搀玖,請自行百度)余境,它將所有臭皮匠加起來,最后賽過一個諸葛亮灌诅。所以boosting本質(zhì)是一個加法模型芳来。
加法模型:
其中,為基函數(shù)猜拾,為基函數(shù)的參數(shù)即舌,為基函數(shù)的系數(shù)。基函數(shù)是什么挎袜?只要保證函數(shù)可加性就可以,比如決策樹蜜葱。
有了這個加法模型牵囤,那么我們的目標(biāo)就是:在給定訓(xùn)練數(shù)據(jù)及損失函數(shù)的條件下,學(xué)習(xí)加法模型成為經(jīng)驗(yàn)風(fēng)險(xiǎn)極小化問題:
稍微解釋下經(jīng)驗(yàn)風(fēng)險(xiǎn)極小化是什么鬼汹桦,其實(shí)就是損失函數(shù)舞骆。還有一個結(jié)構(gòu)風(fēng)險(xiǎn)極小化,指的是正則化項(xiàng)狈惫。
式(1.2)這個模型看上去有點(diǎn)麻煩胧谈,但我們可以從前向后,每一步只學(xué)習(xí)一個基函數(shù)及其系數(shù)稳强,逐步逼近優(yōu)化目標(biāo)函數(shù)式(1.2)退疫,這樣就可以簡化優(yōu)化復(fù)雜度。具體地澜汤,每步只需優(yōu)化如下?lián)p失函數(shù):
于是有了前向分布算法:
算法1:前向分步算法
輸入:訓(xùn)練數(shù)據(jù)集谁不; 損失函數(shù)刹帕;基函數(shù)集合;
輸出:加法模型
(1)初始化
(2)對
(a)極小化損失函數(shù)
得到參數(shù)挫掏,
(b)更新
(3)得到加法模型
前向分步算法將同時求解從到所有參數(shù)的優(yōu)化問題簡化為逐次求解各個的優(yōu)化問題。
以上就是Boosting
好啦袄友,接下來要開始進(jìn)化了:boosting->boosting+decision tree
BDT
我們把boosting的基函數(shù)設(shè)置成決策樹,那么boosting就變成了BDT鸠按,提升決策樹待诅。
提升決策樹模型可以表示為決策樹的加法模型:
其中,表示決策樹绪囱;為決策樹的參數(shù);為樹的個數(shù)齿椅。
還記得前文說的決策樹形式嗎涣脚?這下又多了一種表示形式矾麻。下面是對這種表示形式的解釋:
已知訓(xùn)練數(shù)據(jù)集,甩牺,為輸入空間柴灯,,為輸出空間查描。如果將輸入空間劃分為個互不相交的區(qū)域冬三,并且在每個區(qū)域上確定輸出的常量,那么決策樹可表示為
其中窝爪,參數(shù)表示決策樹的區(qū)域劃分和各區(qū)域上的常量值。是決策樹的復(fù)雜度即葉子結(jié)點(diǎn)個數(shù)邀杏。
我們回到BDT上來望蜡,提升決策樹使用以下前向分步算法:
在前向分步算法的第步浩姥,給定當(dāng)前模型勒叠,需要求解
得到,即第棵樹的參數(shù)弊决。
當(dāng)采用平方誤差損失函數(shù)時,
其損失變?yōu)?br>
其中昆稿,
是當(dāng)前模型擬合數(shù)據(jù)的殘差(residual)。對回歸問題的提升決策樹喳瓣,只需要簡單地?cái)M合當(dāng)前模型的殘差畏陕。
算法2:回歸問題的提升決策樹算法
輸入:訓(xùn)練數(shù)據(jù)集;
輸出:提升決策樹
(1)初始化
(2)對
(a)按照式(2.5)計(jì)算殘差
(b)擬合殘差學(xué)習(xí)一個回歸樹仁讨,得到
(c)更新
(3)得到回歸提升決策樹
簡單總結(jié)下,BDT其實(shí)就是把boosting的基函數(shù)設(shè)定成了決策樹而已荒给。
形象的說說Boosting和BDT:
諸葛亮的智力值為100曙咽,有個智力值為40的臭皮匠A想打敗他例朱。兩者差了60點(diǎn)智力值洒嗤,實(shí)力太懸殊,于是A又找了個智力值為30的臭皮匠B间唉,這下A呈野、B加起來智力值就是70了,只差諸葛亮30點(diǎn)了喉钢。于是他們又找到了智力值為20的臭皮匠C幔戏。闲延。。好吧找颓,你們慢慢找佛析,總有一天能夠打敗諸葛亮捺萌。
好啦桃纯,又要進(jìn)化了:BDT->GBDT
GBDT
前文的加法模型中慈参,新的基模型都是在擬合真實(shí)殘差,既
如何加速這個擬合過程呢壮锻?我們知道負(fù)導(dǎo)數(shù)是函數(shù)下降最快的方向猜绣,那么對損失函數(shù)求偏導(dǎo)就能得到極值掰邢。
GBDT使用損失函數(shù)的負(fù)梯度在當(dāng)前模型的值
作為回歸問題提升決策樹算法中殘差的近似值,擬合一個回歸樹怀估。
算法3: 梯度提升算法
輸入:訓(xùn)練數(shù)據(jù)集多搀; 損失函數(shù)
輸出:梯度提升決策樹
(1)初始化
(2)對
(a)對,計(jì)算
(b)對擬合一個回歸樹从藤,得到第棵樹的葉結(jié)點(diǎn)區(qū)域
(c)對,計(jì)算
(d)更新
(3)得到回歸梯度提升決策樹
這里和BDT有幾處不同:
- 第一步的基分類器不再是粗暴的設(shè)置為扫责,而是擬合了一個當(dāng)前最優(yōu)解c鳖孤。
- 擬合的殘差是損失函數(shù)的負(fù)梯度。
我們觀察式(3.1)推姻,可以發(fā)現(xiàn)它是一個二元函數(shù)增炭。與常見的邏輯回歸隙姿、svm中的梯度下降不太一樣的是输玷,前者求得是參數(shù),而這里我們直接把作為變量求解貌虾。 - 決策樹的表示形式又不一樣了尽狠,這次變成了 袄膏,這樣表示的意思是以樹的葉節(jié)點(diǎn)作為考量码党,樣本放入樹模型后揖盘,被劃分到哪個葉節(jié)點(diǎn)兽狭?而該葉節(jié)點(diǎn)又將輸出何值箕慧?
終于進(jìn)化到究極體了颠焦!GBDT->Xgboost
Xgboost
在Xgboost里伐庭,我們又雙叒叕重新改變了決策樹的表示形式:
訓(xùn)練數(shù)據(jù)集,其中盯捌,則決策樹表示為:
其中,,為決策樹葉子節(jié)點(diǎn)數(shù)幼衰。
這里是第一個重點(diǎn)渡嚣,需要解釋下识椰。
首先我們對決策樹來個功能上的認(rèn)知:給樹模型一個樣本,樹模型就輸出一個預(yù)測值功咒,對吧力奋?這個預(yù)測值實(shí)際上就是葉子節(jié)點(diǎn)的分?jǐn)?shù)溅呢,也就是說一個葉子節(jié)點(diǎn)對應(yīng)一個預(yù)測值挪蹭。
那么這里的函數(shù)表示的是葉子節(jié)點(diǎn)的序號,的意思就是樣本給到函數(shù)之后,函數(shù)將樣本分配到某個葉子節(jié)點(diǎn)上八秃,并輸出這個葉子節(jié)點(diǎn)的序號昔驱。
而表示的是葉子節(jié)點(diǎn)的分?jǐn)?shù)骤肛,用下標(biāo)(就是)的形式來表示是哪一個葉子節(jié)點(diǎn)的分?jǐn)?shù)。
理解了究極體的樹模型表示形式淑玫,接下來我們來看看Xgboost模型:
其中叁鉴,為第棵決策樹亲茅。
這種模型跟前文的BDT、GBDT看起來并沒有什么區(qū)別,但是基于全新的樹模型表示方式捞附,我們可以把正則化項(xiàng)加到目標(biāo)函數(shù)中去:
其中鸟召,。
這樣第輪目標(biāo)函數(shù)就是這樣:
這里是第二個重點(diǎn),在目標(biāo)函數(shù)里加入了GBDT沒有考慮的正則項(xiàng)舔糖,降低了模型過擬合風(fēng)險(xiǎn)莺匠。
接下來是第三個重點(diǎn)金吗,GBDT采用損失函數(shù)負(fù)梯度(一階求導(dǎo))作為殘差,Xgboost嫌他慢了趣竣,采用二階求導(dǎo)摇庙。為了讓損失函數(shù)具有一般性,這里要應(yīng)用泰勒展開公式期贫,什么是泰勒公式自行百度??跟匆。
這里的損失函數(shù)是二元的有序,我們只對做變換迹冤。
第輪目標(biāo)函數(shù)在處的二階泰勒展開得到:
其中莉兰,。
第輪目標(biāo)函數(shù)的二階泰勒展開并移除關(guān)于常數(shù)項(xiàng)岖食,得到:
這里稍微解釋下兄春,我們的目標(biāo)是求出讓損失函數(shù)最小的叙量,而是在上一輪已經(jīng)求出的已知項(xiàng),因此在這里是常數(shù)項(xiàng)。
式(4.6)左邊是用樣本點(diǎn)的標(biāo)號來遍歷凉驻,而右邊是用葉子節(jié)點(diǎn)的標(biāo)號遍歷缀拭,能不能統(tǒng)一一下呢?可以啊,就全部以葉子標(biāo)號來遍歷好了:
定義葉結(jié)點(diǎn)上的樣本的下標(biāo)集合抖苦,則目標(biāo)函數(shù)可表示為按葉結(jié)點(diǎn)累加的形式
這一步是第四個重點(diǎn)物喷,一個很有技巧的操作晕拆,也是很多人看不明白的地方末贾,我們來理解下:
我們的本來目的是要遍歷所有的樣本點(diǎn)對吧集索?而樣本點(diǎn)又無重復(fù)的分布在所有葉子節(jié)點(diǎn)上對吧?那我們遍歷所有的葉子節(jié)點(diǎn)不也能遍歷到所有的樣本嗎吸耿?
想像上課時老師點(diǎn)名,可以按學(xué)號從1到N來點(diǎn)名动分,也可以按小組序號來點(diǎn)名啊明吩,那么這里的學(xué)號就對應(yīng)這樣本點(diǎn)標(biāo)號,小組序號就對應(yīng)著葉子節(jié)點(diǎn)標(biāo)號畔师。
有了上面的解釋腔寡,相信大家應(yīng)該能理解式(4.7)是怎么得來的了吧???
好啦但校,最困難的一步理解之后,就是喜聞樂見的求導(dǎo)了:
由于
可令
得到每個葉結(jié)點(diǎn)的最優(yōu)分?jǐn)?shù)為
至此港庄,我們求出了每個葉子節(jié)點(diǎn)的分?jǐn)?shù)瓣履,但樹長什么樣還沒有完全得出。
最開始有個假設(shè)被我們忽略了婆硬,就是葉子節(jié)點(diǎn)個數(shù)虚茶,這個條件一直被我們當(dāng)做常量來計(jì)算了员帮,也就是說我們已經(jīng)人為設(shè)定好了樹的形狀就是個葉子的樹,然后通過各種神操作得到了每個葉子的輸出值。
那么接下來的問題是,哪些樣本放在1號葉子里氮趋,哪些放2號葉子里呢椒惨?
我們回想下決策樹是怎么做的何恶?依照信息增益抵卫、信息增益比、gini系數(shù)對數(shù)據(jù)集進(jìn)行分裂對吧爵憎?那我們是不是可以創(chuàng)造一種新的分裂方法呢?
代入每個葉結(jié)點(diǎn)的最優(yōu)分?jǐn)?shù)锻全,得到最優(yōu)化目標(biāo)函數(shù)值:
我們發(fā)現(xiàn)這個目標(biāo)函數(shù)僅與葉節(jié)點(diǎn)分?jǐn)?shù)的表達(dá)式(4.8)非常像呀呐伞。是不是可以認(rèn)為敌卓,葉節(jié)點(diǎn)的輸出衡量了最終的模型性能?
ok荸哟,那我們假設(shè)和分別為分裂后左右結(jié)點(diǎn)的實(shí)例集假哎,令,則分裂后損失減少量由下式得出:
式(4.10)表示的是數(shù)據(jù)集分裂前后鞍历,目標(biāo)函數(shù)究竟提升了多少舵抹,這種操作是不是起到了跟gini系數(shù)一樣的作用呢?顯然答案是肯定的呀劣砍。
那我們就可以用(4.10)貪婪的遍歷數(shù)據(jù)集的每一個特征惧蛹,每一個特征下的數(shù)據(jù)類別:
算法4 分裂查找的精確貪婪算法
輸入:當(dāng)前結(jié)點(diǎn)實(shí)例集;特征維度
輸出:根據(jù)最大分值分裂
(1)
(2),
(3)for to do
(3.1)刑枝,
(3.2)for in sorted(, by ) do
(3.2.1)香嗓,
(3.2.2),
(3.2.3)
(3.3)end
(4)end
至此装畅,Xgboost打完收功??
附送陳天奇老師的圖片
參考
七月在線課程
《XGBoost A Scalable Tree Boosting System》-陳天奇
《統(tǒng)計(jì)學(xué)習(xí)方法》-李航