機器學習教程 之 梯度提升方法:GBDT處理分類問題

Gradient boosting是一種廣泛被用於迴歸、分類和排序任務的集成方法,於2001年被Friedman提出
該類算法通過以上一輪基學習器的誤差的負梯度爲訓練目標訓練本輪的基學習器,不斷降低集成模型在訓練集上的偏差實現高精度的集成
基於Gradient Boosting算法的學習器被稱爲Gradient Boosting Machine(GBM),如果說AdaBoost是boosting方法的開山之作,那麼GBM就是boosting方法的集大成者。GBM幾乎刷新了各個領域衆多數據集的精度記錄,有人認爲GBM是性能最好的機器學習方法,這種說法有點激進,但通常各類數據競賽贏家的策略裏也確實都會有這類算法的方法或者思想

由於集成學習方法在實際應用中出色的性能,我曾經寫過幾篇這方面的博文,關於集成學習及其boosting方法的

機器學習教程 之 Boosting 與 bagging:集成學習框架
人工智能裏的數學修煉 | AdaBoost的數學原理: 分佈更新推導
機器學習教程 之 集成學習算法: 深入刨析AdaBoost

還有一片關於 bagging 類隨機森林的
機器學習教程 之 隨機森林: 算法及其特徵選擇原理

感興趣的朋友可以瞭解一下,可以幫助你們更好的瞭解集成學習的整體情況
我之前寫過一篇博客 機器學習教程 之 梯度提升方法:GBDT及其擴展模型XGBoost 藉助迴歸問題基本上已經完整的講述了GBDT的原理,包括:

1. GBDT的基分類器爲CART樹(分類迴歸樹)
2. 一種boosting方法:Boosting Tree 提升樹
3. 加性模型與前向分佈算法
4. Gradient Boosting 梯度提升
5. GBDT採用的一些小技巧

GBDT處理分類問題時,除了將損失函數替換了之外還有一些稍顯複雜的操作,我會在這篇博客裏詳細的講述GBDT處理分類問題時應該注意的細節,之前博客裏已經提到的內容,除了必要的回顧,其餘的在這裏我會盡量避免重複提及,有什麼疑問可以去上一篇博客瞭解。

這篇博客主要有三塊內容:

1. 簡單回顧GBDT的算法流程
2. GBDT處理二分類問題
3. GBDT處理多分類問題

一、簡單回顧GBDT的算法流程

Friedman在2000年提出了梯度提升算法,該方法是利用最速下降的近似方法,其關鍵是利用當前模型的損失函數負梯度的值

這裏寫圖片描述

作爲迴歸問題算法中的殘差的近似值,擬合一個迴歸模型
GBDT基本的算法流程如下
這裏寫圖片描述

其中,h(xi,am) 表示基學習器步驟4中的 am 表示在Cart樹中擬合負梯度能力最好的學習器參數
負梯度表示的只是下降的方向,但是下降多少沒有確定,步驟5中的 ρm 可以認爲是最優的步長,一般用線性搜索的方式來估計 ρm 的值

再來回顧一下當基分類器爲迴歸樹時的GBDT表示形式
當我們的基分類器是一個包含 J 個節點的迴歸樹時,迴歸樹模型可以表示爲

h(x;(bj,Rj)1J)=b=jJbjI

其中 (Rj)1J 表示不相交的區域,它們的集合覆蓋了預測的空間,(bj)1J 是葉子節點的值,可以認爲是模型 h 的係數,利用迴歸樹模型,之前GBDT的算法流程可以被替換爲
Fm(x)=Fm1(x)+ρmj=1JbjmI(xϵRjm)

其中 (Rjm)1J 是第 m 次迭代生成的樹所產生的區域。第 m 次迭代的樹用來預測流程3中由流程4中平方誤差產生的 (y¯i)iN(bjm) 可以被表示爲
bjm=avexiϵRjmy¯i

即用標籤的平均值表示該葉子節點擬合的值,現在我們已經有了下降的方向 b ,那麼下降的步長 ρm 呢?之前提到的線性搜索是一種方案。我們現在嘗試將 bmjρm 同時求解,令 γjm=ρmbjm ,加性模型可以被表示爲
Fm(x)=Fm1(x)+j=1JγjmI(xϵRjm)

可以通過如下公式來獲取最優的係數 γjm
γjm=argminrxiϵRjmL(yi,Fm1(xi+γ))

γjm 可以作爲葉子節點的值,該值可以看作是基於損失函數 L 的每個葉子節點的最理想的常數更新值,也可以認爲 γjm 是既有下降方向,又有下降步長的值。當然,上面的式子只是給出了求解該值的目標函數,只有在給出具體的 損失函數以後,纔可以根據具體情況進行求解,這也是我們下面兩個章節要說明的問題。

GBDT的分類算法從思想上和GBDT的迴歸算法沒有區別,但是由於樣本輸出不是連續的值,而是離散的類別,導致我們無法直接去擬合類別輸出的誤差,爲了解決這個問題,主要有兩個方法:
第一種方法是用指數損失函數,此時的GBDT會退化爲AdaBoost算法, 關於GBDT退化爲AdaBoost我會在另一篇博客中進行討論
第二種方法使用類似於邏輯迴歸的對數似然損失函數的方法,也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失,本文討論爲也正是這種方法。由於對數似然損失函數有二分類和多分類的區別,GBDT處理分類問題也會分爲二分類和多分類兩種不同的形式,接下來我們會分別討論這兩個形式

二、GBDT處理二分類問題

Friedman採用負二項對數似然損失函數(negative binomial log-likelihood)作爲學習器的損失函數:

L(y,F)=log(1+exp(2yF)),yϵ1,1

其中
F(x)=12log[Pr(y=1|x)Pr(y=1|x)]

這裏的 Pr(y=1|x) 我理解爲分類器預測樣本 x 爲 1 的概率,Pr(y=1|x) 爲分類器預測樣本 x 爲 -1 的概率
計算損失函數的負梯度有
yi¯=[L(y,F(xi))F(xi)]F(x)=Fm1(x)=2yi1+exp(2yiFm1(xi))

葉子節點估計值在該損失函數下的計算公式爲
γjm=argminrxiϵRjmlog(1+exp(2yi(Fm1(xi)+γ)))

該式在論文中通過Newton-Raphson公式來近似求解,估計結果爲
γjm=xiϵRjmy¯ixiϵRjm|y¯i|(2|y¯i|)

根據分類器的最終輸出 F(x) , 我們可以進行概率估計
p+(x)=p=11+e2F(x)

p(x)=1p=11+e2F(x)

有了概率以後我們就可以利用概率進行分類

三、GBDT處理多分類問題

GBDT採用多類邏輯損失函數(muti-class log-loss)作爲損失函數:

這裏寫圖片描述

這裏的 ykϵ0,1 使用softmax來計算最後的類別概率:
這裏寫圖片描述

從上式中我們可以得出,對於多分類問題,我們需要爲每個類別創建一棵迴歸樹 Fl(x)=1,2,...,k , 每一棵樹用來預測一類的概率
根據損失函數計算負梯度爲
這裏寫圖片描述

葉子節點的估計公式爲
這裏寫圖片描述

同樣的通過Newton-Raphson公式來近似求解,估計結果爲
這裏寫圖片描述

得到分類器的輸出結果以後即可通過softmax計算得到最後的類別概率

參考文獻

[1] Jerome H. Friedman. Greedy Function Approximation: A Gradient Boosting Machine[J]. The Annals of Statistics, 2001, 29(5):1189-1232.
[2] http://nbviewer.jupyter.org/github/liudragonfly/GBDT/blob/master/GBDT.ipynb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章