【演算法】關於xgboost特徵重要性的評估

CS正陽發表於2019-05-29

xgboost很好用,但是很多同學對它特徵重要性評估的原理不太明白。今天簡單梳理下:

在這裡插入圖片描述

特徵重要性函式

呼叫xgb.feature_importances_函式,即可求出各個特種的重要性,這是我們的目標。
現在就來探究一下,這個feature_importances是怎麼得到的。
在這裡插入圖片描述
那麼重要性指標到底是如何評價的呢?進入feature_importances_,可以看到:
①求每個特徵對應的score
②把每個特徵得到的score/sum(score)
大概思路如此。
在這裡插入圖片描述
那麼,現在就要知道,這個score到底是怎麼求得的?

此時,我們需要知道,特徵重要性指標評估三種常用的方式:

gain 增益意味著相應的特徵對通過對模型中的每個樹採取每個特徵的貢獻而計算出的模型的相對貢獻。與其他特徵相比,此度量值的較高值意味著它對於生成預測更為重要。

cover 覆蓋度量指的是與此功能相關的觀測的相對數量。例如,如果您有100個觀察值,4個特徵和3棵樹,並且假設特徵1分別用於決定樹1,樹2和樹3中10個,5個和2個觀察值的葉節點;那麼該度量將計算此功能的覆蓋範圍為10 + 5 + 2 = 17個觀測值。這將針對所有4項功能進行計算,並將以17個百分比表示所有功能的覆蓋指標。

freq 頻率(頻率)是表示特定特徵在模型樹中發生的相對次數的百分比。在上面的例子中,如果feature1發生在2個分裂中,1個分裂和3個分裂在每個樹1,樹2和樹3中;那麼特徵1的權重將是2 + 1 + 3 = 6。特徵1的頻率被計算為其在所有特徵的權重上的百分比權重。

增益是解釋每個特徵的相對重要性的最相關屬性。
在這裡插入圖片描述
至於gain的演算法,可以回顧下cart或者xgboost相關內容:
在這裡插入圖片描述
繼續點選進入get_score函式。可以看到,原始碼中,就是用gain來做重要性判斷的。
在這裡插入圖片描述
這麼說顯得稍微抽象一點,我們畫樹圖,或者直接把trees列印出來:

在這裡插入圖片描述
在這裡插入圖片描述

可以看到,每顆tree都有對應的fid、gain、cover、leaf,只需要把對應的gain提取出來即可。
回到get_score函式,可以看到,大致思路如我所想:
①for tree in trees
②for line in tree.split
③get gain

這裡需要注意的是:特徵gain的疊加性,判斷一個特徵的gain,需要把其在每棵樹對應的gain分別得到,然後求平均,這樣比較靠譜。
在這裡插入圖片描述
一頓操作之後,可以看到,每個特徵對應的average gain就得到了:
在這裡插入圖片描述

再根據之前所說的求重要性佔比,即可得到一個特徵就增益係數gain而言,對整個模型的重要性程度
在這裡插入圖片描述


  對資料分析、機器學習、資料科學、金融風控等感興趣的小夥伴,需要資料集、程式碼、行業報告等各類學習資料,可新增微信:wu805686220(記得要備註喔!),也可關注微信公眾號:風控圏子(別打錯字,是圏子,不是圈子,算了直接複製吧!)

【演算法】關於xgboost特徵重要性的評估

關注公眾號後,可聯絡圈子助手加入如下社群:

  • 機器學習風控討論群(微信群)
  • 反欺詐討論群(微信群)
  • python學習交流群(微信群)
  • 研習社資料(qq群:102755159)(乾貨、資料、專案、程式碼、報告、課件)

相互學習,共同成長。

相關文章