從提高樹出發,——》迴歸提高樹、二元分類、多元分類三個GBDT常見算法。html
在說GBDT以前,先說說提高樹(boosting tree)。說到提高(boosting),老是繞不過AdaBoost。git
AdaBoost是利用前一輪迭代的偏差率來更新訓練集的權重,校訂前一輪迭代被錯誤分類的樣本,通俗一點的理解就是將重心放在分錯的樣本上。提高樹也是boosting家族的成員,意味着提高樹也採用加法模型(基學習器線性組合)和前向分步算法。github
下面一個一個進行解釋,提高樹的基學習器是什麼,加法模型和前向分步算法又是怎麼用的。面試
提高樹一般以決策樹做爲基學習器,對分類問題決策樹是二叉分類樹,迴歸問題就是二叉迴歸樹。算法
加法模型,就是說提高樹能夠表示爲如下形式:這裏咱們約定 $ T(x;Θ_m ) $表示第m棵決策樹;$ Θ_m $表示決策樹的參數;$ M $爲樹的個數。強分類器$f_M (x)$能夠由多個弱分類器$T(x;Θ_m )$線性相加而成。app
$$f_M (x)=\sum_{m=1}^MT(x;Θ_m ) $$函數
提高樹的前向分步算法。第m步的模型能夠寫成:學習
$$f_m (x)=f_{m-1} (x)+ T(x;Θ_m )$$優化
而後獲得損失函數ui
$$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
最關鍵的點在於損失函數的數值優化能夠當作是在函數空間而不是參數空間。怎麼理解呢?
首先,咱們已經知道強分類器是由多個弱分類器線性相加而成,那麼能夠寫成以下形式:
$$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,如今來整理整個算法流程:
當基學習器$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}$,這個值是葉子節點的最理想的常數更新值,也能夠認爲兼顧了降低方向和降低步長。
綜上,整理一下回歸提高樹的整個算法流程:
$$\tilde{y}=-[\frac{∂ϕ(F(x))}{∂F(x)}]_{F(x)=F_{m-1}(x) }=y_i-F_{m-1}(x_i),i=1,2,……,N$$
$$h_m(x;a)=\sum_{j=1}^Jγ_{m,j}I(x∈R_{m,j})$$
$$F_m(x)=F_{m-1}(x)+\sum_{j=1}^Jγ_{m,j}I(x∈R_{m,j})$$
$$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}|)}$$
總結一下算法流程以下:
最後,咱們獲得了預測函數$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}|)}$$
做者 Scorpio.Lu轉載請註明出處!