gbdt由一系列的回歸樹組成,如下圖所示(樹的深度未必都要一樣,下圖僅為示意圖)。
gbdt原理
針對每乙個類別訓練一系列的回歸樹,再累加每個類別回歸樹的**值得到針對每個類別的最終的**值。單獨拿乙個類別來說,訓練的過程中假設需要**的值為f(
xi) ,實際的值為yi
,有loss function l(
yi,f
(xi)
) ,f(
xi) 為引數。訓練的過程就是讓loss function最小化的過程。最小化可以通過梯度下降完成,令loss function對引數f(
xi) 求梯度有 gf
(x)=
∂l(y
i,f(
xi))
∂f(x
i)那麼,只要引數f(
xi) 不斷往梯度方向變化,loss function就會減小直至收斂。即每一次迭代為 f(
xi)t
+1=f
(xi)
t−η∗
gf(x
)(1)
其中η 為學習率。
假設第一棵回歸樹t1
的**值為f(
xi)0
,對這一時刻的引數f(
xi)0
求梯度,得到gf
(x)0
,因為梯度是根據訓練樣本中的實際值yi
得到的,**未知樣本時,並沒有實際的yi
,因此需要估計這一時刻的梯度gf
(x)0
,這就需要通過第二棵回歸樹來擬合。故利用根據訓練樣本求得的梯度值gf
(x)0
作為目標值,利用訓練樣本再訓練一棵回歸樹t2
,並用t2
再求一遍梯度g′
,之後更新引數得到f(
xi)1
。以此類推,迭代直到得到給定數目的回歸樹。
此時這一系列的回歸樹t1
,t2,
...,
tn的**值累加後得到f(
xi)n
,可以令loss function足夠小,也就得到了乙個訓練好的gbdt模型。
選取不同的loss function可以達到不同的目的,比如對於信用模型需要分類的情形,loss function為deviance,對應的梯度為 i(
yi=g
k)−p
k(xi
) pk
表示樣本xi
屬於第k 個類別的概率,通過softmax方法求得。因為有
k個類別,所以得到
k 個系列的回歸樹,每個系列最終的**值分別為f1
(x),
f2(x
),..
.,fk
(x),具體計算公式如下所示 pk
(x)=
efk(
x)∑k
l=1e
fl(x
) i(
·)為指示函式。也就是當**第k個類別概率時,如果真實類別恰好為該類別,梯度為1−
pk(x
i),否則為−p
k(xi
) 。所以後一棵樹擬合的也就是之前**值的殘差。
gbdt的正則化
訓練的過程可以指定需要
m 棵回歸樹,新的回歸樹不斷擬合之前的殘差,在訓練集上的誤差可能逐漸變為0,導致過擬合。gbdt也有相應避免過擬合的方法。如
1. early stopping策略,保留乙個驗證集,每增添一棵樹通過驗證集測試誤差是否下降,當增添一定數目的樹時驗證誤差不再下降的時候,就可以終止迭代了,得到m∗
棵回歸樹。
2. shrinkage,也就是減小每一棵回歸樹對**值得貢獻。這就對應上了公式(1
) 中的學習率
η ,
0<
η<
1 ,比較小的學習率會導致需要更多的回歸樹,也就是更大的m∗
,根據經驗,最好的策略是選取較小的
η ,(η
<
0.1)
,然後通過early stopping選取m∗
。 3. 二次抽樣,即在擬合一棵新的回歸樹時,不用完全的樣本集,而僅是無放回的抽樣其中的部分,通常為12
,對於大的資料集,抽樣的比例可以小於12
。subsampling的方式可以避免過擬合,同樣地,更小的訓練集也可以更快的完成訓練。
對 threadfence的一點理解
一直沒搞清楚,cuda 2.2版增加的 threadfence到底有何作用,直到今天看到sdk 3.0手冊 中的下面例子才恍然大悟.中文為我的理解,嘿嘿 乙個求和的例子 device unsigned int count 0 統計有幾個block結束的變數 shared bool islastblo...
對block的一點理解
對block的理解 block宣告的寫法 property strong,nonatomic void block void property copy,nonatomic void block void block的本質 就是oc的物件,內部也有isa指標,block是封裝了函式呼叫以及函式呼叫環...
對索引的一點理解
以前在網上看到一些觀點,in 或者not in 都不會用到索引,昨天在優化sql的時候,發現這些觀點並不對 select from wf doc gw fawen f where f.cfbt ee and f.ndocid in select distinct gi.src ndocid from...