GBDT理解二三事
GBDT理解二三事
標(biāo)簽:?算法Gbdt 2015-02-10 16:59?4595人閱讀?評論(5)?收藏?舉報(bào) ?分類: ? 算法學(xué)習(xí)(15)??互聯(lián)網(wǎng)(2)?版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
一、要理解GBDT當(dāng)然要從GB(Gradient Boosting)和DT(Decision Tree)兩個(gè)角度來理解了;
二、GB其實(shí)是一種理念,他并不是這一個(gè)具體的算法,意思是說沿著梯度方向,構(gòu)造一系列的弱分類器函數(shù),并以一定權(quán)重組合起來,形成最終決策的強(qiáng)分類器;注意,這里的梯度下降法是在函數(shù)空間中通過梯度下降法尋找使得LOSS最小的一個(gè)函數(shù),即L(y,f)對f求層,區(qū)別于傳統(tǒng)的梯度下降法選擇一個(gè)方向(對x求導(dǎo));那么問題就來了,對函數(shù)求導(dǎo)?這也太難了吧。所以就有了一個(gè)近似的方法,根據(jù)經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化原則,我們認(rèn)為在訓(xùn)練集上使得LOSS最小的函數(shù),往往在測試集上表現(xiàn)會好,即在訓(xùn)練集上尋優(yōu);因此,把求導(dǎo)的函數(shù)理解成在訓(xùn)練集上該函數(shù)對應(yīng)的離散的函數(shù)值,對函數(shù)求導(dǎo)就變成了對樣本的函數(shù)值向量求導(dǎo);因此就可以得到一個(gè)梯度向量,表示尋找到的最優(yōu)函數(shù), 這個(gè)函數(shù)就是一個(gè)新的弱分類器;
三、通過回歸樹來擬合這個(gè)梯度向量,就得到了DT,而每棵樹就對應(yīng)上面的函數(shù),其預(yù)測值就是函數(shù)值;
四、當(dāng)我們選擇平方差損失函數(shù)時(shí),函數(shù)向量就表示成前一棵回歸樹在樣本空間上的預(yù)測值,則對函數(shù)向量求梯度就等于目標(biāo)值減去預(yù)測值,即我們所說的殘差向量;因此,下一棵回歸樹就是在擬合這個(gè)殘差向量;
五、回歸樹擬合可以通過平均最小均方差來尋找分裂點(diǎn),生成一個(gè)樹;當(dāng)然這棵樹不可能完全擬合得好,因此,又會通過對損失函數(shù)求梯度,得到新的殘差向量;
六、對初始分類器(函數(shù))的選擇就可以直接用0,通過平方差LOSS函數(shù)求得的殘差當(dāng)然就是樣本本身了;也可以選擇樣本的均值;
七、一棵樹的分裂過程只需要找到找到每個(gè)結(jié)點(diǎn)的分裂的特征id與特征值,而尋找的方法可以是平均最小均方差,也可以是使得(左子樹樣本目標(biāo)值和的平方均值+右子樹樣本目標(biāo)值和的平方均值-父結(jié)點(diǎn)所有樣本目標(biāo)值和的平方均值)最大的那個(gè)分裂點(diǎn)與分裂特征值等等方法;從而將樣本分到左右子樹中,繼續(xù)上面過程;
八、用殘差更新每個(gè)樣本的目標(biāo)值:葉子節(jié)點(diǎn)的均值作為落到該葉子節(jié)點(diǎn)的樣本的預(yù)測值,使用目標(biāo)值減去預(yù)測值,得到該樣本的殘差,作為下一棵樹的訓(xùn)練目標(biāo);
九、對于使用logistic作為損失函數(shù)的多分類問題,下面單獨(dú)進(jìn)行推導(dǎo)說明:
1、多分類問題與回歸問題不同,每棵樹的樣本的目標(biāo)就不是一個(gè)數(shù)值了,而是每個(gè)樣本在每個(gè)分類下面都有一個(gè)估值Fk(x);
2、同邏輯回歸一樣,假如有K類,每一個(gè)樣本的估計(jì)值為F1(x)...Fk(x),對其作logistic變化之后得到屬于每一類的概率是P1(x)...pk(x),則損失函數(shù)可以定義為負(fù)的log似然:
可以看出對多分類問題,新的一棵樹擬合的目標(biāo)仍是殘差向量;
3、訓(xùn)練過程如下:
對第一棵樹,可以初始化每個(gè)樣本在每個(gè)分類上的估計(jì)值Fk(x)都為0;計(jì)算logistic變換pk(x),計(jì)算殘差向量,作為當(dāng)前樹的回歸的目標(biāo),回歸樹的分裂過程仍可采用【左子樹樣本目標(biāo)值(殘差)和的平方均值+右子樹樣本目標(biāo)值(殘差)和的平方均值-父結(jié)點(diǎn)所有樣本目標(biāo)值(殘差)和的平方均值】最大的那個(gè)分裂點(diǎn)與分裂特征值等方法;當(dāng)回歸樹的葉子節(jié)點(diǎn)數(shù)目達(dá)到要求示,則該樹建立完成;對每個(gè)葉子節(jié)點(diǎn),利用落到該葉子節(jié)點(diǎn)的所有樣本的殘差向量,計(jì)算增益rjkm;更新每一個(gè)樣本的估計(jì)值Fk(x);因此,又可以對估計(jì)進(jìn)行l(wèi)ogistic變化,利用樣本的目標(biāo)值計(jì)算殘差向量,訓(xùn)練第二棵樹了;
4、注意樣本的估計(jì)值Fk(x)是前面所有樹的估值之和,因此,計(jì)算殘差時(shí),用樣本的目標(biāo)值減去Fk(x)就可以得到殘差了;
十、GBDT并行化:
1、按行并行化,將樣本按行分成N份,分別在N個(gè)節(jié)點(diǎn)上做計(jì)算;
2、并行建立一棵的過程:
1>在0號節(jié)點(diǎn)上對特征隨機(jī)采樣,生成建立一棵樹需要用到的特征,并分發(fā)到N個(gè)節(jié)點(diǎn)上;
2>在0號結(jié)點(diǎn)上維護(hù)每一維采樣特征所有可能的特征值;
3>將每一維特征的每一個(gè)可能的特征值分發(fā)到N個(gè)節(jié)點(diǎn)上;
4>每一個(gè)節(jié)點(diǎn)并行計(jì)算該節(jié)點(diǎn)上所有樣本與分發(fā)得到的特征值的比較結(jié)果,分割成左右子樹,并計(jì)算增益;
5>歸并所有節(jié)點(diǎn)的增益,在0號結(jié)點(diǎn)得到每一個(gè)特征在每一個(gè)特征值的增益(f,v,incr);
6>在0號結(jié)點(diǎn)上找出最大的(f,v,incr),并作為本次的最佳裂點(diǎn),分發(fā)到N個(gè)節(jié)點(diǎn)上;
7>N個(gè)節(jié)點(diǎn)將樣本分割成左右子樹;
8>對左右子樹繼續(xù)上面過程,直到葉子節(jié)點(diǎn)數(shù)目滿足要求;
3、并行建立第二棵樹;
因此,GBDT并行化包括了樣本并行化與特征分裂點(diǎn)計(jì)算的并行化;其中最耗時(shí)的仍然是需要遍歷特征的所有可能的特征值,并計(jì)算增益尋找最優(yōu)分裂點(diǎn)的過程;可以采用對特征值直方圖采樣,不用遍歷所有特征值來優(yōu)化。
這里參考了http://www.cnblogs.com/leftnoteasy/archive/2011/03/07/random-forest-and-gbdt.html對分類問題的解釋,寫得非常好,treelink里面的代碼基本就是按照這個(gè)流程實(shí)現(xiàn)的。
總結(jié)
- 上一篇: 机器学习系列(8)_读《Nature》论
- 下一篇: Gradient Boost 算法流程分