1. 程式人生 > >Xgboost原理推導

Xgboost原理推導

XGBoost全名叫(eXtreme Gradient Boosting)極端梯度提升,經常被用在一些比賽中,其效果顯著。它是大規模並行boosted tree的工具,它是目前最快最好的開源boosted tree工具包。下面我們將XGBoost的學習分為3步:①整合思想 ②損失函式分析 ③求解。我們知道機器學習三要素:模型、策略、演算法。對於整合思想的介紹,XGBoost演算法本身就是以整合思想為基礎的。所以理解清楚整合學習方法對XGBoost是必要的,它能讓我們更好的理解其預測函式模型。在第二部分,我們將詳細分析損失函式,這就是我們將要介紹策略。第三部分,對於目標損失函式求解,也就是演算法了。

一、整合思想

在學習XGBoost之前,我們得需要先明白整合思想。整合學習方法是指將多個學習模型組合,以獲得更好的效果,使組合後的模型具有更強的泛化能力。另外XGBoost是以分類迴歸樹(CART樹)進行組合。故在此之前,我們先看下CART樹(CART樹具體原理請自行復習,或者可以留言)。如下,通過輸入使用者年齡、性別進行判斷使用者是否喜歡玩遊戲的得分值。由此得到一顆CART樹模型。

我們知道對於單個的決策樹模型容易出現過擬合,並且不能在實際中有效應用。所以出現了整合學習方法。如下圖,通過兩棵樹組合進行玩遊戲得分值預測。其中tree1中對小男生的預測分值為2,tree2對小男生的預測分值為0.9。則該小男生的最後得分值為2.9。

將上面整合學習方法推廣到一般情況,可知其預測模型為:

其中為樹的總個數,表示第顆樹,表示樣本的預測結果。

損失函式為:

其中為樣本的訓練誤差,表示第顆樹的正則項。

二、損失函式

上面一部分我們知道了整合學習方法的預測模型,因為XGBoost也是整合學習方法的一種。對於XGBoost的預測模型同樣可以表示為:

其中為樹的總個數,表示第顆樹,表示樣本的預測結果。

其中損失函式也同樣表示為:

其中為樣本的訓練誤差,表示第棵樹的正則項。

看到了這裡,我們可能會想到,現在知道了模型預測函式和損失函式,那我們是不是直接就能求出其預測模型了呢?答案肯定不是,我們首先需要明確知道優化和求解的引數是什麼呢?由上面的預測模型中,我們可以看到對於每棵樹的預測值

 是如何計算的?想到這裡,你就已經知道了需要做的事了,我需要求解和優化的就是每個葉子節點的得分值,也就是 的值。另外 我們知道XGBoost是以CART樹中的迴歸樹作為基分類器,在給定訓練資料後,其單個樹的結構(葉子節點個數、樹深度等等)基本可以確定了。但XGBoost並不是簡單重複的將幾個CART樹進行組合。它是一種加法模型,將模型上次預測(由t-1棵樹組合而成的模型)產生的誤差作為參考進行下一棵樹(第t棵樹)的建立。以此,每加入一棵樹,將其損失函式不斷降低。如下圖就為加法模型案例,它將模型預測值與實際值殘差作為下一顆樹的輸入資料。

對於加法策略可以表示如下:

初始化(模型中沒有樹時,其預測結果為0):

往模型中加入第一棵樹:

往模型中加入第二棵樹:

往模型中加入第t棵樹:

其中表示第棵樹,表示組合棵樹模型對樣本的預測結果。

我們知道,每次往模型中加入一棵樹,其損失函式便會發生變化。另外在加入第t棵樹時,則前面第t-1棵樹已經訓練完成,此時前面t-1棵樹的正則項和訓練誤差都成已知常數項。對於每棵樹的正則項部分,我們將在後面再細說。

如果損失函式採用均方誤差時,其目標損失函式變為:

另外對於目標損失函式中的正則項(複雜度)部分,我們從單一的樹來考慮。對於其中每一棵迴歸樹,其模型可以寫成:

其中為葉子節點的得分值,表示樣本對應的葉子節點。為該樹的葉子節點個數。

因此,在這裡。我們將該樹的複雜度寫成:

複雜度計算例子如下:

此時,對於XGBoost的目標函式我們可以寫為:

三、求解

在推導之前,我們先介紹下泰勒展開式:

這裡我們用泰勒展開式來近似原來的目標函式,將看作。則原目標函式可以寫成:

,同時對於第t棵樹時,為常數。同時去除所有常數項。故目標損失函式可以寫成:

由上面介紹書的複雜度時,我們知道:,同時我們將目標函式全部轉換成在第t棵樹葉子節點的形式。因為目前對於可以看做是每個樣本在第t棵樹的葉子節點得分值相關函式的結果之和,所以我們也能從第t棵樹的葉子節點上來表示。

其中為第t棵樹中總葉子節點的個數,表示在第個葉子節點上的樣本,為第個葉子節點的得分值。

在這裡,令

則:

求偏導,並使其導函式等於0,則有:

求解得:

其目標函式可以為:

到此,推導完成。