赞
踩
(逻辑回归模型最简单,我就拿它说事了)
我们都知道在常见的逻辑回归模型中,每个特征对应一个模型参数
w
i
w_{i}
wi,该参数越大,那么该特征对模型预测结果的影响就会越大,我们就说该特征就越重要,因此LR模型的特征重要性评估方式就是
w
i
w_{i}
wi的大小((体特征重要性计算方式见我另一篇博客LR模型特征重要性排序)。
说了这么多还没有提到特征重要性的意义,其实计算特征重要性的目的就是为了更好的理解模型,给模型提供可解释性,通过进一步分析去挖掘更多有用的新特征。给你一个模型,丢给你一堆数据包去训练,你知道哪个特征对你的模型来说不可获取,哪类特征对你的模型来说可有可无吗?这个时候就可以去分析特征重要性了。
而在陈天奇大神的神作-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’,这里表示的是覆盖的总样本数量。
weight
把某个特征在所有树中被使用的次数统计了出来,我们知道在Xgboost模型中,基分类器的决策树中的特征是可以被重复使用的,当一个特征不断的被选作为分裂节点时,那么我认为该特征相比于其他特征是更加重要的。所以我在实践中也常常使用wight
形式的计算形式来对模型的所有特征进行重要性排序。
当然了,另外4种–基于增益和覆盖度的重要性计算方式也自有他们的道理,在实践中可以视情况选择。
在重要性计算方式选择上,有其他什么更好的参考观点,欢迎共同学习研讨。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。