1、GBDT簡介
- 全稱:Gradient Boosting Decison Tree
- 別名:GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree)
- 做者:Friedman
- 所屬:boosting迭代型、樹類算法
- Boosting Tree 對於每一輪基學習器,擬合的是當前模型與標籤值的殘差
- GBDT 對於每一輪基學習器,擬合的是當前模型與標籤值的殘差的負梯度
- 適用範圍:分類、迴歸
- 分類:用Gini係數,越小越好
- 迴歸:用平方偏差,越小越好
- 迴歸樹與決策樹的生成框架是相同的,惟一不一樣在於節點的屬性選擇標準
- 基學習器:CART樹(分類迴歸樹)
- 思想:若是樣本1的輸出真實值爲10,樹T1針對樣本1的預測值爲18,而後咱們讓樹T2去擬合樣本1的值爲10-18=-8(殘差)。若是樹T2的輸出值爲-10,咱們再讓樹T3去擬合-8-(-10)=2(殘差),結果樹T3的預測值爲1。若是到此迭代結束,在最終對樣本1的預測值爲:18+(-10)+1=9。經過多輪迭代,每輪迭代產生一個弱模型,每一個模型都是在上一個模型的殘差基礎上進行訓練的,最後將全部樹的結果求和得出最終的結果。
- 優勢:
- 可以處理連續值/離散值;
- 對異常值的魯棒性很強,如Huber損失函數和Quantile損失函數
- GBDT的並行主要是針對單棵樹特徵處理和選擇的並行(特徵排序),以及在模型完成後進行預測時的並行。
- sklearn連接:https://www.studyai.cn/modules/ensemble.html#gradient-tree-boosting
- 論文連接:
2、GBDT步驟
GBDT流程圖php
1.負梯度擬合
第t棵樹的第i個樣本的損失函數的負梯度表示爲:$r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)}$html
負梯度的計算:git
- 對於平方損失函數,擬合的殘差就是負梯度;(爲何要擬合負梯度,見第三節)
- 對於通常損失函數(梯度降低),擬合的負梯度就是殘差的近似值,分裂結點劃分時枚舉全部特徵的值,選取劃分點。
利用$(x_i,r_{ti})(i=1,2,...,m)$咱們能夠擬合一棵CART迴歸樹,獲得了第t棵迴歸樹,其對應的葉節點區域$R_{tj},j=1,2,...,J$其中J爲葉子節點的個數。github
GBDT分類迴歸用的都是CART迴歸樹,選擇特徵時用均方偏差選擇最小的分割點。對於任意劃分特徵A,對應的任意劃分點s兩邊劃分紅的數據集D1和D2,求出使D1和D2各自集合的均方差最小,同時D1和D2的均方差之和最小所對應的特徵和特徵值劃分點。表達式爲:web
$$\underbrace{min}_{A,s}\Bigg[\underbrace{min}_{c_1}\sum\limits_{x_i \in D_1(A,s)}(y_i - c_1)^2 + \underbrace{min}_{c_2}\sum\limits_{x_i \in D_2(A,s)}(y_i - c_2)^2\Bigg]$$面試
其中,c1爲D1數據集的樣本輸出均值,c2爲D2數據集的樣本輸出均值。算法
針對每個葉子節點裏的樣本,咱們求出使損失函數最小,也就是擬合葉子節點最好的輸出值$c_{tj}$以下:$c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c)$框架
這樣獲得了本棵決策樹擬合函數:$h_t(x) = \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})$函數
從而本輪最終獲得的強學習器的表達式以下:$f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})$ ,最後預測的結果是每棵樹的預測結果相加。post
2.迴歸問題
給定數據集:$T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}$
a.MSE(GBDT迴歸所用)
- $Cost(y,f(x))=\frac{1}{2}\sum(y-f(x))^2$
- 負梯度:$y-f(x)$
- 對異常值很敏感
- 初始模型F0由目標變量的平均值給出
b.絕對損失
- $Cost(y,f(x))=\frac{1}{2}\sum|y-f(x)|$
- 負梯度:$sign(y-f(x))$
- 對異常值不敏感
- 初始模型F0由目標變量的中值給出
c.Huber損失
- $L(y, f(x))= \begin{cases} \frac{1}{2}(y-f(x))^2& {|y-f(x)| \leq \delta}\\ \delta(|y-f(x)| - \frac{\delta}{2})& {|y-f(x)| > \delta} \end{cases}$
- 負梯度:$r(y_i, f(x_i))= \begin{cases} y_i-f(x_i)& {|y_i-f(x_i)| \leq \delta}\\ \delta sign(y_i-f(x_i))& {|y_i-f(x_i)| > \delta} \end{cases}$
- 它是MSE和絕對損失的組合形式,對於遠離中心的異常點,採用絕對損失,其餘的點採用MSE,這個界限通常用分位數點度量。
- 對異常值不敏感
- 使用alpha參數來控制損失函數對離羣點(outliers)的敏感度(sensitivity)
d.Quantile損失
- $L_q(\text{y},\hat{\text{y}})=\frac{1}{n}(1-q)\sum_{i:\hat{y_i}\geq y_i}(\hat{y_i} - y_i)+\frac{1}{n}q\sum_{j:\hat{y_j}< y_j}(y_j-\hat{y_j} )$
- 負梯度:$r(y_i, f(x_i))= \begin{cases} y_i-f(x_i)& {|y_i-f(x_i)| \leq \delta}\\ \delta sign(y_i-f(x_i))& {|y_i-f(x_i)| > \delta} \end{cases}$
- 怎麼理解?
- 用於分位數迴歸
- 對於Huber損失和分位數損失,主要用於健壯迴歸,也就是減小異常點對損失函數的影響
- 當q>0.5時,目標函數對預測值偏小的結果懲罰更大
- 當q<0.5時,目標函數對預測值偏大的結果懲罰更大
(2)算法
step1
初始化:針對數據集,創建第一個CART迴歸樹$T_1(x)$
- $f_0(x) = \underbrace{arg\; min}_{c}\sum\limits_{i=1}^{m}L(y_i, c)$
- c是針對每個葉子節點裏的樣本,使得損失函數最小,也就是擬合葉子節點最好的輸出值
step2
對迭代次數t=1,2,...,T有:
- a.對樣本i=1,2,...,m,計算負梯度$r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)}$
- b.利用$(x_i,r_{ti})(i=1,2,3,...m)$擬合一棵CART迴歸樹,獲得第t棵迴歸樹,其對應的葉子節點區域爲$R_{tj},j=1,2,...,J$其中,J爲迴歸樹t的葉子節點的個數
- c.對葉子區域j=1,2,...J,計算最佳擬合值$c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c)$
- d.更新強學習器$f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})$
3.分類問題
這裏解釋下,爲何GBDT解決分類問題用的也是迴歸樹。由於GBDT的根本就是在不斷地擬合殘差,殘差的加減能夠逐漸減少誤差。而分類樹輸出的是類別,他們之間的加減是沒有意義的。分類問題和迴歸問題的最大不一樣在於損失函數的定義以及節點輸出值的肯定,其餘都是同樣的。
(1)損失函數
- 對數似然損失函數:
- 二元:$L(y, f(x)) = log(1+ exp(-yf(x)))$
- 多元:$L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x)$
- 指數損失函數:
- 與adaboost的損失函數同樣,與log loss相比,對於誤標記的樣本的魯棒性較差,只能用於二元分類
- $L(y, f(x)) = exp(-yf(x))$
(2)二分類
- 損失函數:$L(y, f(x)) = log(1+ exp(-yf(x)))$,標籤y屬於{-1,+1}
- 負梯度:$r_{ti} = -\bigg[\frac{\partial L(y, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} = y_i/(1+exp(y_if(x_i)))$
- 生成的決策樹每一個葉子節點最佳負梯度擬合值爲:$c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} log(1+exp(-y_i(f_{t-1}(x_i) +c)))$
- 上式比較難優化,通常用近似值替代:$c_{tj} = \sum\limits_{x_i \in R_{tj}}r_{ti}\bigg / \sum\limits_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|)$
(3)多分類
- 損失函數:$L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x)$
- 其中若是樣本輸出類別爲k,則yk=1。第k類的機率pk(x)的表達式爲:
- 負梯度:第t輪的第i個樣本對應類別l的負梯度偏差$r_{til} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f_k(x) = f_{l, t-1}\;\; (x)} = y_{il} - p_{l, t-1}(x_i)$
- 生成的決策樹每一個葉子節點的最佳負梯度擬合值爲:$$c_{tjl} = \underbrace{arg\; min}_{c_{jl}}\sum\limits_{i=0}^{m}\sum\limits_{k=1}^{K} L(y_k, f_{t-1, l}(x) + \sum\limits_{j=0}^{J}c_{jl} I(x_i \in R_{tjl}))$$
- 上式比較難優化,通常用近似值代替:$c_{tjl} = \frac{K-1}{K} \; \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)}$(怎麼獲得的?)
- 除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,多元GBDT分類和二元GBDT分類以及GBDT迴歸算法過程相同。
4.GBDT用到的技巧
4.1 shrinkage
- Shrinkage的思想認爲,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易 獲得精確值,即它不徹底信任每一棵殘差樹,認爲每棵樹只學到了真理的一部分累加的時候只累加了一小部分多學幾棵樹來彌補不足。 這個技巧相似於梯度降低裏的學習率
- $f_{k}(x) = f_{k-1}(x) + \nu h_k(x)$,其中v被稱之爲learning rate,它能夠控制梯度降低的步長,而且能夠經過learning_rate參數來設置,$\gamma$是人爲設置的參數,用來調整學習的快慢和精度
- 選擇小於1的比例能夠減小泛化時的方差(測試集的方差),即防止過擬合,可是會增長樣本擬合的誤差,所以取值不能過低。推薦在[0.5, 0.8]之間。
4.2 重複使用屬性
在GBDT的每一棵樹中,一個屬性能夠在多個節點用到
4.3 子採樣
GBDT學習了RF裏的樣本採樣方法,每一棵樹基於原始本來的一個子集進行訓練,達到防止過擬合和提高訓練速度的目的。
- 樣本子採樣subsample,經過無放回採樣得到(RF是有放回採樣)
- 減小方差的策略是特徵子採樣,這種相似於隨機森林中的隨機分割,子採樣的特徵數量能夠經過參數max_features來控制,使用一個小的max_features值可以顯著下降計算時間。
4.4 剪枝
對於弱學習器即CART迴歸樹進行正則化剪枝
5.對結果的解釋
- 特徵重要性
- 若是一個特徵在樹的分割節點中用的越頻繁,則這個特徵的重要性就越高。 這種特徵重要性的概念能夠 經過簡單的平均一下每棵樹上的特徵重要性擴展到決策樹集合。
- 部分依賴性
- 部分依賴圖(Partial dependence plots (PDP))展現了目標響應和一系列目標特徵的依賴關係, 同時邊緣化了其餘全部特徵的取值(候選補充特徵)。 直覺上,咱們能夠將部分依賴解釋爲做爲目標特徵函數 的預期目標響應 。
3、GBDT面試總結
1.優缺點
優勢:
缺點:因爲弱學習器之間存在依賴關係,難以並行訓練數據。不過能夠經過自採樣的SGBT來達到部分並行。
2.GBDT 和 隨機森林/Adaboost/LR的區別與聯繫
-
GBDT和隨機森林
- 相同點:
- 都是由多棵樹組成
- 最終的結果都是由多棵樹一塊兒決定
- 不一樣點:
- 組成隨機森林的樹能夠並行生成;而GBDT只能是串行生成 ;
- 對於最終的輸出結果而言,隨機森林採用多數投票等;而GBDT則是將全部結果累加起來,或者加權累加起來 ;
- 隨機森林對異常值不敏感,GBDT對異常值很是敏感 ;
- 隨機森林對訓練集一視同仁,GBDT是基於權值的弱分類器的集成 ;
- 隨機森林是經過減小模型方差提升性能,GBDT是經過減小模型誤差提升性能;
- 隨機森林既可使用決策樹也可使用迴歸樹,可是gbdt採用的都是CART迴歸樹。
和AdaBoost同樣,Gradient Boosting也是重複選擇一個表現通常的模型而且每次基於先前模型的表現進行調整。不一樣的是,AdaBoost是經過提高錯分數據點的權重來定位模型的不足而Gradient Boosting是經過算梯度(gradient)來定位模型的不足。所以相比AdaBoost, Gradient Boosting可使用更多種類的目標函數,而當目標函數是均方偏差時,計算損失函數的負梯度值在當前模型的值即爲殘差。
從決策邊界來講,線性迴歸的決策邊界是一條直線,邏輯迴歸的決策邊界是一條曲線,而GBDT的決策邊界多是不少條線。
3. 爲何擬和負梯度能夠下降集成模型的損失,即爲何擬合負梯度是可行的?
參考連接
4. 即使擬合負梯度是可行的,爲何不直接擬合殘差? 擬合負梯度好在哪裏?
參考連接
Boosting Tree 和 GBDT 二者的相同之處在於,都是迭代迴歸樹,都是累加每棵樹的結果做爲最終結果,每棵樹都在學習前m-1棵樹尚存的不足,從整體流程和輸入輸出上二者是沒有區別的.
二者的主要區別就在於每步迭代的時候是否使用殘差的負梯度做爲樹的擬合對象,前者不用殘差的負梯度而是使用殘差,是全局最優值,後者使用的是 局部最優方向(負梯度)*步長(𝛽),即前者是每一步都試圖讓結果變成最好,後者則每步試圖讓結果更好一點.
Boosting Tree的最大問題在於,它依賴殘差進行優化,損失函數通常固定爲反應殘差的均方差損失函數,所以 當均方差損失函數失效(該損失函數對異常值敏感)的時候,換了其餘通常的損失函數,便很可貴到優化的結果。同時,由於損失函數的問題,Boosting Tree也很難處理迴歸以外問題。 然後者使用梯度降低的方法,對於任意能夠求導的損失函數它均可以處理.
GBDT本質上是以梯度降低和參數搜索(𝛽)的辦法簡化了Boosting Tree對於損失函數的優化求解問題.
5.gbdt在分類時,當以指數損失做爲損失函數時,爲何等價於adaboost?
參考(109樓)
若是採用指數函數,那麼Adaboost每一步就在擬合指數損失的梯度。也就是第t輪要依據$(x_i, -y_i exp(-y_if_{t-1}x)$擬合一顆決策樹。
$\sum\limits_{i=1}^{m}Loss(f_{t-1}(x)+\alpha_tG_t(x) , y_i) = \sum\limits_{i=1}^{m}exp(-y_i(f_{t-1}(x)+\alpha_tG_t(x))) = \sum\limits_{i=1}^{m}exp(-y_i(f_{t-1}(x)) exp(-y_i\alpha_tG_t(x)) = \sum\limits_{i=1}^{m} w_{ti}^{’}exp(-y_i\alpha G(x))$
最後這個式子就是咱們Adaboost的須要極小化的損失函數公式,它能夠從第一步的GBDT的殘差思路遞推出來。
參考文獻: