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