当前位置:   article > 正文

xgboost模型特征重要性的不同计算方式_xgboost特征重要性算法

xgboost特征重要性算法

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

在上面的第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种–基于增益和覆盖度的重要性计算方式也自有他们的道理,在实践中可以视情况选择。

在重要性计算方式选择上,有其他什么更好的参考观点,欢迎共同学习研讨。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/591206
推荐阅读
相关标签
  

闽ICP备14008679号