1. 集成學習(Ensemble Learning)原理
2. 集成學習(Ensemble Learning)Bagging
3. 集成學習(Ensemble Learning)隨機森林(Random Forest)
4. 集成學習(Ensemble Learning)Adaboost
5. 集成學習(Ensemble Learning)GBDT
6. 集成學習(Ensemble Learning)算法比較
7. 集成學習(Ensemble Learning)Stacking
1. 前言
如果讀了我之前的幾篇集成學習的博文,相信讀者們已經都對集成學習大部分知識很有了詳細的學習。今天我們再來一個提升,就是我們的集大成者GBDT。GBDT在我們的Kaggle的比賽中基本獲得了霸主地位,大部分的問題GBDT都能獲得異常好的成績。
2. GBDT原理
GBDT的中文名叫梯度提升樹,GBDT也是集成學習Boosting家族的成員,但是卻和傳統的Adaboost有很大的不同。回顧下Adaboost,我們是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪輪的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱學習器限定了只能使用CART回歸樹模型,同時迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假設我們前一輪迭代得到的強學習器是\(f_{t-1}(x)\), 損失函數是\(L(y,f_{t-1}(x))\),我們本輪迭代的目標是找到一個CART回歸樹模型的弱學習器\(h_t(x)\),讓本輪的損失函數\(L(y,f_t(x)=L(y,f_{t-1}(x)+h_t(x))\)最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失盡量變得更小。即梯度提升樹是用CART樹去擬合前一個弱模型的損失函數的殘差,使得本輪的損失更小。
3. 提升樹
回歸問題提升樹的前向分步算法:
假設第\(m\)個模型是\(f_m(x)\),則有以下公式
有了模型函數后,我們就得到了損失函數:
其中的\(T(x,\theta)\)需要用CART樹去擬合,而\(r_{m-1}\)是上一個學習器的損失的殘差。
我們舉個例子,假設損失函數是平方損失函數:
則第\(m\)個模型的損失函數
4. 梯度提升樹
前面的提升樹利用加法模型和前向算法進行,當損失函數是平方損失或者指數損失的時候,很好推算,但是對於一般的損失函數,就比較難處理。這時候我們可以利用最速下降法來近似,關鍵是利用了損失函數的負梯度在當前模型的值:
輸入:是訓練集樣本\(T={(x_1,y_1),(x_2,y_2),...(x_N,y_N)}\), 最大迭代次數\(M\), 損失函數\(L\)。
輸出:強學習器\(f_M(x)\)
- 初始化弱學習器
- 對迭代輪數\(m=1,2,...M\)有:
- 對樣本\(i=1,2,...,N\),計算負梯度\(r_{mi} \approx -\bigg[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;(x)}\)
- 利用\((x_i,r_{mi})(i=1,2,..N)\), 擬合一顆CART回歸樹,得到第t顆回歸樹,其對應的葉子節點區域為\(Rmj,(j=1,2,...,J)\)。其中\(J\)為回歸樹t的葉子節點的個數。
- 對葉子區域\(j=1,2,...,J\)計算最佳擬合值\(c_{mj} = arg min_{c}\sum\limits_{x_i \in R_{mj}} L(y_i,f_{m-1}(x_i) +c)\)
- 更新強學習器\(f_{m}(x) = f_{m-1}(x) + \sum\limits_{j=1}^{J}c_{mj}I(x \in R_{mj})\)
- 得到強學習器f(x)的表達式\(f(x) = f_M(x) =f_0(x) + \sum\limits_{m=1}^{M}\sum\limits_{j=1}^{J}c_{mj}I(x \in R_{tj})\)
5. GBDT的正則化
- 和Adaboost類似的正則化項,即步長(learning rate)。
- 正則化的方式是通過子采樣比例(subsample)。
- 對於弱學習器即CART回歸樹進行正則化剪枝。
6. 總結
GBDT也是需要正則化的過程,
最后總結下GBDT的優缺點。
GBDT主要的優點有:
- 可以靈活處理各種類型的數據,包括連續值和離散值。
- 在相對少的調參時間情況下,預測的准確率也可以比較高。這個是相對SVM來說的。
- 使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。
GBDT的主要缺點有:
- 由於弱學習器之間存在依賴關系,難以並行訓練數據。不過可以通過自采樣的SGBT來達到部分並行。