xgboost模型特徵重要性的不同計算方式

看穿資料之美發表於2019-09-17

1.特徵重要性的意義

(邏輯迴歸模型最簡單,我就拿它說事了)

  我們都知道在常見的邏輯迴歸模型中,每個特徵對應一個模型引數 w i w_{i} wi,該引數越大,那麼該特徵對模型預測結果的影響就會越大,我們就說該特徵就越重要,因此LR模型的特徵重要性評估方式就是 w i w_{i} wi的大小((體特徵重要性計算方式見我另一篇部落格LR模型特徵重要性排序)。
  說了這麼多還沒有提到特徵重要性的意義,其實計算特徵重要性的目的就是為了更好的理解模型,給模型提供可解釋性,通過進一步分析去挖掘更多有用的新特徵。給你一個模型,丟給你一堆資料包去訓練,你知道哪個特徵對你的模型來說不可獲取,哪類特徵對你的模型來說可有可無嗎?這個時候就可以去分析特徵重要性了。

2.Xgboost特徵重要性計算方式

而在陳天奇大神的神作-Xgboost訓練框架中,其本質是GBDT模型的一個優化版的實現框架,作為一個Boosting模型,Xgboost模型也有由一個個的基模型組合而成的,本篇部落格中,我們只介紹基模型為決策樹模型時,如何計算Xgboost輸入資料中的每個特徵的重要性程度。
Talk is cheap,Show me the code,直接亮程式碼

#!/usr/bin/env python
# -*-encoding: utf-8-*-

import xgboost as xgb
import pandas as pd
import operator
from matplotlib import pylab as plt
from pylab import *

# 字型設定,如果本地沒有下載字型就將下面三行註釋掉
fm = mpl.font_manager
fm.get_cachedir()
print('特徵排名', '特徵名稱', '特徵權重值')

# 模型檔案,特徵對映檔案
model_dir = 'dir_name/'
model_file = 'model_file_name'
fmap_file = 'idx_file_name'
# 讀取模型檔案
model = xgb.Booster(model_file=model_dir + model_file)
# 選擇特徵重要性程度的描述方式,並計算特徵重要性程度
importance = model.get_score(fmap=model_dir + fmap_file, importance_type='weight')

f = open(model_dir + fmap_file)
fmap_dict = {}
for line in f:
    line = line.strip().split()
    fmap_dict[line[1]] = line[0]
feature_num = 10  # 想要檢視top10的特徵名稱及權重,這裡設定想要檢視前多少個特徵及其權重
importance = sorted(importance.items(), key=operator.itemgetter(1), reverse=True)
plt.figure()
plt.plot(np.array(list(dict(importance).values())), np.array(list(dict(importance).keys())))
plt.show()
importance = importance[:feature_num]
index = 1
for line in importance:
    print(index, fmap_dict[str(line[0])[1:]], line[1])
    index += 1

在上面的第22行程式碼,表示我們讀取xgboost模型,並且計算特徵重要性得分。函式get_score有2個入參,分別是:

  • fmap:xgboost的二進位制模型檔案
  • importance_type:計算特徵重要性的方式

Xgboost有常見的5種特徵重要性評估方式,分別是'weight', 'gain', 'cover', 'total_gain', 'total_cover',下面會分別一一介紹。

  • ‘weight’:權重形式,表示在所有樹中,一個特徵在分裂節點時被使用了多少次。
  • ‘gain’:(平均)增益形式,表示在所有樹中,一個特徵作為分裂節點存在時,帶來的增益的平均值。
  • ‘cover’:(平均)覆蓋度,表示在所有樹中,一個特徵作為分裂節點存在時,覆蓋的樣本數量的平均值。
  • ‘total_gain’:相對於’gain’,這裡表示的是帶來的總增益大小。
  • ‘total_cover’:相對於’cover’,這裡表示的是覆蓋的總樣本數量。

## 3.Xgboost不同的特徵重要性計算方式優劣分析 此處僅為個人愚見,主要是基於自己在實踐中經驗之談。我在實踐中使用`weight`偏多。

weight把某個特徵在所有樹中被使用的次數統計了出來,我們知道在Xgboost模型中,基分類器的決策樹中的特徵是可以被重複使用的,當一個特徵不斷的被選作為分裂節點時,那麼我認為該特徵相比於其他特徵是更加重要的。所以我在實踐中也常常使用wight形式的計算形式來對模型的所有特徵進行重要性排序。

當然了,另外4種–基於增益和覆蓋度的重要性計算方式也自有他們的道理,在實踐中可以視情況選擇。

在重要性計算方式選擇上,有其他什麼更好的參考觀點,歡迎共同學習研討。

相關文章