1俯画、前言
????xgboost是在gbdt基礎(chǔ)上進(jìn)行了升級(jí)箫老,所以xgboost也是通過每次擬合上次的殘差(上次實(shí)際值與目標(biāo)值之差),從而每次生成一棵樹(CART回歸樹)卖怜,最終將所有的樹加起來得到最終目標(biāo)键思。與gbdt的區(qū)別這里先不做介紹础爬,后續(xù)文章會(huì)涉及。
注意:XGBoost中基模型是CART樹吼鳞,這里的意思只是說基模型中的樹是二叉樹看蚜,與決策樹中CART樹的劃分屬性及劃分節(jié)點(diǎn)的選擇毫無關(guān)系,心里先有這個(gè)概念赔桌,不然后面不好理解供炎。
2渴逻、模型推導(dǎo)
2.1 模型預(yù)測(cè)結(jié)果
????先給出模型最終預(yù)測(cè)結(jié)果,假設(shè)第k次生成的CART樹(也可以稱為殘差樹)為音诫,則經(jīng)過T輪之后(也就是一共有T棵樹)惨奕,最終模型對(duì)于樣本i的預(yù)測(cè)值為(為第i個(gè)樣本的輸入值,T代表樹的數(shù)量)
2.2 模型訓(xùn)練過程
????從上述公式可以看出竭钝,最終結(jié)果是對(duì)所有CART樹求和梨撞。xgboost是增量學(xué)習(xí)方法,即香罐,每一棵樹都必須在上一棵樹生成之后才可以繼續(xù)求得卧波,所以這里在代碼設(shè)計(jì)上也只能是串行執(zhí)行。
??針對(duì)每一棵樹是如何生成的呢庇茫?接著分析幽勒。
??首先,每次的訓(xùn)練的目標(biāo)是使預(yù)測(cè)值最接近真實(shí)值(即損失函數(shù)最小化)港令。損失函數(shù)常用下式表示:
公式說明:其中表示對(duì)n個(gè)樣本的損失值求和;表示與預(yù)測(cè)值及真實(shí)值有關(guān)的損失函數(shù)(該函數(shù)中真實(shí)值是已知的锈颗,但是預(yù)測(cè)值隨著樹模型的不同而在變換顷霹,所以變量是)。
??但是xgboost不是直接最小化上述損失函數(shù)作為訓(xùn)練的目標(biāo)击吱,而是要在上述公式基礎(chǔ)上加上樹的復(fù)雜度淋淀。為什么要加樹的復(fù)雜度?就是為了避免過擬合(在訓(xùn)練集上表現(xiàn)很好覆醇,但是在測(cè)試集或待預(yù)測(cè)數(shù)據(jù)上表現(xiàn)很差)朵纷,這里的復(fù)雜度就是常說的正則項(xiàng)。
所以永脓,最后的目標(biāo)函數(shù)就變?yōu)椋?br>
注:其中樹復(fù)雜度是k棵樹復(fù)雜度的求和袍辞。在模型求第k棵樹時(shí),其實(shí)前k-1棵樹的復(fù)雜度已經(jīng)知道了常摧。
所以搅吁,得到第t棵樹之后,總的損失值變?yōu)椋?br>
公式說明:
其中落午,第t棵樹時(shí)谎懦,總模型的預(yù)測(cè)值是前t-1棵樹的預(yù)測(cè)值加上第t棵樹的預(yù)測(cè)值(代表第t棵樹):
第t棵樹時(shí),模型總復(fù)雜度的值是前t-1棵樹的復(fù)雜度加上第t棵樹的復(fù)雜度
注意:由于訓(xùn)練第t棵樹時(shí)溃斋,前面的t-1棵樹已經(jīng)全部訓(xùn)練好了界拦,其參數(shù)已經(jīng)確定,所以前面樹的復(fù)雜度也已經(jīng)確定梗劫,這里用const表示享甸。
目標(biāo)函數(shù)變?yōu)椋?br>
目標(biāo)函數(shù)中的損失函數(shù)部分(第一部分):
??二階泰勒公式:
??我們把當(dāng)作截碴,當(dāng)作,則損失函數(shù)的第一部分變?yōu)椋?br>
公式說明:
(1)針對(duì)上式枪萄,一定會(huì)有人對(duì) 產(chǎn)生疑惑隐岛,為什么將當(dāng)作后,函數(shù)中怎么還有瓷翻?
這里注意聚凹,損失函數(shù)中的是樣本的真實(shí)值,所以該值是常量齐帚,函數(shù)只是與有關(guān)妒牙,但是在求第t棵樹時(shí),前面t-1棵樹已經(jīng)確定了对妄,所以就是前t-1棵樹與真實(shí)值的一個(gè)誤差值湘今,是一個(gè)常量;
(2)公式中剪菱,到底什么含義摩瞎?
其中,也就是只是損失函數(shù)對(duì)預(yù)測(cè)值(上面已經(jīng)提過,預(yù)測(cè)值是變量)求導(dǎo)后孝常,將第t棵樹之前的預(yù)測(cè)值(前面所有樹預(yù)測(cè)值的和)帶進(jìn)去之后的結(jié)果旗们;如果還不理解,借助網(wǎng)上一個(gè)例子:
求例子:
在一個(gè)分類任務(wù)中构灸,假設(shè)前5棵樹已經(jīng)知道上渴,現(xiàn)在要確定第6個(gè)樹,損失函數(shù)為:
現(xiàn)有一個(gè)樣本喜颁,真實(shí)標(biāo)簽為1稠氮,但是前5棵樹預(yù)測(cè)的值為-1,由于半开,所以對(duì)于該樣本隔披,損失函數(shù)變?yōu)椋?br>
則,
就應(yīng)該是上式對(duì)求導(dǎo)后寂拆,將前5棵樹總預(yù)測(cè)值-1帶入求導(dǎo)后公式锹锰,得到的結(jié)果值:
求導(dǎo)得:
令上式中=-1,帶入后求得-0.27漓库,也就是恃慧。
同理,是二次求導(dǎo)的結(jié)果渺蒿。
通過以上分析可知:
(1)對(duì)于N個(gè)樣本痢士,則會(huì)有N個(gè)與需要求;
(2)每一個(gè)樣本可以求得一個(gè)與一個(gè),所以這里可以以并行的方式求取各個(gè)樣本對(duì)應(yīng)的與(這也是XGBoost快的原因之一)怠蹂;
(3)對(duì)于每棵樹的求取過程中善延,涉及到對(duì)損失函數(shù)的二次求導(dǎo),所以XGBoost可以自定義損失函數(shù)城侧,只需損失函數(shù)二次可微即可豆茫。
此時(shí)炮温,目標(biāo)函數(shù)變?yōu)椋?br>
公式說明:因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=l%5Cleft(y_%7Bi%7D%2C%20%5Chat%7By%7D_%7Bi%7D%5E%7Bt-1%7D%5Cright)" alt="l\left(y_{i}, \hat{y}_{i}^{t-1}\right)" mathimg="1">就是前t-1棵樹與真實(shí)值的一個(gè)誤差值方援,是一個(gè)常量窥浪,故最小化目標(biāo)函數(shù)可以將其移除骨稿。
目標(biāo)函數(shù)中樹復(fù)雜度辙浑,正則項(xiàng)(第二部分):
??上式中,到底是什么?通過前文分析,就是代表一棵樹模型腮介,設(shè)想一下,樹模型就是給定一個(gè)輸入樣本腾节,經(jīng)過模型之后會(huì)將其劃分到某個(gè)葉子節(jié)點(diǎn)上庆冕,并會(huì)給出該葉子節(jié)點(diǎn)預(yù)測(cè)值。所以可以用下式表示:
公式說明:代表一個(gè)樣本輸入之后會(huì)劃分到哪個(gè)葉子節(jié)點(diǎn)上(可以理解為樹的結(jié)構(gòu))劈榨,就是一個(gè)樣本經(jīng)過樹模型之后具體預(yù)測(cè)值访递。
正則項(xiàng):XGBoost定義正則項(xiàng)為:
公式說明:其中代表一棵樹中第個(gè)葉子節(jié)點(diǎn)的預(yù)測(cè)值;T代表一棵樹共有T個(gè)葉子節(jié)點(diǎn)同辣;與是自定義的值拷姿,在使用模型時(shí)可以設(shè)置,如果大旱函,則樹的葉子節(jié)點(diǎn)數(shù)越多响巢,則懲罰越大,則會(huì)懲罰葉子節(jié)點(diǎn)總的預(yù)測(cè)值(理想情況下棒妨,模型是希望一步一步慢慢去逼近真實(shí)值抵乓,而不是一步逼近太多,導(dǎo)致后面可逼近范圍太小)灾炭。
特別說明:上述公式是針對(duì)所有樣本計(jì)算的結(jié)果茎芋。
目標(biāo)函數(shù)再次升級(jí)(關(guān)鍵時(shí)刻):
??通過對(duì)兩部分分析,得到:
公式說明:一定有人會(huì)慌了蜈出,不明白為什么田弥,不要慌,仔細(xì)看下面分析铡原。(1)公式中n表示共有n個(gè)樣本偷厦,T表示待求樹模型共有T個(gè)葉節(jié)點(diǎn);(2)表示樣本經(jīng)過待求樹模型之后的預(yù)測(cè)值燕刻,代表一棵樹中第個(gè)葉子節(jié)點(diǎn)的預(yù)測(cè)值只泼;(3)表示每一個(gè)樣本預(yù)測(cè)值乘以對(duì)應(yīng)的之后的求和(這里在求和過程中會(huì)涉及到每一個(gè)葉子節(jié)點(diǎn));
所以公式轉(zhuǎn)換可以理解為:{先對(duì)每一個(gè)樣本求預(yù)測(cè)值乘以對(duì)應(yīng)的(即)卵洗,然后對(duì)所有的樣本求和(即)}轉(zhuǎn)變?yōu)閧先求所有樣本在第個(gè)葉子節(jié)點(diǎn)上的預(yù)測(cè)值请唱,然后乘以所有樣本在j節(jié)點(diǎn)上的和,最后對(duì)所有節(jié)點(diǎn)求和}
本人能力有些过蹂,對(duì)于這部分暫時(shí)還沒有想到更好的方法來解釋十绑,后續(xù)想到會(huì)持續(xù)更新,如果讀者有什么好的解釋可以告知酷勺,感謝本橙!
對(duì)上述目標(biāo)函數(shù)再一次升級(jí),得:
公式說明:其中與就是在每個(gè)葉子節(jié)點(diǎn)上與在各個(gè)樣本上的求和脆诉。
堅(jiān)持一下甚亭,馬上結(jié)束了。
??我們的最終目的就是使上述的目標(biāo)函數(shù)最小化击胜,則對(duì)上式求導(dǎo)(上式對(duì)變量求偏導(dǎo))亏狰,并使其得0,得:
所以:
帶入原式潜的,得:
公式說明:最終的只是表示一棵樹的預(yù)測(cè)結(jié)果距離真實(shí)值的距離骚揍,與其他值無關(guān)(比如與每個(gè)葉子節(jié)點(diǎn)具體取值無關(guān))字管。
??通過上式啰挪,便可以求出樹的每個(gè)葉子節(jié)點(diǎn)的具體值,但是到這里結(jié)束了嗎嘲叔?還沒有亡呵,還需要求每棵樹到底應(yīng)該以哪個(gè)屬性(特征)的哪個(gè)分割點(diǎn)進(jìn)行劃分。
??在決策樹中是怎么劃分的呢硫戈?可以參考我的另一篇文章文章锰什。總的來看,就是選擇一個(gè)使得劃分之后的數(shù)據(jù)純度提升最大的屬性及分割點(diǎn)汁胆。XGBoost是選擇使得劃分之后損失減小最大(損失值的增益Gain)的屬性及分割點(diǎn)梭姓。
舉例說明:
??例子來源陳天奇大師論文,有興趣讀者可以自行查閱相關(guān)資料嫩码,這里就不再詳細(xì)介紹該例子誉尖。
??如果對(duì)于一棵樹,現(xiàn)在要求屬性為年齡的最佳分割點(diǎn)铸题,如下圖:
從圖中可以看出铡恕,假設(shè)以豎線為分割線,則:
分割前的損失值為:
其中丢间,T=1探熔,劃分之前只有一個(gè)葉子節(jié)點(diǎn)。
分割后的損失值為:
其中T=2烘挫,因?yàn)閯澐种缶妥兂蓛蓚€(gè)葉子節(jié)點(diǎn)诀艰。
則用分割前損失減去分割后損失值,得:
公式說明:該公式代表根據(jù)劃分屬性及劃分節(jié)點(diǎn)對(duì)樣本劃分之后其損失值減小了多少墙牌,所以每次選擇最大的Gain值對(duì)應(yīng)的劃分屬性及劃分節(jié)點(diǎn)即可涡驮,這里求計(jì)算各個(gè)劃分屬性及節(jié)點(diǎn)是并行計(jì)算的。
3喜滨、最后說明
(1)文章開篇已經(jīng)說過捉捅,這里再次強(qiáng)調(diào)。XGBoost中基模型是CART樹虽风,這里的意思只是說基模型中的樹是二叉樹棒口,要與決策樹中CART樹的劃分屬性及劃分節(jié)點(diǎn)的選擇毫無關(guān)系;
(2)模型中既然是對(duì)每次預(yù)測(cè)結(jié)果求和辜膝,則說明每次預(yù)測(cè)結(jié)果是一個(gè)回歸值无牵,而不是類別值,不然求和是無意義的厂抖。
以上內(nèi)容如有理解不當(dāng)茎毁,請(qǐng)指出,謝謝忱辅!另七蜘,文章中有些內(nèi)容來源于一些書籍或其他博客,這里就不一一列舉墙懂,如有侵權(quán)橡卤,請(qǐng)與我聯(lián)系刪除。