XGBoost入門系列第一講

寬邦科技發表於2019-01-24

Boosted Trees 介紹

XGBoost 是 “Extreme Gradient Boosting”的簡稱,其中“Gradient Boosting”來源於附錄1.Friedman的這篇論文。本文基於 gradient boosted tree ,中文可以叫梯度提升決策樹,下面簡稱GBDT,同時也有簡稱GBRT,GBM。針對gradient boosted tree的細節也可以參考附錄2.這篇網頁,感興趣的朋友可以前往BigQuant進一步學習實踐。

監督學習

XGBoost 主要是用來解決有監督學習問題,此類問題利用包含多個特徵的訓練資料 xixi,來預測目標變數 yiyi。在我們深入探討GBDT前,我們先來簡單回顧一下監督學習的一些基本概念。

模型與引數

監督學習中模型(model)表示一種數學函式,通過給定 xi 來對 yi 進行預測。以最常見的線性模型(linear model)舉例來說,模型可以表述為 yi^=∑jθjxij,這是一個輸入特性進行線性加權的函式。那麼針對預測值的不同,可以分為迴歸或者分類兩種。
監督學習引數(parameters)是待定的部分,我們需要從資料中進行學習得到。在線性迴歸問題中,引數θ來表示。

目標函式:訓練誤差 + 正則化

根據對 yi的不同理解,我們可以把問題分為,迴歸、分類、排序等。我們需要針對訓練資料,嘗試找到最好的引數。為此,我們需要定義所謂的目標函式,此函式用來度量引數的效果。
這裡需要強調的是,目標函式必須包含兩個部分:訓練誤差和正則化

XGBoost入門系列第一講

其中,L表示訓練誤差函式,Ω表示正則項。訓練誤差用來衡量模型在訓練資料上的預測能力。比較典型的有用均方差來衡量。

XGBoost入門系列第一講

另外針對邏輯迴歸,比較常見的損失函式為Logistic函式:

XGBoost入門系列第一講

另外一個比較重要的部分就是正則項,這也是很多人容易忘記的部分。正則項是用來控制模型的複雜度,以防止過擬合(overfitting)。這聽起來有點抽象,那麼我們用下面的例子來說明。針對下面左上角的這幅圖,我們需要找到一個階梯函式來擬合圖中的資料點集合。那麼問題來了,下面剩下的三幅圖中,哪一個你認為是最好的呢?

XGBoost入門系列第一講

答案是用紅色標註出來的這幅圖。為什麼呢?因為我們對於好的模型的判斷依據是 簡單(simple)並且 準確(predictive)。但這兩者又是相互矛盾的,在機器學習中我們也把這兩者也用 bias-variance 來表述。

複合樹模型(Tree Ensemble)

在前面我們已經介紹了監督學習,現在讓我們開始瞭解樹模型。首先先來了解一下xgboost所對應的模型:複合樹模型。複合樹模型是一組分類和迴歸樹(classification and regression trees - CART)。這裡我們舉CART中的一個例子,一類分類器用來辨別某人是否喜歡計算機遊戲。

XGBoost入門系列第一講

我們把家庭中的成員分到了不同的葉子節點,同時每個葉子節點上都有一個分數。CART與決策樹相比,細微差別在於CART的葉子節點僅包含判斷分數。在CART中,相比較於分類結果,每個葉子節點的分數給我們以更多的解釋。這讓CART統一優化節點更為容易,這在後面會有具體介紹。

通常情況下,在實踐中往往一棵樹是不夠用的。這個時候往往需要把多棵樹的預測結果綜合起來,這就是所謂的複合樹模型。

XGBoost入門系列第一講

上面就是由兩棵樹組成的複合樹的例子。每棵樹上的分數簡單相加就得到了最終的分數。用數學式子可以表達如下:

XGBoost入門系列第一講

KK表示樹的數目,ff是函式空間FF中的一個函式,FF表示CART的所有可能集合。所以我們的優化目標可以寫作:

XGBoost入門系列第一講

現在問題來了,隨機森林對應的模型是什麼呢?對了,也是複合樹模型。所以在模型的表述上,隨機森林和提升樹是一樣的,他們倆的區別只是在於如何訓練。這也就意味著,如果要寫一個關於複合樹模型的預測服務,我們只需要寫一個就可以同時支援隨機森林和提升樹。

提升樹 (Tree Boosting)

介紹了模型之後,讓我們看看訓練部分。那麼我們是怎麼訓練這些樹的呢?對於所有的監督學習模型,答案也都是同樣,只需要做兩件事,定義目標函式,然後優化它。
假設我們有如下的目標函式(需要切記目標函式必須包含損失函式及正則項)

XGBoost入門系列第一講

增量訓練 (Additive Training)

首先我們需要問的是,這些樹的引數是什麼?我們會發現,我們所要學習的就是這些 fifi方法,每個方法中定義樹的結構以及葉子節點的分數。這比傳統最優化問題要更難,傳統最優化問題我們可以通過梯度來解決。而且我們無法在一次訓練所有的樹。相反,我們用增量(additive)的方式:每一步我們都是在前一步的基礎上增加一棵樹,而新增的這棵樹是為修復上一顆樹的不足。,我們把每tt步的預測用yi^(t)yi^(t)表示,這樣我們就有了:

XGBoost入門系列第一講

這裡還有疑問的是,在每一步中如何確定哪棵樹是我們需要的呢?一個很自然的想法就是,增加這棵樹有助於我們的目標函式

XGBoost入門系列第一講

我們用MSE(均方差)作為損失函式,這樣式子就變成了:

XGBoost入門系列第一講

對於用MSE求出來的損失函式式子比較友好,包含一個一階項和一個二次項。但是對於其他形式,就很難推匯出這麼友好的損失函式式子了。那麼針對這種情形,我們就用泰勒展開公式(參考附錄4,x取值yi^(t−1)+ft(xi)a取值yi^(t−1))來逼近:

XGBoost入門系列第一講

其中 gihi 定義如下:

XGBoost入門系列第一講

然後針對上述式子,我們刪除常數項,那麼在 tt 目標函式就變成:

XGBoost入門系列第一講

選擇新的一棵樹,上述式子就是優化目標。這樣的優化目標有一個優點,式子只需要考慮gihi。這就是xgboost為什麼能支援自定義損失函式的原因。我們能夠優化每一個損失函式,包括邏輯迴歸和加權邏輯迴歸,只需要把對應的gihi作為輸入傳入即可。

模型複雜度

現在講講正則化。那麼如何定義 Ω(f)呢,在此之前,我們需要定義 f(x)

XGBoost入門系列第一講

這裡ww表示葉子節點上的分數所組成的向量,qq表示每個資料對映到相應葉子節點的對應關係函式,TT表示葉子節點的數量。在XGBoost中,我們用如下公式定義複雜度:

XGBoost入門系列第一講

當然還有其他公式來定義複雜度,但是我們發現上述式子在實踐過程中表現很好。其他樹相關的演算法包不怎麼認真對待正則化,甚至直接忽視掉。

如何計算樹葉子節點上的分數

那麼在增量學習過程中,如何選擇這棵新增的樹呢?要解決這個問題,我們先解決一下其中這個子問題:假設這棵樹的結構已經確定了,如何來計算葉子節點上的分數?
這一部分是推廣過程中比較神奇的一個步驟。根據上述過程,我們寫出第tt步樹的目標值:

XGBoost入門系列第一講

這裡 Ij=i|q(xi)=j表示每個對映到第j個葉子節點對應的資料樣本。需要注意的是,因為對映到相同葉子節點上的資料樣本他們的分數是相同的,所以在第二行我們改變了一下求和順序。同時我們令 Gj=∑i∈Ijg以及 Hj=∑i∈Ijhi,那麼上述公式簡化為:

XGBoost入門系列第一講

在上述式子中,每一個wj是相互獨立的,那麼針對一元二次方程 Gjwj+1/2(Hj+λ)w2j 而言,可以比較容易求出當新增的這棵樹的結構 q(x) 已知的情況下,目標函式最小值下的 wj

XGBoost入門系列第一講

最後的式子計算的是樹 q(x) 的優劣:

XGBoost入門系列第一講

如果上面的式子看著比較複雜的話,那麼根據上面的這幅圖來看如何計算這些分數,就會顯得更直觀些。一旦樹的結構已知的話,我們只需要通過計算每個節點上的 gigihihi ,然後把各個葉子節點上的這些數值加起來,用上述方程式就可以計算這棵樹的優劣了。

如何學習樹的結構

現在我們已經知道一旦樹的結構固定下來以後,如何來計算葉子節點上的分數,以及計算這棵樹的優劣。那麼關於現在我們要來解決如何來學習這棵樹的結構。比較簡單粗暴的方法就是遍歷所有可能的樹結構,然後從中找到最好的那棵樹。但是這也是不切實際的,因為需要遍歷的情況實在是太多了。所以我們來尋求一種貪婪的解法,就是在樹的每個層構建的過程中,來優化目標。那麼這裡假設在某一層的構建過程中,假設特徵已經選定,我們先如何進行二叉劃分呢,以及是不是需要進行劃分?我們可以通過下面的式子來計算劃分之後,在目標上所獲得的收益(這個收益越越好,負數表示收益為負):

XGBoost入門系列第一講

上面的這個式子可以分解為 1) 若是劃分,劃分後左邊節點的收益 2) 或是劃分,劃分後右邊節點的收益 3) 如不劃分,原先節點的收益 4) 劃分後正則項的收益。通過上述式子比較容易看到,當劃分後葉子節點所帶來的新增收益小於 γγ ,我們最好還是不要進行二叉劃分,保留原樣是最好的。這也是日後做剪枝的依據。

那麼針對排序後的特徵,我們所要做的就是遍歷各種劃分,找到一個最好的劃分點,如下圖表示。

XGBoost入門系列第一講

那麼這裡還有一個問題就是在構建樹的結構過程中,在某一層如何進行特徵選擇呢?這裡提供了一種比較簡單的方式就是遍歷每一種特徵,然後根據上述式子的Gain,找到最大的Gain值對應的特徵。

關於XGBoost的最後幾句話

我們花了很長時間來講解 Boosted Tree,那麼XGBoost相較於Boosted Tree,又做了哪些額外的事情呢?XGBoost是遵循上述Boosted Tree思想的工程實現,但同時又考慮兼顧系統優化和機器學習原理,最大化的保證可擴充套件性、便捷性以及準確性。

附錄:

  1. 《Greedy Function Approximation: A Gradient Boosting Machine》 
  2. http://www.csuldw.com/2015/08/19/2015-08-19%20GBDT/ 
  3. https://xgboost.readthedocs.io/en/latest/model.html 
  4. https://zh.wikipedia.org/wiki/泰勒公式 
  5. http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf 

原文連結:《 XGBoost 入門系列第一講

本文由BigQuant人工智慧量化投資平臺原創推出,版權歸BigQuant所有,轉載請註明出處。 

相關文章