GBDT 梯度提升樹 原理總結


梯度提升樹(Gradient Boosting Decison Tree)


GBDT有很多簡稱,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其實都是指的同一種算法,本文統一簡稱GBDT。

GBDT作為集成學習的一個重要算法,在被提出之初就和SVM一起被認為是泛化能力較強的算法。具體而言,GDBT是一種迭代的決策樹算法,它基於集成學習中的boosting思想,每次迭代都在減少殘差的梯度方向新建立一顆決策樹,迭代多少次就會生成多少顆決策樹。其算法思想使其可以發現數據中有區分性的特征以及特征組合,業界中,Facebook使用其來自動發現有效的特征、特征組合,來作為LR模型中的特征,以提高 CTR預估(Click-Through Rate Prediction)的准確性[1]。隨后Kaggle競賽也有實踐此思路[2],GBDT與LR融合開始引起了業界關注。

GBDT 主要結合回歸樹(Regression Decision Tree)和提升樹(Boosting Decision Tree)的思想,並提出利用殘差梯度來優化回歸樹的集成過程。在這里,將首先介紹回歸樹和提升樹,然后在詳細闡述GBDT的算法步驟。

1. 回歸樹(Regression Decision Tree)

關於回歸樹,推薦參考【李航. 統計學習方法】[5]。
回歸樹是根據最小化平方誤差的准則,遞歸地構建二叉決策樹。假設 \(X\)\(Y\) 分別為輸入輸出變量,並且 \(Y\) 是連續變量,給定訓練數據集 $$D={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}$$ 一個回歸樹將輸入空間(即特征空間)划分為 \(M\) 個單元 \(\{R_1,R_2,...,R_M\}\),回歸樹的每個葉子節點對應一個單元,其相應的有一個固定的輸出值 \(c_m\) 。當輸入特征為 \(x\) 時,回歸樹會將其判定到一個葉子節點,將這個葉子節點對應的輸出值 \(c_m\) 作為回歸樹的輸出。這樣,回歸樹模型可以表示為 $$ T(x) = \sum_{m=1}^M c_m \mathrm{I}(x\in R_m) \tag{1}$$ 其中,\(\mathrm{I}(x \in R_m)\) 為指示函數,當回歸樹判定 \(x\) 屬於 \(R_m\) 時,其值為 \(1\),否則為 \(0\)
建立回歸樹的目標是針對數據集 \(D\) ,選擇合適的空間划分方式(即決策樹的生成方式)和相應的輸出值,來最小化平方誤差

\[\sum\limits_{x_i \in D} (y_i-T(x_i))^2 \]

  • 首先,選擇合適的空間划分方式。根據決策樹的建立方式,在每一個決策節點處選擇變量 \(x\) 的第 \(j\) 維特征(用 \(x\small[ j ]\) 表示 \(x\)\(j\) 維的值) 和相應的閾值 \(s\) ,作為切分特征和切分閾值,則節點將空間划分為兩個區域:$$ R_1(j,s) = {x|x[j] \leq s } ~~ R_2(j,s) = {x|x[j] > s } \tag{2}$$ 該節點處最優的切分特征 \(j\) 和切分閾值 \(s\) 按以下方式尋找

\[ \min_{j,s} \left[ \min_{c_1} \sum_{x_i \in R_1(j,s)}(y_i - c_i)^2 + \min_{c_2} \sum_{x_i \in R_2(j,s)}(y_i - c_2)^2 \right] \tag{3} $$ 該節點根據切分特征 $j$ 和切分閾值 $s$將樣本集划分為兩個子樣本集,式(3)的具體目的是這兩個子樣本集的方差盡可能小。式(3)中 $c_1$、$c_2$ 的取值為各樣本的均值,$j$ 和 $s$ 的選擇則是通過遍歷來確定。注意,切分閾值 $s$ 是連續變量,但其取值可以根據樣本的實際分布來選擇合適的具體值,而不必連續性遍歷。 - 然后,決定回歸樹的輸出值。針對每個子區域 $R_m$(樹的葉子節點),其對應的輸出值 $c_m$ 可以直接選取類別均值,即 $$c_m = \arg \min_c \sum_{x_i \in R_m} (y_i - c)^2 = \mathrm{aver}(y_i|x_i \in R_m) \tag{4}$$ 其中,$\mathrm{aver}$ 表示取均值。 綜上,回歸樹的具體生成過程如下: <table width="100%"> <tr> <th colspan=2> 回歸樹生成算法 </th> </tr> <tr> <td colspan=2> 輸入:訓練數據集 $D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$ </td> </tr> <tr> <td width=30> 1 </td> <td> 選擇最優的切分特征 $j$ 與切分閾值 $s$ ,求解 $$\min_{j,s} \left[ \min_{c_1} \sum_{x_i \in R_1(j,s)}(y_i - c_i)^2 + \min_{c_2} \sum_{x_i \in R_2(j,s)}(y_i - c_2)^2 \right]$$ 遍歷所有的特征 $j$ ,對固定的切分特征 $j$ 掃描選取切分閾值 $s$,選擇使上式達到最小值的 $(j,s)$.</td> </tr> <tr> <td> 2 </td> <td> 用選定的 $(j,s)$ 划分區域並決定相應的輸出值:$$R_1(j,s)=\{x|x[j]\leq s\}, ~ R_2(j,s)=\{x|x[j]>s\} \\ c_m = \frac{1}{N_m} \sum_{x_i \in R_m} y_i, ~ m=1,2$$ 其中, $N_m$ 表示屬於 $R_m$ 的樣本個數 .</td> </tr> <tr> <td> 3 </td> <td> 繼續對兩個子區域調用步驟(1),(2),直至區域類樣本一致或樹的層數達到要求. </td> </tr> <tr> <td> 4 </td> <td> 將輸入空間划分為 $M$ 個區域 $R_1,R_2,...,R_M$,生成決策樹:$$T(x) = \sum_{m=1}^M c_m \mathrm{I}(x\in R_m)$$ </td> </tr> <tr> <td colspan=2>輸出:回歸樹 $T(x)$.</td> </tr> </table> ## 2. 提升樹算法(Boosting Decision Tree) ### 2.1 提升樹模型 提升樹模型實際是將多個決策樹簡單的疊加起來,用數學模型可表示為 $$f_M(x) = \sum_{m=1}^M T(x;\Theta_m) \tag{5}$$ 其中,$T(x;\Theta_m)$ 表示決策樹,$\Theta_m$ 表示決策樹的參數;$M$ 為樹的個數。 針對樣本 $D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$,提升樹模型的訓練就是,選擇決策樹的參數 $\Theta=\{\Theta_1,\Theta_2,...,\Theta_M\}$ 以最小化損失函數 $\sum L(y_i,f_M(x_i))$,即 $$\arg \min_\Theta \sum_{i=1}^N L(y_i,f_M(x_i)) = \arg \min_\Theta \sum_{i=1}^N L\left(y_i, \sum_{m=1}^M T(x;\Theta_m)\right) \tag{6}$$ 這里,損失函數用來反應“樣本標簽 $y_i$ ”與提升樹的輸出 $f_M(x_i)$ 之間的差別,這里可以選擇平方誤差損失函數:$$ L(y, f(x))=\left( y-f(x) \right)^2 \tag{7}\]

2.2 提升樹算法

根據式(5),提升樹模型也可以表示為迭代過程 $$f_m(x)=f_{m-1}(x)+T(x;\Theta_m),~ m=1,2,...,M \tag{8}$$ 因此,提升樹的訓練也可以按照迭代的過程來完成,在 \(m\) 次迭代中,生成一個新的決策樹 \(T(x;\Theta_m)\)
具體而言,首先初始化提升樹 \(f_0(x)=0\),第 \(m\) 步確定第 \(m\) 個決策樹 \(T(x;\Theta_m)\),即選擇合適的決策樹參數 \(\Theta_m\),使損失函數最小,即 $$\hat{\Theta}m = \arg \min{\Theta_m} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i;\Theta_m)) \tag{9}$$

對於式(9)的求解,即為提升樹的關鍵所在。如果采用平方損失函數,則有 $$ \begin{eqnarray} L(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)) &=& \left[,y_i - f_{m-1}(x_i) - T(x_i;\Theta_m)\right]^2 \ &=& \left[,r_{m,i} - T(x_i;\Theta_m)\right]^2\tag{10} \end{eqnarray}$$ 這里, $ r_{m,i}=y_i-f_{m-1}(x_i) $ 表示模型 \(f_{m-1}(x)\) 擬合數據 \((x_i,y_i)\) 的殘差。

這樣對式(9)的求解,就變成了選擇合適的決策樹參數 \(\Theta_m\) ,使得決策樹的輸出 \(T(x_i;\Theta_m)\) 與 殘差 \(r_{m,i}\) 的誤差盡可能小。因此,可以使用 \(\{(x_i,r_{m,i})\}_{i=1,2,...,N}\) 來作為決策樹 \(T(x;\Theta_m)\) 的樣本集,按照常規的決策樹生成過程獲得參數的最優值 \(\hat{\Theta}_m\)

綜上,我們可以得到提升樹算法如下:

提升樹算法
輸入:訓練數據集 $D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$
1 初始化 $f_0(x)=0$
2 For $m=1,2,...,M$
3 $~~~$ 針對每一個樣本 $(x_i,y_i)$,計算殘差 $$r_{m,i}=y_i - f_{m-1}(x_i),~ i=1,2,...,N$$
4 $~~~$ 利用$\{(x_i,r_{m,i})\}_{i=1,2,...,N}$ 訓練一個決策樹(回歸樹),得到 $T(x;\Theta_m)$
5 $~~~$ 更新 $f_m(x)=f_{m-1}(x)+T(x;\Theta_m)$
6 完成以上迭代,得到提升樹 $f_M(x) = \sum\limits_{m=1}^M T(x;\Theta_m)$

3. GBDT(Gradient Boosting Decison Tree)

GBDT很好的結合了回歸樹與提升樹的思想,並將它們推廣到更一般的情形。例如提升樹中第三步計算殘差是在損失函數為平方損失函數來計算的,如果損失函數為對數函數,則計算殘差 \(r_{m,i}\) 變得不是很方便,以及在第四步訓練回歸樹時,計算節點輸出值 \(c_m\) 也變得不容易進行。

GBDT首先使用最速下降的近似方法來計算殘差的近似值,即 $$ r_{m,i} = -\left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]{f(x)=f{m-1}(x)} \tag{11}$$ GBDT 的具體算法過程如下:

GBDT 算法
輸入:訓練數據集 $D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$;損失函數 $L(y,f(x))$ .
1 初始化 $ f_0(x) = \arg \min\limits_c \sum\limits_{i=1}^N L(y_i, c) $
2 For $m=1,2,...,M$
3 $~~~$ 對於每一個樣本$(x_i,y_i)$,計算殘差 $$r_{m,i} = -\left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)} ~,~i=1,2,...,N$$
4 $~~~$ 利用$\{(x_i,r_{m,i})\}_{i=1,2,...,N}$ 訓練出第 $m$ 棵回歸樹 $T_m$,其葉節點划分的區域為 $R_{m,j},j=1,2,...,J$
5 $~~~$對於回歸樹 $T_m$ 的每一個葉節點,計算其輸出值 $$ c_{m,j} = \arg \min_c \sum_{x_i\in R_{m,j}} L(y_i, f_{m-1}(x_i)+c) ,~ j=1,2,...,J $$
6 $~~~$ 更新 $f_m(x) = f_{m-1}(x) + \sum\limits_{j=1}^J c_{m,j}I(x \in R_{m,j})$
7 得到最終提升回歸樹 $$ \hat f(x) = f_M(x) = \sum_{m=1}^M \sum_{j=1}^J c_{m,j} I(x \in R_{m,j}) $$
輸出:梯度提升樹 $\hat f(x)$

以上算法將回歸樹和提升樹的算法結合起來,在第5步中求解 \(c_{m,j}\) ,如果損失函數為平方損失函數,則解法與前面的回歸樹一致,直接取均值即可。如果是其他損失函數,則需要具體進行求解。具體而言,就是取導數為零來解等式。

不過對於分類情況,由於樣本輸出不是連續的值,而是離散的類別,導致我們無法直接從輸出類別去擬合類別輸出的誤差。為了解決這個問題,主要有兩個方法,一個是用指數損失函數,此時GBDT退化為Adaboost算法。另一種方法是用類似於邏輯回歸的對數似然損失函數的方法。也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失。本文僅討論用對數似然損失函數的GBDT分類。而對於對數似然損失函數,我們又有二元分類和多元分類的區別。

3.1 二元GBDT分類算法

對於二分類問題,比較常用的損失函數為 $$L(y,f(x))=\log (1+\exp (-y \cdot f(x))) \tag{12}$$ 其中 \(y \in \{-1,+1\}\),此時的負梯度誤差為 $$ r_{m,i} = -\left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]{f(x)=f{m-1}(x)} = \frac{y_i}{1+\exp (y_i f_{m-1}(x_i))} \tag{14}$$

對於生成決策樹,其葉子節點的輸出值為 $$ c_{m,j} = \arg \min_c \sum_{x_i\in R_{m,j}} \log (1+\exp (-y_i (f_{m-1}(x_i) + c))) \tag{15}$$

由於上式比較難優化,我們一般使用近似值代替 $$ c_{m,j} =\left. \sum_{x_i\in R_{m,j}} r_{m,i} \middle / \sum_{x_i\in R_{m,j}} |r_{m,i}|(1-|r_{m,i}|) \right. \tag{16}$$

3.2 多元GBDT分類算法

對於多分類問題,假設類別為 \(K\),一般采用的損失函數為 $$ L(y,f(x)) = - \sum_{k=1}^K y_k log p_k(x) \tag{17}$$ 其中,如果樣本輸出類別為 \(k\) ,則 \(y_k=1\)\(p_k(x)\) 表示模型 \(f(x)\) 判定 \(x\) 屬於第 \(k\) 類的概率,其表達式為 $$ p_k(x) = \frac{\exp (f_k(x))}{ \sum_{l=1}^K \exp(f_l(x))} \tag{18}$$ 注意此處,對於多分類問題,回歸樹訓練時,會為每一個類別訓練一個決策樹。

由此,我們可以計算出第 \(m\) 輪的第 \(i\) 個樣本對應類別 \(l\) 的負梯度誤差為 $$ r_{m,i,l} = -\left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]{f(x)=f{m-1,l}(x)} = y_{i,l} - p_{m,l}(x_i) \tag{19}$$ 觀察上式可以看出,其實這里的誤差就是樣本 \(i\) 對應類別 \(l\) 的真實概率和 \(m−1\) 輪預測概率的差值。

對於生成的決策樹,對應第 \(l\) 類別的決策樹的葉節點輸出為

\[c_{m,l,j} = \arg \min_c \sum_{x_i \in R_{m,l,j}} L(y_{i,l}, f_{m-1,l}(x_i) + c) \tag{20} \]

類似的,我們用近似值代替 $$ c_{m,l,j} = \frac{K-1}{K} \frac{\sum\limits_{x_i \in R_{m,l,j}}r_{m,i,l}}{ \sum\limits_{x_i \in R_{m,l,j}} |r_{m,i,l}|(1-|r_{m,i,l}|) } \tag{21}$$

4. GBDT 的正則化

  • 第一種是和Adaboost類似的正則化項,即使用步長(learning rate),定義為 \(\alpha\) 。常規的提升回歸樹的迭代為 $$f_m(x) = f_{m-1}(x) + T(x;\Theta_m)$$ 引入正則化后,其迭代過程為 $$ f_m(x) = f_{m-1}(x) + \alpha T(x;\Theta_m) $$ 其中,\(0<\alpha \leq 1\)。對於同樣的訓練集學習效果,較小的 \(\alpha\) 意味着我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。

  • 第二種正則化的方式是通過子采樣比例(subsample)。取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等於沒有使用子采樣。如果取值小於1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間。
    使用了子采樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由於使用了子采樣,程序可以通過采樣分發到不同的任務去做boosting的迭代過程,最后形成新樹,從而減少弱學習器難以並行學習的弱點。

  • 第三種稱為 Regularized Learning Objective,將樹模型的復雜度作為正則項顯式地加進優化目標里,這也是XGBoost實現的獨到之處。其具體實現可以參考文獻[7],在這里列出其加入正則化后的優化目標 $$ L_{r}(y,f(x)) = L(y,f(x)) + \sum_{m} \Omega(T(x;\Theta_m)) \ \mathrm{where} ~~ \Omega(T(x;\Theta_m)) = \gamma T_{leaf} + \frac12 \lambda | w |^2 $$ 其中,\(L(y,f(x))\) 為常規的損失函數;\(\Omega(T(x;\Theta_m))\) 表示決策樹的復雜度,\(T_{leaf}\) 為樹葉節點個數,\(w\) 為葉節點的固定輸出值\(c_m\)組成的向量;\(\gamma, \lambda\) 為相應的系數。

  • 最后還有一種就是類 似DeepLearning 的 Dropout ,其具體可以參考文獻[8]。通俗地講,每次新加一棵樹,這棵樹要擬合的並不是之前全部樹ensemble后的殘差,而是隨機抽取的一些樹ensemble。

以上為作者暫時了解到的,其它的正則化方法如果日后學習到,會繼續添加。

[1]. He X, Pan J, Jin O, et al. Practical lessons from predicting clicks on adsat facebook[C]. Proceedings of 20th ACM SIGKDD Conference on KnowledgeDiscovery and Data Mining. ACM, 2014: 1-9.
[2]. guestwalk. kaggle-2014-criteo. https://github.com/guestwalk/Kaggle-2014-criteo
[3]. SiyueLin. GBDT: 梯度提升決策樹. https://www.jianshu.com/p/005a4e6ac775
[4] 玉心sober. CTR預估中GBDT與LR融合方案. https://blog.csdn.net/lilyth_lilyth/article/details/48032119
[5] 李航. 統計學習方法.
[6] 劉建平Pinard. 梯度提升樹(GBDT)原理小結.https://www.cnblogs.com/pinard/p/6140514.html
[7] Chen T, Guestrin C. XGBoost: A Scalable Tree Boosting System[J]. 2016:785-794. https://arxiv.org/pdf/1603.02754.pdf
[8] Rashmi K V, Gilad-Bachrach R. DART: Dropouts meet Multiple Additive Regression Trees[J]. Computer Science, 2015:489-497.
[9] 知識天地. Regularization on GBDT. https://www.cnblogs.com/mfryf/p/6015713.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM