樹算法系列之三:GBDT

1.GBDT(Gradient Boosting Decison Tree)梯度提升樹

GBDT與提升樹有非常密切的關係。爲方便閱讀本文,可以先參考提升樹一文。

在提升樹一文中,我們提到每一輪迭代,都是去擬合上一輪的"殘差",如果用一個簡單的公式表示就是yifm1(x)y_i - f_{m-1}(x)

GBDT與上面普通提升樹的不同在於,其擬合的不是殘差,而是梯度下降的方向。也就是將殘差的計算替換爲損失函數梯度的計算:
rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)\large {r_{mi}} = -\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)}

如果損失函數爲MSE, 損失函數爲L(yi,f(xi))=12(yif(xi))2L(y_i,f(x_i)) = \frac{1}{2}(y_i - f(x_i))^2,此時模型的負梯度方向即爲殘差方向rmi=yif(xi)r_{mi} = y_i - f(x_i)

如果將GBDT名字拆開比較好理解,包含了三個關鍵的部分
1.G(Gradient) 梯度(殘差)
2.B(Boosting) 提升方法,即爲加法模型與前向分佈算法
3.DT(Decision Tree) CART迴歸樹,弱學習器。

所以將GBDT算法的流程做個總結如下:
一、初始化
f0(x)=argminci=1NL(yi,c)f_0(x) = argmin_c \sum_{i=1}^N L(y_i, c)
使損失函數最小,其只是一個根節點的樹。
二、對m=1, 2, …M
2.1 計算梯度(殘差)
rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)\large {r_{mi}} = -\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)}
即將損失函數的負梯度在當前模型的值,將它作爲殘差的估計(如果是MSE,就是通常意義所說的殘差。如果是其他損失函數,則爲殘差的近似)
2.2 得到一個新的迴歸樹T(x;θm)T(x;\theta_m)
2.3 更新fm(x)=fm1(x)+T(x;θm)f_m(x) = f_{m-1}(x) + T(x; \theta_m)
三、得到最終的模型
fM(x)=m=1MT(x;θm)f_M(x) = \sum_{m=1}^M T(x; \theta_m)

2.GBDT與提升樹的關係

提升樹每一次所謂的提升過程,都是通過上次的預測結果與真實值的差值作爲新的訓練數據進行訓練。因爲CART樹默認的損失函數爲MSE,所以直接使用殘差進行計算。
而GBDT針對的是更爲一般的損失函數,所以用負梯度近似代替殘差,將上次預測結果代入梯度中來獲取本輪的訓練數據。
本質上是在生成新的訓練數據的時候採用了不同的方式。

3.GBDT與傳統Boosting方法的區別

GBDT每次的計算是爲了減小上一次的殘差(residual)。而爲了消除殘差,可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。因此在Gradient Boosting中,每個新的模型的建立是爲了使得之前模型的殘差往梯度方向減少。而傳統Boosting的方法是對正確,錯誤樣本進行不同程度加權有比較大的區別。

4.GBDT爲什麼精度比較高

西瓜書(周志華老師出品的機器學習)中對此有解釋:Boosting主要關注降低偏差,因此Boosting能基於泛化性能相當弱的學習器構建出很強的集成;Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網絡等學習器上效用更爲明顯。

5.GBDT優缺點

優點
1.可以靈活處理各種類型數據,包括連續值與離散值。
2.非線性能力比較強,表達能力強,不需要做複雜的特徵工程和特徵變換。
3.在相對較少調參的情況下,可以達到比較高的精度。
4.可解釋性強,可以自動做特徵重要性排序。因此在深度學習火熱以前,常作爲`發現特徵組合‘的有效思路。
5.使用一些健壯的損失函數,對異常值的魯棒性較高。比如Huber loss。

缺點
1.boost訓練是串行過程,不好並行化。
2.計算複雜度高,不太適合高維稀疏特徵,如果feature個數太多,每一棵迴歸樹都要耗費大量時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章