xgboost原理及應用 轉

2022-07-30 04:15:13 字數 2909 閱讀 2361

說到xgboost,不得不說gbdt。了解gbdt可以看我這篇文章 位址,gbdt無論在理論推導還是在應用場景實踐都是相當完美的,但有乙個問題:第n顆樹訓練時,需要用到第n-1顆樹的(近似)殘差。從這個角度來看,gbdt比較難以實現分布式(ps:雖然難,依然是可以的,換個角度思考就行),而xgboost從下面這個角度著手 

注:紅色箭頭指向的l即為損失函式;紅色方框為正則項,包括l1、l2;紅色圓圈為常數項。 

利用泰勒展開三項,做乙個近似,我們可以很清晰地看到,最終的目標函式只依賴於每個資料點的在誤差函式上的一階導數和二階導數。

(1)定義樹的複雜度

對於f的定義做一下細化,把樹拆分成結構部分q葉子權重部分w。下圖是乙個具體的例子。結構函式q把輸入對映到葉子的索引號上面去,而w給定了每個索引號對應的葉子分數是什麼。 

定義這個複雜度包含了一棵樹裡面節點的個數,以及每個樹葉子節點上面輸出分數的l2模平方。當然這不是唯一的一種定義方式,不過這一定義方式學習出的樹效果一般都比較不錯。下圖還給出了複雜度計算的乙個例子。 

注:方框部分在最終的模型公式中控制這部分的比重 

在這種新的定義下,我們可以把目標函式進行如下改寫,其中i被定義為每個葉子上面樣本集合

這乙個目標包含了tt個相互獨立的單變數二次函式。我們可以定義

最終公式可以化簡為

通過對求導等於0,可以得到

然後把最優解代入得到:

(2)打分函式計算示例

obj代表了當我們指定乙個樹的結構的時候,我們在目標上面最多減少多少。我們可以把它叫做結構分數(structure score)

(3)列舉不同樹結構的貪心法

貪心法:每一次嘗試去對已有的葉子加入乙個分割

對於每次擴充套件,我們還是要列舉所有可能的分割方案,如何高效地列舉所有的分割呢?我假設我們要列舉所有x < a 這樣的條件,對於某個特定的分割a我們要計算a左邊和右邊的導數和。

我們可以發現對於所有的a,我們只要做一遍從左到右的掃瞄就可以列舉出所有分割的梯度和gl和gr。然後用上面的公式計算每個分割方案的分數就可以了。

觀察這個目標函式,大家會發現第二個值得注意的事情就是引入分割不一定會使得情況變好,因為我們有乙個引入新葉子的懲罰項。優化這個目標對應了樹的剪枝, 當引入的分割帶來的增益小於乙個閥值的時候,我們可以剪掉這個分割。大家可以發現,當我們正式地推導目標的時候,像計算分數和剪枝這樣的策略都會自然地出現,而不再是一種因為heuristic(啟發式)而進行的操作了。

在實際的業務場景下,我們往往需要自定義損失函式。這裡給出乙個官方的 鏈結 位址

由於xgboost的引數過多,使用gridsearch特別費時。這裡可以學習下這篇文章,教你如何一步一步去調參。位址

任務:二分類,存在樣本不均衡問題(scale_pos_weight可以一定程度上解讀此問題) 

(1)objective [ default=reg:linear ] 定義學習任務及相應的學習目標,可選的目標函式如下:

(2)』eval_metric』 the choices are listed below,評估指標:

(3)lambda [default=0]l2 正則的懲罰係數

(4)alpha [default=0]l1 正則的懲罰係數

(5)lambda_bias在偏置上的l2正則。預設值為0(在l1上沒有偏置項的正則,因為l1時偏置不重要)

(6)eta [default=0.3]

為了防止過擬合,更新過程中用到的收縮步長。在每次提公升計算之後,演算法會直接獲得新特徵的權重。 eta通過縮減特徵的權重使提公升計算過程更加保守。預設值為0.3 

取值範圍為:[0,1]

(7)max_depth [default=6]數的最大深度。預設值為6 ,取值範圍為:[1,∞]

(8)min_child_weight [default=1]

孩子節點中最小的樣本權重和。如果乙個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。在現行回歸模型中,這個引數是指建立每個模型所需要的最小樣本數。該成熟越大演算法越conservative 

取值範圍為: [0,∞]

(1)

xgboost演算法原理

全稱 extreme gradient boosting 基礎 gbdt 所屬 boosting迭代型 樹類演算法。適用範圍 分類 回歸 優點 速度快 效果好 能處理大規模資料 支援多種語言 支 持自定義損失函式等等。缺點 發布時間短 2014 工業領域應用較少,待檢驗 xgboost是在gbdt的...

用xgboost獲取特徵重要性及應用

一 xgboost對特徵重要性進行排序的原理 即為什麼xgboost可以對特行的重要性進行排序 根據結構分數的增益情況,計算選擇哪個特徵的哪個分割點 某個特徵的重要性,就是它在所有樹 現的次數之和。二 如何繪製特徵重要性條形圖 三 如何根據特種的重要性進行特徵選擇 特徵選擇的閾值thresh是自己確...

zookeeper原理及應用

zookeeper 分布式服務框架是 apache hadoop 的乙個子專案,它主要是用來解決分布式應用中經常遇到的一些資料管理問題,如 統一命名服務 狀態同步服務 集群管理 分布式應用配置項的管理等。具體簡介可以參照這篇文章。原理篇zookeeper的工作集群可以簡單分成兩類,乙個是leader...