從提升樹出發,——》回歸提升樹、二元分類、多元分類三個GBDT常見算法。
- 提升樹
- 梯度提升樹
- 回歸提升樹
- 二元分類
- 多元分類
- 面經
提升樹
在說GBDT之前,先說說提升樹(boosting tree)。說到提升(boosting),總是繞不過AdaBoost。
AdaBoost是利用前一輪迭代的誤差率來更新訓練集的權重,校正前一輪迭代被錯誤分類的樣本,通俗一點的理解就是將重心放在分錯的樣本上。提升樹也是boosting家族的成員,意味着提升樹也采用加法模型(基學習器線性組合)和前向分步算法。
下面一個一個進行解釋,提升樹的基學習器是什么,加法模型和前向分步算法又是怎么用的。
提升樹通常以決策樹作為基學習器,對分類問題決策樹是二叉分類樹,回歸問題就是二叉回歸樹。
加法模型,就是說提升樹可以表示為以下形式:這里我們約定 $ T(x;Θ_m ) $表示第m棵決策樹;$ Θ_m $表示決策樹的參數;$ M $為樹的個數。強分類器$f_M (x)$可以由多個弱分類器$T(x;Θ_m )$線性相加而成。
$$f_M (x)=\sum_{m=1}^MT(x;Θ_m ) $$
提升樹的前向分步算法。第m步的模型可以寫成:
$$f_m (x)=f_{m-1} (x)+ T(x;Θ_m )$$
然后得到損失函數
$$L(f_m (x),y)=L(f_{m-1} (x)+ T(x;Θ_m ),y)$$
迭代的目的是構建$T(x;Θ_m )$,使得本輪損失$L(f_m (x),y)$最小。思想其實並不復雜,但是問題也很明顯,對於不同的任務會有不同的損失函數,當損失函數是平方損失和指數損失函數時,每一步的優化還是簡單的。但是對於一般損失函數而言,每一步的優化並不容易。
梯度提升樹
下面關於GBDT的理解來自論文greedy function approximation: a gradient boosting machine
- 損失函數的數值優化可以看成是在函數空間,而不是在參數空間。
- 損失函數$L(y,F)$包含平方損失$(y-F)^2$,絕對值損失$|y-F|$用於回歸問題,負二項對數似然$log(1+e^{-2yF} )$,y∈{-1,1}用於分類。
- 關注點是預測函數的加性擴展。
最關鍵的點在於損失函數的數值優化可以看成是在函數空間而不是參數空間。怎么理解呢?
首先,我們已經知道強分類器是由多個弱分類器線性相加而成,那么可以寫成如下形式:
$$F(x;\{β_m,a_m \}_1^M )=\sum_{m=1}^Mβ_m h(x;a_m )$$
這里的$h(x;a_m )$指代回歸樹,例如CART。$a_m$是模型參數,這里指代每個節點的分裂特征(變量),最佳分割點,節點的預測值。$M$就是有多少個弱分類器。
然后,我們來回顧一下參數空間的數值優化。假設預測函數為$F(x;P)$,那么損失函數就可以寫成:
$$ ϕ(P)=L(y,F(x,P))$$
優化以后得到的參數最優解為:
$$P^~=argmin_P ϕ(P) $$
回想一下SGD(隨機梯度下降)的優化方式,從山頂上選擇梯度下降最快的方向挪動最優步長。我們是不是可以把最優參數表達成這個形式?
$$P^~=\sum_{m=0}^Mp_m $$
$$p_m=-ρ_m g_m$$
從初始值$p_0$開始,$m$對應每一步更新迭代,負梯度$-g_m$就是最速下降方向,$ρ_m$就是在這個最速下降方向上進行線搜索得到的最優步長。
好了,現在我們說說函數空間的優化方法。
將預測函數$F(x)$對應參數$P$,最優解變成了:
$$F(x)=\sum_{m=0}^Mf_m (x)$$
相當於在函數空間上作梯度下降。每一步梯度下降:
$$f_m(x)=-ρ_m g_m(x)$$
$$g_m (x)=[\frac{-∂ϕ(F(x))}{∂F(x)} ]_{F(x)=F_{m-1} (x) }$$
$$F_{m-1}(x)=\sum_{i=0}^{m-1}f_i(x)$$
現在把這個思想代入到gradient boosting,我們之前已經得到預測函數為:
$$F(x;\{β_m,a_m \}_1^M )=\sum_{m=1}^Mβ_m h(x;a_m ) $$
需要做的事情是得到預測函數的最優解,就是:
$$\{\textbf{β}_m, \textbf{a}_m \}_1^M= argmin_{\{β_m,a_m\}_1^M} L(y,\sum_{m=1}^Mβ_m h(x;a_m ))= argmin_{β_m,a_m} L(y,F_{m-1} (x)+β_mh_m (x;a_m))$$
已知最速梯度下降方向為$g_m (x)=[\frac{-∂ϕ(F(x))}{∂F(x) }]_{F(x)=F_{m-1} (x) }$,每一個$h_m (x;a_m)$都建立在最速梯度下降的方向,我們可以得到:
$$\textbf{a}_m=argmin_{β_m,a_m} [-g_m (x)-β_mh_m (x;a_m) ]^2$$
可以認為是用$h_m (x;a)$去擬合偽標簽$\tilde{y}=-g_m (x)$。這里為什么用最小二乘,我的理解是GBDT構造的樹全是回歸樹,因此用最小二乘。
然后進行線搜索確定最優步長$ρ_m$:
$$\textbf{ρ}_m= argmin_{ρ_m} L(y,F_{m-1}(x)+ρ_mh_m (x;\textbf{a}_m))$$
$$F_m (x)=F_{m-1} (x)+ \textbf{ρ}_m h_m (x;\textbf{a}_m) $$
ok,現在來整理整個算法流程:
- 初始化:$F_0 (x)=argmix_ρ\sum_{i=1}^NL(y_i,ρ)$ ,$N$表示樣本量
- For $m=1$ to $M$ do:end for
- $\tilde{y}=-[\frac{∂ϕ(F(x))}{∂F(x)} ]_{F(x)=F_(m-1) (x) },i=1,2,……,N$
- $\textbf{a}_m=argmin_{β,a}\sum_{i=1}^N [\tilde{y}-βh_m (x_i;a) ]^2$
- $\textbf{ρ}_m= argmin_ρ\sum_{i=1}^N L(y_i,F_{m-1} (x_i)+ρh_m (x_i;\textbf{a}_m ))$
- $F_m (x)=F_{m-1} (x)+\textbf{ρ}_m h_m (x;\textbf{a}_m)$
回歸提升樹
當基學習器$h(x;a)$是一個包含J個節點的回歸樹時,可以寫成:
$$h(x;a)=h(x;\{c_j,R_j\}_1^J)=\sum_{j=1}^Jc_jI(X∈R_j)$$
寫完公式發現原來可以寫的這么復雜,簡單點說就是,對於回歸樹$h$,如果$x$被歸到某個葉子節點$R_j$,那么$x$在這個$h$中得到的預測值就是葉子節點$R_j$的值$c_j$。一般用葉子節點上 $\{x_i∈R_j \}_1^J$的$\{\tilde{y}_i\}_1^J$平均值近似節點$R_j$的值
$$c_j=ave_{x_i∈R_j}\tilde{y}_i $$
$\{R_j\}_1^J$是不相交的區域,集合覆蓋預測值的空間。$\{c_j\}_1^J$可以認為是回歸樹$h$的系數。什么意思?我們回想一下線性回歸,預測函數是$θ^T x$,這個$θ$就是模型系數。同樣的,也可以這么理解$\{c_j\}_1^J$,是回歸樹$h$的系數。
ok,現在我們已經得到了回歸提升樹的預測函數:
$$F_m (x)=F_{m-1} (x)+ρ_m \sum_{j=1}^Jc_{m,j}I(x∈R_j)$$
令$γ_{m,j}=ρ_mc_{m,j}$,這個值是葉子節點的最理想的常數更新值,也可以認為兼顧了下降方向和下降步長。
綜上,整理一下回歸提升樹的整個算法流程:
- 輸入:訓練數據集$T=\{(x_1,y_1),(x_2,y_2),……,(x_N,y_N)\}$,迭代次數$M$
- 1. 初始化:$F_0 (x)=argmin_ρ\sum_{i=1}^NL(y,ρ)$ ,$N$表示樣本量
- 2. For $m=1$ to $M$ do:
- (a) 計算損失函數在當前模型$F_{m-1} (x)$的負梯度值:
$$\tilde{y}=-[\frac{∂ϕ(F(x))}{∂F(x)}]_{F(x)=F_{m-1}(x) }=y_i-F_{m-1}(x_i),i=1,2,……,N$$
-
- (b) 根據$\tilde{y}_i$學習得到了第$m$棵回歸樹,對應的葉節點區域為$\{R_j \}_1^J$
- (c) $γ_{m,j}=argmin_γ\sum_{x_i∈R_{m,j}}L(y_i,F_{m-1}(x_i)+γ)$
- (d) 得到本輪最佳擬合決策樹為:
$$h_m(x;a)=\sum_{j=1}^Jγ_{m,j}I(x∈R_{m,j})$$
-
- (e) 得到本次迭代得到的強學習器:
$$F_m(x)=F_{m-1}(x)+\sum_{j=1}^Jγ_{m,j}I(x∈R_{m,j})$$
- 3.結束迭代之后的強學習器為:
$$F_M(x)=\sum_{m=1}^M\sum_{j=1}^Jγ_{m,j}I(x∈R_{m,j})$$
當當當~看到第3點,我們發現損失函數在當前模型$F_{m-1}(x)$的負梯度值剛剛好是$y-F_{m-1}(x)$,也就是我們常說的殘差!看到這里有沒有很激動?這不就是我們常說的GBDT是在擬合前幾輪迭代的殘差嗎?
下面給出證明:
令當前的預測函數模型為$F_{m-1}(x)$,下一棵要學習的回歸樹為$h_m (x;a)$,則下一步要學習的預測函數為:
$$F_m(x)=F_{m-1}(x)+h_m(x;a_m)$$
回歸提升樹的損失函數為平方損失:
$$Loss=L(F_m(x),y)=\frac{1}{2}(F_m(x)-y)^2$$
對$F_m (x)$求關於$a_m$的偏導:
$$\frac{∂Loss}{∂a_m}=(F_m(x)-y)=F_{m-1}(x)+h_m(x;a_m)-y$$
我們要使經驗風險極小化,令偏導為0:
$$h_m(x;a_m)=y-F_{m-1}(x)$$
也就是說,構建的回歸樹要去擬合前面的殘差,得證。可以這么理解,GBDT是在函數空間的梯度下降求最優值,當損失函數為平方損失時,恰好去擬合了殘差。
下面給一個簡單的例子方便理解,現在要通過購物金額和上網時長來預測年齡。假設有5個訓練樣本,標簽分別14,17,13,25,27。第m輪迭代,通過前幾輪的殘差構建決策樹,得到預測函數$F_m (x)$的預測年齡分別為16,15,12,19,29,計算殘差-2,2,1,6,-2。第m+1輪迭代,就去學習這個殘差,通俗一點說就是以殘差作為第i+1輪迭代構建決策樹的標簽。
二元分類
我們使用負二項對數似然作為損失函數:
$$L(y,F)=log(1+exp(-2yF)),y∈\{1,1\}$$
其中,$F(x)=\frac{1}{2}log[\frac{P(y=1|x)}{P(y=-1|x)}]$
看這個公式有沒有很熟悉?是的,這個負二項對數似然可以推到邏輯回歸的損失函數。
我們知道邏輯回歸的預測函數為:
$$P(y=1|x)=\frac{1}{1+exp(-θ^Tx)},y∈\{0,1\}$$
我們知道這里的負樣本y=-1對應於邏輯回歸里的負樣本y=0,所以有:
$$F(x)=\frac{1}{2}log[\frac{P(y=1|x)}{P(y=-1|x)}]=\frac{1}{2}log[\frac{P(y=1|x)}{P(y=0|x)}]=\frac{1}{2}θ^Tx$$
將上式代入$L(y,F)$,可得$L(y,F)=log(1+exp(-2yF))=log(1+exp(-yθ^Tx)),y∈\{-1,1\}$
當y=1時,$L(y,F)= log(1+exp(-θ^T x))=y log(1+exp(-θ^T x) )=ylog(P(y=1|x))$
當y=-1時,$L(y,F)=log(1+exp(θ^T x) )=log(1-P(y=1|x))$
令$y$←0,$L(y,F)=(1-y)log(1-P(y=1|x))$
結合在一起,可以寫成:
$$L(y,F)=ylog(P(y=1|x))+(1-y)log(1-P(y=1|x)),y∈\{0,1\}$$
與邏輯回歸損失函數一致,得證。
預測函數$F_{m-1} (x)$的當前負梯度值,也可以說是偽響應$\tilde{y}$為:
$$\tilde{y}=-[\frac{∂L(F(x),y)}{∂F(x)}]_{F(x)=F_{m-1}(x)}=\frac{2y}{1+exp(2yF_{m-1}(x))}$$
我們仍然將回歸樹作為基學習器,進行線搜索得到最優葉子節點值:
$$γ_{m,j}=argmin_y\sum_{x∈R_{m,j}}log(1+(-2y(F_{m-1}(x)+γ)))$$
一看這個公式就知道計算量不是一般的大,我們用[Newton-Raphson近似][2],得到:
$$γ_{m,j}=\frac{\sum_{x∈R_{m,j}}\tilde{y}_i}{\sum_{x∈R_{m,j}}|\tilde{y}_i|(2-|\tilde{y}|)}$$
總結一下算法流程如下:
- 1. 初始化:$F_0 (x)=argmix_ρ\sum_{i=1}^NL(y,ρ)$ ,$N$表示樣本量
- 2. For $m=1$ to $M$ do:3. end For
- (a) $\tilde{y}_i=\frac{2y_i}{1+exp(2y_iF_{m-1}(x_i))},i=1,2,……,N$
- (b) 根據$\tilde{y}_i$學習得到了第m棵回歸樹,對應的葉節點區域為$\{R_j\}_1^J$
- (c) $γ_{m,j}=\frac{\sum_{x∈R_{m,j}}\tilde{y}_i}{\sum_{x∈R_{m,j}}|\tilde{y}_i|(2-|\tilde{y_i}|)}$
- (d) $F_m (x)=F_{m-1} (x)+\sum_{j=1}^Jγ_{m,j} I(x∈R_{m,j})$
最后,我們得到了預測函數$F_M(x)$,用來進行概率估計:
$$P(y=1|x)=p=\frac{e^{2F(x)}}{1+e^{2F(x)}}=\frac{1}{1+e^{-2F(x)}}$$
$$P(y=-1|x)=1-p=\frac{1}{1+e^{2F(x)}}$$
有了概率之后,我們可以對樣本進行分類。
多元分類
我們使用多分類log損失作為損失函數:
$$L(y,F)=-\sum_{k=1}^{K}y_klogp_k(x)$$
對應的概率$p_k(x)$為(就是softmax):
$$p_k (x)=\frac{e^{F_k (x)}}{\sum_{l=1}^Ke^{F_l (x)}}$$
對於多分類問題,在構建基學習器時,我們要為每個類別k創建一棵回歸樹$F_k (x),k=1,2,……,K$
$$\tilde{y}_{i,k}=y_{i,k}-p_{k,m-1} (x_i)$$
因此,每次迭代m,以概率角度來計算當前殘差。
葉子節點值近似為:
$$γ_{m,j}=\frac{K-1}{K}\frac{\sum_{x∈R_{m,j}}\tilde{y}_i}{\sum_{x∈R_{m,j}}|\tilde{y}_i|(2-|\tilde{y}|)}$$
面經
- GBDT為什么是在擬合前面幾輪的殘差?請公式推導。
- SVM為什么要比GBDT好?(這個問題有點奇怪,但是面試官真的是這么問的(微笑臉),因為我簡歷里寫了用SVM做分類,面試官就問為什么不用GBDT,SVM比GBDT好在哪里?……)這個問題我至今不知道答案,請大神賜教。
- GBDT和LR的差別。(這個問題可以推廣的,和AdaBoost、RF、XgBoost,etc的差別)
- 在你所知的算法中,哪個抗噪能力最強?哪個對采樣不敏感?
作者 Scorpio.Lu
轉載請注明出處!