GBDT算法推導過程
m次迭代,n個類別,那么就意味着學習了m*n棵回歸樹
train過程:假設有8個訓練樣本,3個類別
步驟一、假設所有樣本的F矩陣,F矩陣是8*3的,F矩陣剛開始全為0,而實際每個樣本都有一個屬於的類別y,y能組成一個實際的矩陣也是8*3的
步驟二、決策樹是不斷學習殘差的過程,這里的殘差經過計算是y-p,其中p是由F矩陣求出來的,即
這里要知道決策樹的分裂依據:遍歷所有的特征緯度,這里是3個特征,對於每一個特征,選擇一個合適的分裂點,
如果屬性是數字
也就是遍歷所有那個屬性的值,eg[10,20,30,40,50,60,70]然后分類節點假設是3個的話就需要從中隨機采樣3個數據作為屬性,eg[20,40,60],那么在這個屬性進行遍歷的時候就可以以該點的值作為分界限,分割左右子樹
如果屬性是標量
就直接按照節點屬性是否等於標量為分界線,分隔左右子樹
如何選擇最佳屬性和最佳分隔點:
我們已經將樹分隔成了左右子樹了,那么怎么從那么多的分隔中選擇最佳的分隔點呢
這里,leftTargets,rightTargets都是左右子樹樣本點的殘差,也就是前面的y-p的值,所以這里分隔的依據是:選擇左右子樹損失函數在當前模型的梯度的均方根誤差和最小
節點分類的依據是:均方根誤差(RMSE),均方根誤差為了說明樣本的離散程度
eg,第一組樣本:3,4,5
第二組樣本:2,4,6
兩組的平均值都是4,但是第一組相對更加接近平均值,離散程度小,均方根誤差就表示這個
這樣一直分割下去,只要不超過最大深度,一直到達葉子節點
這里用均方根誤差,就是讓屬於同一特性的被分到一起,減少離散
葉子節點的值:
其中:
建立好一棵樹后,需要更新F矩陣,
接着再更加F矩陣和y矩陣重新計算殘差,重新生成新的樹,這樣迭代M次,F矩陣是在不斷地逼近y矩陣的(注意,這里的3個類的決策樹是同時進行的,也就是一次迭代,生成的是3棵樹,如下代碼所示:
測試
將測試樣本輸入到m*n棵樹中,每個類別是m棵樹,不斷累加這m棵樹的的結果就是最終的f[instance_id]的值,然后選擇值最大的f作為最終的label
公式推導部分:
簡言之:最小化目標函數,泰勒展開,f’(x)=0求得葉子節點的值,x=-f'(0)/f"(0),其實也是牛頓法在初值為0的
時候下一個更新值(或者在x=0處泰勒展開到二階,然后求導,也能得到x=-f'(0)/f"(0)),這里實際是求f'(x)=0的x對應的值,對於多類的葉子節點中的k-1/k,自己沒有推出,后面的公式是對應的
兩個版本之間的聯系
前面我們提到的一些聯系,這兒再總結一下:
- 基於殘差的版本四把殘差作為全局方向,偏向於回歸的應用。而基於梯度的版本是把代價函數的梯度方向作為更新的方向,適用范圍更廣。
- 如果使用Logistic函數作為代價函數,那么其梯度形式和殘差的形式類似,這個就說明兩個版本之間是緊密聯系的,雖然實現的思路不同,但是總體的目的是一樣的。或者說殘差版本是梯度版本的一個特例,當代價函數換成其余的函數,梯度的版本仍是適用的。
關於gbdt時間復雜度的計算:
針對每個特征,把屬於該節點的訓練樣本根據該特征值升序排列,通過線性掃描的方式來決定該特征的最佳分裂點,並記錄該特征的最大收益(采用最佳分裂點時的收益)
時間復雜度nlogn * d * m(n是樣本個數,d是特征個數,m是樹的深度)
論文名字:
Greedy function approximation : A Gradient Boosting Machine
原文:http://www.cnblogs.com/wuxiangli/p/5973737.html