一、XGBoost目標函數

首先認清一點,它是GBDT的升級版,由陳天奇發明,在效率、方法方面都進行了優化。 不管對於回歸問題還是分類問題,好的機器學習方法的目的就是降低目標函數(也可稱為損失函數)的值,目標函數包括2個部分:一是模型的損失函數,二是模型的複雜度。也就是目標函數具有下面的形式:

上面公式中,前者表示模型的損失函數的值,降低它是為了降低偏差,也就是使得預測的數據和真實的數據更為接近;後者表示這個模型的複雜度,是為了降低方差,增強模型的泛化能力。

對於XGBoost框架而言,以弱模型選擇決策樹(因為在XGBoost框架中,弱模型可以有多種選擇,而在GBDT中,弱模型就是決策樹)為例,來說明XGBoost,其目標函數為:

其中H(T_j)表示樹T_j的葉子節點的個數,w是葉子節點的輸出數值。

二、XGBoost目標函數求解

現在說一下XGBoost是如何求解上述目標函數的最小值的。可以看出,上面的目標函數的參數其實也是一個函數(其實樹可看作一個函數),因此要求解需要換個思路。也就是Boosing,利用弱模型的加法形式轉換上面的目標函數。此外,在這裡利用貪心演算法,也就是當前一代的損失函數比上一代的低就可以,不是從整體考慮。轉換後的第t代的目標函數為:

根據二階泰勒展開公式,可得到上述目標函數的近似值:

從上面的式子可以看出XGBoost和GBDT的差異,GBDT只是利用了一階導數,而XGBoost利用了一階導數和二階導數。還有就是GBDT並沒有涉及到模型的複雜度。這個式子求和中的第一項是個常數項,公式的最後一項也是常數項,將它們去掉,變為下式:

從上面式子可知,目標函數只是與損失函數的一階、二階導數有關係,因此XGBoost支持自定義的損失函數。

下面再結合樹的複雜度,首先回顧下複雜度的函數:

其中H(T_j)表示樹T_j的葉子節點的個數,w_r是葉子節點r的輸出數值。

其中q(i)表示樣本i所屬的葉子節點q的樣本集合。w(q(i))表示葉子節點q的輸出值。I_r表示葉子節點r的樣本集合。w_r表示葉子節點r的輸出值。上面的函數是一個沒有交叉項的多元二次函數。下面將每個葉子節點包括的樣本的gi, hi的和各自定義為一個變數。

因為上面是一個二次函數,當樹固定時,就可以獲得上面式子的最小值。對w求導設置為0即可。下面給出最優的w值以及相應的最小的目標函數的值:

再回顧下,目標函數分了2部分,前一部分通過二階泰勒公式的轉換,只是和前一次形成的樹有關係了。後一部分,也就是怎麼構建當前的這個樹呢。上面的式子其實可看作一個樹的評分公式。樹從一開始只是有一個葉子節點(也就是根節點),按照上面的式子計算分數,然後這個節點開始分裂,分裂後再按照上面的公式計算分數,如此下去,遍歷所有的可能性,選擇上述值最小的那個。暴力可行,但是還有更好的方法。

下面給出分裂一個當前的葉子節點,這個目標函數的變化值Change,通過變化值的正負變化,就可以判斷這個葉子節點該不該分裂:如果下面的值小於0,則說明需要分裂。

舉個例子說明,假如現在要以特徵為年齡,年齡值為10作為分割點,則有

下面給出如何得到最優分割點(也就是上圖中的年齡、10):

  • 暴力

遍歷所有的特徵,將每個特徵的值從小到大順序排列,然後從左到右遍歷一次即可得到這個特徵中哪個分割點的Change最小,然後在所有特徵中選擇Change最小的那個作為最終的分割點。

  • 陳天奇提出的Weighted Quantile Sketch方法
  • 近似直方圖演算法

三、XGBoost相比GBDT的改進

  • GBDT在優化時只用到一階導數信息,XGBoost同時用到了一階和二階導數,還支持自定義損失函數,前提損失函數可一階和二階求導;

  • 加入了正則項,用於控制模型的複雜度,防止過擬合;
  • 借鑒了隨機森林的做法,支持列抽樣(隨機選擇特徵),不僅能降低過擬合,還能減少計算;
  • 尋找最佳分割點時,實現了一種近似法,還考慮了稀疏數據集、缺失值的處理,大大提升演算法的效率;
  • 支持並行;
  • 近似直方圖演算法,用於高效地生成候選的分割點;
  • 在演算法實現時做了很多優化,大大提升了演算法的效率,內存空間不夠時,利用了分塊、預取、壓縮、多線程協作的思想。

四、XGBoost實例

  • 北京Pm2.5回歸 參數選擇圖

預測數據集結果對比

  • 成年人收入分類 參數選擇圖

預測數據集結果展示

代碼下載:

Anfany/Machine-Learning-for-Beginner-by-Python3?

github.com
圖標

歡迎Fork,感謝Star!!!

微信搜索,關注微信訂閱號pythonfan, 獲取更多機器學習實例和代碼。


推薦閱讀:
相关文章