gbdt和xgboost是非常非常常用的數(shù)據(jù)挖掘算法,常用到什么程度呢鸯隅,你要是去參加面試澜建,肯定有人會(huì)問(wèn)你用過(guò)xgboost嗎?能說(shuō)出來(lái)gbdt滋迈、xgboost霎奢、lightgbm的區(qū)別嗎?當(dāng)然很多從事數(shù)據(jù)挖掘工作的小伙伴肯定不能認(rèn)慫饼灿,要說(shuō)用過(guò)幕侠,但是轉(zhuǎn)念一想你們是不是只調(diào)用過(guò)gbdt和xgboost的包,對(duì)于他們?cè)趺从?jì)算出最終結(jié)果卻一無(wú)所知碍彭,當(dāng)然嘛工作中效果好就行了嗎晤硕,管那么多原理,但真正理解原理才能知道怎么去優(yōu)化這個(gè)模型庇忌。
今天就用通俗易懂的語(yǔ)言帶大家去徹底了解這兩個(gè)模型舞箍,因?yàn)檫@兩個(gè)模型有一個(gè)遞進(jìn)的關(guān)系,xgboost實(shí)際是對(duì)gbdt的優(yōu)化皆疹,先從gbdt說(shuō)起疏橄,然后再說(shuō)xgboost。
1 gbdt模型結(jié)果的計(jì)算
gbdt的基分類器是cart,因此可以用于回歸和分類問(wèn)題捎迫,如果你愿意還可以擬合一個(gè)模型樹出來(lái)晃酒。
1.1 回歸問(wèn)題
如果你工作中更多面對(duì)的是回歸任務(wù),那么你應(yīng)該慶幸窄绒,因?yàn)榛貧w問(wèn)題的損失函數(shù)表示簡(jiǎn)單贝次,要么是絕對(duì)誤差,要么是均方損失誤差彰导,要么是二者的結(jié)合蛔翅,采用梯度下降的時(shí)候求導(dǎo)都特別簡(jiǎn)單,尤其是最常用的均方損失誤差位谋,采用梯度擬合實(shí)際就是對(duì)殘差進(jìn)行擬合山析,理解起來(lái)毫不費(fèi)力。
以預(yù)測(cè)年齡為例先說(shuō)一下gbdt做回歸的流程:
(1)明確回歸的指標(biāo)和目標(biāo)倔幼,指標(biāo)是你現(xiàn)有的特征集合盖腿,目標(biāo)是要擬合的數(shù)值,這個(gè)數(shù)值是連續(xù)的损同,此處年齡這個(gè)變量就是連續(xù)的翩腐,假設(shè)有三個(gè)樣本,年齡分別為25膏燃、26茂卦、27,你現(xiàn)在的目標(biāo)就是盡可能準(zhǔn)確的預(yù)測(cè)出來(lái)這三個(gè)人的歲數(shù)组哩。
(2)確定損失函數(shù)等龙,這個(gè)地方我認(rèn)為是非常重要的,有人對(duì)損失函數(shù)的理解可能不夠深伶贰,損失函數(shù)最大的作用是確定梯度下降時(shí)的梯度方向蛛砰,回歸問(wèn)題一般采用MSE(均方誤差損失),它求完導(dǎo)梯度實(shí)際就是殘差黍衙。
(3)擬合一顆cart樹泥畅,怎么擬合呢,我們不是有三個(gè)數(shù)據(jù):
[特征1琅翻,特征2位仁,…,特征n方椎,25]聂抢、
[特征1,特征2棠众,…琳疏,特征n,26]、
[特征1空盼,特征2疮薇,…,特征n我注,27]。
就拿這三個(gè)數(shù)據(jù)根據(jù)特征迟隅,遍歷數(shù)據(jù)特征取值去劃分cart樹但骨,由于是回歸問(wèn)題,劃分標(biāo)準(zhǔn)為所有樣本的均方誤差損失最兄窍(這部分不懂去看看cart樹吧奔缠,原理很簡(jiǎn)單),每一輪選擇一個(gè)特征進(jìn)行劃分吼野,知道所有樣本都落入葉子節(jié)點(diǎn)校哎,我們假設(shè)25在一個(gè)葉子節(jié)點(diǎn),26瞳步、27在一個(gè)葉子節(jié)點(diǎn)上闷哆,取均值就是這個(gè)葉子節(jié)點(diǎn)的得分值。
(4)計(jì)算當(dāng)前預(yù)測(cè)值单起,gbdt是殘差擬合抱怔,這一輪得到的預(yù)測(cè)值是之前所有樹的加和,有了這個(gè)加和就可以計(jì)算損失函數(shù)了嘀倒。實(shí)際上這里還有一個(gè)學(xué)習(xí)率屈留,這個(gè)學(xué)習(xí)率就是控制迭代速度的,太大了容易錯(cuò)過(guò)最優(yōu)點(diǎn)测蘑,太小了就導(dǎo)致收斂速度慢灌危。
(5)根據(jù)損失函數(shù)的形式計(jì)算梯度方向,采用MSE梯度方向就是偏差碳胳,就是說(shuō)下次用于預(yù)測(cè)的數(shù)據(jù)變成了勇蝙,
[特征1,特征2固逗,…浅蚪,特征n,0]烫罩、
[特征1惜傲,特征2,…贝攒,特征n盗誊,-0.5]、
[特征1,特征2哈踱,…荒适,特征n,0.5]开镣。
(6)重復(fù)3-5刀诬,直到達(dá)到預(yù)先設(shè)計(jì)的最大的基分類器數(shù)目或者cart樹已經(jīng)滿足收斂了就跳出來(lái)。
可以看出來(lái)邪财,在回歸問(wèn)題中葉子節(jié)點(diǎn)的得分值就是所有位于該葉子節(jié)點(diǎn)的樣本均值陕壹,最后的預(yù)測(cè)結(jié)果怎么得到呢,就是某個(gè)樣本X在每顆cart樹上對(duì)應(yīng)葉子節(jié)點(diǎn)的加和值树埠,我好像一個(gè)公式都沒放糠馆,這里放一個(gè)吧:
就說(shuō)了不愛放公式,還得多余解釋怎憋,這個(gè)m=1:M就是M個(gè)基分類器求和又碌,講j=1:J是第m顆上的葉子節(jié)點(diǎn)編號(hào),這個(gè)I就是單位矩陣绊袋,啥意思這個(gè)樣本在葉子節(jié)點(diǎn)上就取1毕匀,不在就取0唄,cmj更簡(jiǎn)單了癌别,就是上面說(shuō)的葉子節(jié)點(diǎn)得分值期揪。
簡(jiǎn)單的理解,gbdt回歸問(wèn)題就是一個(gè)累積計(jì)算的過(guò)程规个,沒一點(diǎn)技術(shù)含量凤薛,會(huì)加法就能算,估計(jì)小學(xué)數(shù)學(xué)水平就夠了诞仓。
1.2 分類問(wèn)題
分類問(wèn)題比較有意思缤苫,也是我們工作中最長(zhǎng)遇到的場(chǎng)景,比如識(shí)別異常用戶等墅拭,這個(gè)分類又包括了二分類和多分類問(wèn)題活玲,二分類比較簡(jiǎn)單,關(guān)于多分類有很多處理方法谍婉,什么一對(duì)一舒憾、一對(duì)多策略等,說(shuō)白了就是要么轉(zhuǎn)換成多個(gè)二分類問(wèn)題穗熬,要么直接用多分類的方法去解決镀迂。二分類簡(jiǎn)單,先說(shuō)二分類吧唤蔗,再說(shuō)多分類探遵。
(1)二分類問(wèn)題
為啥說(shuō)二分類問(wèn)題簡(jiǎn)單窟赏,因?yàn)槎诸悊?wèn)題,類似于邏輯回歸箱季,直接用sigmoid函數(shù)就可以得到最終的類別歸屬概率涯穷。分類問(wèn)題的損失函數(shù)形式很多的,根據(jù)目標(biāo)變量表示的不同(0,1表示或-1,1表示)還有不同的形式藏雏,最常用的形式包括對(duì)數(shù)和指數(shù)以及二者之間的結(jié)合等拷况,還有人把回歸的MSE拿到分類問(wèn)題來(lái)一樣可以用。為啥強(qiáng)調(diào)損失函數(shù)呢掘殴,因?yàn)樵趃bdt中殘差擬合蝠嘉,梯度就是下一代要擬合的值,所以重要杯巨。
接下來(lái),放個(gè)圖努酸,這個(gè)圖是大招服爷,講的就是gbdt分類的流程,但是是一個(gè)多分類問(wèn)題的圖获诈,本來(lái)放到下面講的仍源,但是這里為了說(shuō)明方便先拿出來(lái)。二分類是多分類的一個(gè)特例舔涎,所以這個(gè)圖也適用笼踩。
基本你看一篇gbdt算法的文章就有這個(gè)偽代碼,但是沒人愿意給你解釋亡嫌,我一行行說(shuō)吧:
row1:K分類個(gè)數(shù)嚎于,K=2就是二分類問(wèn)題。
row2:M基分類器個(gè)數(shù)挟冠,就是你要訓(xùn)練幾顆樹出來(lái)
row3:計(jì)算屬于每一類的概率于购,softmax函數(shù)
row4:對(duì)于多分類問(wèn)題,每次迭代都訓(xùn)練和類別相同的樹知染,但是對(duì)于二分類問(wèn)題就不用這么麻煩了肋僧,多分類問(wèn)題會(huì)形成M*K顆樹。所以這里再嵌套一層循環(huán)控淡。
row5:計(jì)算殘差了
row6:拿特征值和當(dāng)前殘差值用cart擬合樹了
row7:根據(jù)損失函數(shù)計(jì)算當(dāng)前葉子節(jié)點(diǎn)的得分值嫌吠,觀察一下這個(gè)應(yīng)該是交叉熵?fù)p失函數(shù)的導(dǎo)數(shù)計(jì)算而來(lái)的,應(yīng)該是用了二階泰勒展開掺炭。具體是啥不重要辫诅,重要的是你要會(huì)套公式。雖然我不關(guān)注咋算的涧狮,但是你們可以看看這篇文章了解一下:公式推導(dǎo)泥栖,數(shù)學(xué)不好的慎點(diǎn)簇宽。
row8:更新預(yù)測(cè)值,也是累加吧享,沒啥好說(shuō)的魏割。
好勒,這里可以說(shuō)下二分類問(wèn)題的流程了:
1)明確分類的指標(biāo)和目標(biāo)钢颂,假設(shè)有三個(gè)樣本钞它,要預(yù)測(cè)是不是喜歡看電影,用0-1表示殊鞭,你現(xiàn)在的目標(biāo)就是盡可能準(zhǔn)確的預(yù)測(cè)出來(lái)這三個(gè)人到底愛不愛看電影遭垛。
2)確定損失函數(shù),二分類的損失函數(shù)一般是交叉熵?fù)p失操灿,寫起來(lái)就是下面這樣:
這個(gè)損失函數(shù)咋來(lái)的去看邏輯回歸說(shuō)的比較清楚锯仪,我就不啰嗦了,有人嫌他麻煩趾盐,給簡(jiǎn)化了:
3)擬合一顆cart樹庶喜,這里有一個(gè)最重要的問(wèn)題就是初始的F值怎么計(jì)算,大神用0救鲤,我們直接用類別占比久窟。接下來(lái)和回歸樹一樣,我們不是有三個(gè)數(shù)據(jù):
[特征1本缠,特征2斥扛,…,特征n丹锹,1]稀颁、
[特征1,特征2楣黍,…峻村,特征n,0]锡凝、
[特征1粘昨,特征2,…窜锯,特征n张肾,0]。
就拿這三個(gè)數(shù)據(jù)根據(jù)特征锚扎,遍歷數(shù)據(jù)特征取值去劃分cart樹吞瞪,這里樹的分裂準(zhǔn)則,分類問(wèn)題啊一般是用GINI系數(shù)的驾孔,但是考慮到MSE比較好理解芍秆,也可以用MSE惯疙,推薦用MSE,因?yàn)楹?jiǎn)單妖啥。每一輪選擇一個(gè)特征進(jìn)行劃分霉颠,知道所有樣本都落入葉子節(jié)點(diǎn)。我們假設(shè)樣本1荆虱、2在一個(gè)葉子節(jié)點(diǎn)上蒿偎,樣本3在一個(gè)葉子節(jié)點(diǎn)上,你本來(lái)可以取均值獲得這個(gè)葉子節(jié)點(diǎn)的得分值的怀读,但是遺憾的是你的損失函數(shù)是交叉熵?fù)p失函數(shù)诉位,你嚴(yán)格按照公式算吧,記得要先算梯度菜枷。公式是這個(gè)東西:
4)計(jì)算當(dāng)前預(yù)測(cè)值苍糠,gbdt是殘差擬合,這一輪得到的預(yù)測(cè)值是之前所有樹的加和啤誊,用這個(gè)公式算岳瞭。
5)根據(jù)當(dāng)前預(yù)測(cè)值和損失函數(shù)的形式計(jì)算梯度方向,得到梯度值坷衍,更新用于訓(xùn)練樣本的目標(biāo)值,具體就不算了条舔,反正你知道這個(gè)值更新了就好了枫耳。
6)重復(fù)3-5,直到達(dá)到預(yù)先設(shè)計(jì)的最大的基分類器數(shù)目或者cart樹已經(jīng)滿足收斂了就跳出來(lái)孟抗。
然而迁杨,跳出來(lái)是跳出來(lái)了,你現(xiàn)在只有一個(gè)得分值凄硼,還沒轉(zhuǎn)化為分類概率呢铅协。這個(gè)別慌坏平,二分類嘛盛卡,用sigmoid函數(shù)帶入最終累積的函數(shù)得分值就是該樣本為類別1的概率,你再設(shè)置一個(gè)閾值峡懈,分類一下就做好了说墨。
總結(jié)一下骏全,根據(jù)損失函數(shù)的不同,gbdt分類的樣本得分值是不同的尼斧,梯度方向也是不同的姜贡,這兩部分你了解了是咋回事,二分類問(wèn)題就明明白白了棺棵。
此處是不是想有個(gè)例子楼咳,但是我懶啊熄捍,我只講原理,不過(guò)這位大哥不懶你們參考我說(shuō)的去看他的案例:gbdt二分類案例母怜。
(2)多分類問(wèn)題
上面我說(shuō)了多分類的原理了余耽,二分類實(shí)際是一種特殊的多分類問(wèn)題,多分類和二分類不同之處主要有2點(diǎn):
1)訓(xùn)練樹的顆數(shù)不同糙申,二分類每一代你訓(xùn)練一顆樹就行了宾添,但是多分類不行,每一代針對(duì)每一個(gè)類別都要訓(xùn)練一棵樹柜裸,最終得到了M*K顆樹缕陕,這里有一個(gè)疑問(wèn)是怎么根據(jù)類別訓(xùn)練樹。這個(gè)就是目標(biāo)函數(shù)的不同了疙挺,采用0-1編碼表示樣本屬于哪一個(gè)類別扛邑,在訓(xùn)練屬于這個(gè)類別的樹時(shí),目標(biāo)函數(shù)值就是1铐然,不屬于這顆樹的時(shí)候蔬崩,目標(biāo)函數(shù)值就是0。怎么訓(xùn)練樹和二分類一樣搀暑,用cart就行沥阳。
2)最后確定分類的公式不一樣了,回憶二分類問(wèn)題自点,每一個(gè)樣本在每一棵樹上都有一個(gè)得分值桐罕,計(jì)算公式上邊也說(shuō)了,也不廢話了桂敛,最后完成多輪迭代后功炮,我們有了一個(gè)總計(jì)的最終得分值,現(xiàn)在劃分類別了术唬,用softmax函數(shù)薪伏,計(jì)算出概率值后,選最大的那個(gè)作為預(yù)測(cè)分類粗仓,當(dāng)然了每一代的預(yù)測(cè)分類都是根據(jù)累計(jì)目標(biāo)函數(shù)計(jì)算的嫁怀。
很遺憾,多分類暫時(shí)沒有案例給你們看借浊。
2 xgboost模型結(jié)果的計(jì)算
這部分今天太累了不更新了眶掌。
----2019.8.7更新----
拖了好久了,今天來(lái)更新巴碗。
2.1 回歸問(wèn)題
回歸問(wèn)題永遠(yuǎn)是最好理解的問(wèn)題朴爬,和GBDT一樣,這個(gè)也是殘差預(yù)測(cè)橡淆,每一代葉子節(jié)點(diǎn)的得分值是當(dāng)前的殘差召噩,如果要算當(dāng)前的預(yù)測(cè)值得話就拿前一代累積得分值加上當(dāng)前的得分值母赵,就是最終的預(yù)測(cè)結(jié)果,當(dāng)然如果你設(shè)置了得分率具滴,需要乘上得分率凹嘲。我們來(lái)看公式:
如果有學(xué)習(xí)率,把學(xué)習(xí)率乘到那兩個(gè)求和符號(hào)前邊构韵。
至于這個(gè)c怎么計(jì)算的周蹭,xgboost和gbdt不一樣的,xgboost怎么算的疲恢,你過(guò)去看看我這篇文章xgboost原理凶朗,其實(shí)就是參數(shù)的計(jì)算方法,一系列推導(dǎo)展開的显拳∨锓撸回歸問(wèn)題都這樣,就不多說(shuō)了杂数。
2.2 分類問(wèn)題
在說(shuō)分類問(wèn)題之前宛畦,給大家一個(gè)提示。
xgboost這個(gè)包有原生和sklearn兩個(gè)接口揍移,具體怎么區(qū)分呢:
原生接口:
舉個(gè)例子
import xgboost as xgb
params = {
'eta':0.1,
'max_depth':2,
'min_child_weight':3,
'gamma':0,
'subsample':.8,
'colsample_bytree':.7,
'reg_alpha':1,
'objective':'reg:linear'
}
dtrain = xgb.DMatrix(xtrain,ytrain)
dtest = xgb.DMatrix(xtest,ytest)
watchlist1 = [(dtrain,'train'),(dtest,'test')]
model1 = xgb.train(params=params,dtrain=dtrain,num_boost_round=100,early_stopping_rounds=10,evals=watchlist1)
這是原生的次和,數(shù)據(jù)需要整理成它要求的樣子,直接調(diào)用包的train函數(shù)進(jìn)行訓(xùn)練那伐。
sklearn接口:
from xgboost.sklearn import XGBRegressor
model2 = XGBRegressor(
learn_rate = 0.1,
max_depth = 2,
min_child_weight = 3,
gamma = 0,
subsample = 0.8,
colsample_bytree = 0.7,
reg_alpha = 1,
objective = 'reg:linear',
n_estimators = 100
)
watchlist2 = [(xtrain,ytrain),(xtest,ytest)]
model2.fit(xtrain,ytrain,eval_set=watchlist2,early_stopping_rounds=10)
sklearn接口就簡(jiǎn)單多了踏施,跟你平時(shí)用sklearn的其他算法是一樣的。
為什么說(shuō)這個(gè)喧锦,因?yàn)槎咴诮Y(jié)果輸出是有區(qū)別的读规。
不管是多分類還是二分類任務(wù)抓督,我直接說(shuō)了燃少。
- 原生接口,返回的是概率值铃在,這個(gè)概率值是每一個(gè)樣本在每一棵樹上得分加種后阵具,采用softmax歸一化的值。
- sklearn定铜,返回的事類別阳液,它直接以0.5為閾值進(jìn)行劃分,當(dāng)然為了給你創(chuàng)造空間揣炕,還提供了predict_proba 函數(shù)返回預(yù)測(cè)概率值帘皿。