集成學習-Boosting-GBDT

GBDT (梯度提升樹 Gradient Boosting Decision Tree )

GBDT是以決策樹(CART回歸樹)為弱學習器,應用加法模型的boosting算法
模型
f_M(x)=\sum_{t=1}^{M}h_t(x)
f_M(x)=f_{M-1}(x)+h_M(x)
M代表弱學習器個數,h_t 是第t個弱學習器

損失函數
L(y, f_{t}(x)) =L(y, f_{t-1}(x)+ h_t(x))

GBDT的基本思想
f_t(x)=f_{t-1}(x)+h_t(x)
那么,新的h_t(x)應該怎么求解呢?
首先,新的h_t(x)需要減小損失 L(y, f_{t}(x)) ,那對于減小損失,我們肯定能想到梯度下降
注意,L是f_t 的函數,其他參數y,x都是固定的,f(x)是L唯一可變的參數,不同之處在于f(x)是一個函數,而通常梯度下降的自變量是實數或實數向量,那么就可以求L關于f(x)的偏導/梯度
\frac{\partial L(y, f(x)))}{\partial f(x)} = \nabla L
即如果f(x)沿著上述負梯度方向走一步,就可以減小一部分損失
那么,f(x)走一步是什么意思?
因為f_t(x)=f_{t-1}(x)+h_t(x),也就是說新走的這一步就是h_t(x)
就像通常梯度下降更新參數 \alpha_t = \alpha_{t-1} - \lambda \nabla L 一樣
f_t(x)=f_{t-1}(x)- \lambda\nabla L
這里我們讓h_t(x)=- \nabla L (此處先忽略學習率\lambda,后續訓練好h_t之后,可以再加上作為其系數)
所以,
GB-Gradient Boosting 是指下一個弱學習器擬合當前損失函數的負梯度。這是函數級的梯度下降法的一個應用。
DT-Decision Tree,就是指弱學習器使用CART回歸樹:
h_t(x) = \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})

回歸算法

數據集
D=\{(x_1,y_1),(x_2,y_2), ...(x_m,y_m)\}
1,初始化弱學習器
f_0(x) = \underbrace{arg\; min}_{c}\sum\limits_{i=1}^{m}L(y_i, c)
2,對于后續1~M次的迭代:

  • 2.1 對樣本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)}

    得到新數據集
    D_t=\{(x_1,r_{t1}),(x_2,r_{t2}), ...(x_m,r_{tm})\}

  • 使用數據集D_t擬合一棵CART樹 h_t(x)

  • 更新強學習器:
    \begin{alignedat}{} f_{t}(x) &= f_{t-1}(x) + h_t(x)\\ &= f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})\\ \end{alignedat}
    其中,J為新樹的葉子節點數,c_{tj} 為新樹第j個葉子節點的預測值

3,得到最終的回歸器:
f(x) = f_M(x) =f_0(x) + \sum\limits_{t=1}^{T}\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})
此處的關鍵在于求解負梯度并用負梯度作為下一輪弱學習器需要擬合的值。
另外就是弱學習器的擬合過程,這就是決策樹訓練的問題了

分類算法

GBDT應用于回歸比較容易理解,因為本身CART回歸樹返回的就是連續值,在構造損失函數時,預測的連續值與真實的連續值方便計算損失,例如使用MSE,MAE等都很方便。
但是,當GBDT應用于分類任務時,真實值是0,1之類的離散標簽,而回歸樹的返回值依舊是連續值,此時,應該如何構造損失函數呢?

其實,這樣的問題,我們遇到過:即邏輯回歸。
在邏輯回歸中,WX 是一個線性模型,其返回的也是連續值,但可以通過sigmod函數將其轉換成一個0-1的概率值
P(y=1|x)=\frac{1}{1+exp(-wx)}
同樣,我們也可以把GBDT最終的強分類器轉換成邏輯回歸的形式即
\begin{alignedat}{2} P(y=1|x)&=\frac{1}{1+exp(-f_M(x))}\\ &=\frac{1}{1+exp(-\sum_{j=0}^{M}h_j(x))}\\ &=s(f_M(x))\\\\ P(y=0|x)&=1-\frac{1}{1+exp(-f_M(x))}\\ &=\frac{1}{1+exp(f_M(x))} \end{alignedat}

則,對于樣本(x_i,y_i)
分對的概率
P_i=P(y=1)^yP(y=0)^{(1-y)}
利用對數最大似然做損失函數(目標函數)
\begin{alignedat}{2} L&=log(\sum_{i=1}^{m}Pi)\\ &=\sum_{i=1}^{m}\bigg[y_ilogP(y=1)+(1-y_i)logP(y=0)\bigg]\\ &=\sum_{i=1}^{m}\bigg[y_if_M(x_i)-log(1+exp(f_M(x)))\bigg]\\\\ \nabla L &=\frac{\partial L}{\partial f_M(x_i)}\\ &=y_i - s(f_M(x_i)) \end{alignedat}

因為是最大化上述L,所以此處選擇正梯度。
即,下一個弱學習器h_t(x_i)要擬合 y_i - s(f_{t-1}(x_i))

正則

1,縮減系數
f_{k}(x) = f_{k-1}(x) + \nu h_k(x) ,0 < \nu \leq 1
類似于梯度下降中的學習率\lambda
也類似于adaboost中的弱學習器權重 \alpha
2,子采樣
3,剪枝

提升樹 Boosting Tress

GBDT就是一種提升樹。但此處為何后講提升樹先講GBDT呢?
因為如果一開始講BT,就難以繞開一個比較經典的例子:預測年齡
對于預測年齡這個回歸問題,在加法模型這里可以這么做:
一個30歲的人,先預測20歲作為第一個弱模型M1
M1略有不足,有多少不足?有30-20=10的不足。
于是下一個弱模型M2就把10歲當做新數據去擬合預測,得到7
這樣M1+M2=27,比較準確了,但依舊有3的不足
于是下一個弱模型M3去預測3
以此類推,得到最終的強模型f=M1+M2+...+Mn

這個例子,其實在一定程度上解釋了大部分boosting模型,尤其是加法模型。
即:每個弱學習器只擬合模型目前的不足。

其實,弱學習器擬合很容易,關鍵是,如何度量這個“不足”
AdaBoost用改變樣本權重的方式度量當前模型的不足,權重的改變會引起錯誤率e的改變
GBDT用損失函數的負梯度來度量這個不足。
而有些模型,會使用一個叫“殘差”的東西度量不足。
這個模型出現在以平方損失為損失函數,以提升樹為基本模型的回歸任務中。
具體的
\begin{alignedat}{2} L&=(y-\widehat{y})^2\\ &=(y-f_{t-1}(x)-h_t(x))^2\\ &=(r - h_t(x))^2\\ r&=y-f_{t-1}(x) \end{alignedat}
在這里,殘差r就是預測值與樣本值之差
從上述L來看,如果要讓L減小,就應該讓 h_t(x) 盡可能去擬合 r 沒毛病。
而注意到,L在f_{t-1}處的負梯度,恰好也等于r
所以,這個模型,也可以是GBDT。
是不是所有負梯度都等于殘差r呢? 肯定不是,只有平方損失才是
那兩者不相等,到底應該去擬合負梯度還是殘差呢?
一直都是擬合負梯度,只不過平方損失時負梯度有另一個名字叫“殘差”
那我可不可以只去擬合殘差即便損失函數不用平方損失的時候?因為計算殘差很簡單啊!
1,在分類問題中,無法直接使用殘差。就像上述GBDT的分類問題中,需要把強學習器轉換成概率而這時如果用殘差是無意義的。
以下內容,部分引用自知乎:
1,在機器學習算法中,總要有一個損失函數,我們的目的是減小損失函數。
如果是用了殘差,即每一輪都去直接擬合上一輪殘差,也就是說放棄了損失函數的指導,即此時無論選擇什么損失函數,模型不會有什么區別。
損失函數減小和殘差減小可以乍一看方向一樣,但是細想還是有很大區別的。即我們訓練一個模型,目的是為了去預測位置未知數據,這里就涉及到模型的泛化能力,所以訓練的模型不能過擬合。為了防止過擬合,損失函數可以添加正則項,而殘差無法添加正則項,如果一味擬合殘差,容易過擬合
2,其實,當你選擇了擬合殘差,就是選擇了平方損失做損失函數。而損失函數不止一種。
3,另外我不是很喜歡“損失函數負梯度去擬合殘差”這句話,很容易引起誤解,覺得殘差才是最好的那個。不同的損失函數應對不同的模型和任務,殘差或許適合某些任務,但沒有GBDT廣發廣泛。
4,或許我們對殘差的理解有誤。我更傾向于把殘差改為“當前模型的不足”這個不足不(只)是針對訓練數據的不足,而是針對完備的真實數據的不足。而損失函數,尤其是帶正則的損失函數,更能度量模型與完備真實數據的偏差。

討論

優點:我們可以把樹的生成過程理解成自動進行多維度的特征組合的過程,從根結點到葉子節點上的整個路徑(多個特征值判斷),才能最終決定一棵樹的預測值。另外,對于連續型特征的處理,GBDT 可以拆分出一個臨界閾值,比如大于 0.027 走左子樹,小于等于 0.027(或者 default 值)走右子樹,這樣很好的規避了人工離散化的問題。

缺點:對于海量的 id 類特征,GBDT 由于樹的深度和棵樹限制(防止過擬合),不能有效的存儲;另外海量特征在也會存在性能瓶頸,經筆者測試,當 GBDT 的 one hot 特征大于 10 萬維時,就必須做分布式的訓練才能保證不爆內存。所以 GBDT 通常配合少量的反饋 CTR 特征來表達,這樣雖然具有一定的范化能力,但是同時會有信息損失,對于頭部資源不能有效的表達。

參考

劉建平博客-GBDT
GBDT用于分類
統計學習方法-李航
GBDT縮減系數
負梯度與殘差
https://cloud.tencent.com/developer/article/1005416

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容