Xgboost.plot_importance 参数解释
一、函数原型
plot_importance(booster, ax=None, height=0.2,xlim=None, ylim=None,
title='Feature importance',xlabel='F score',
ylabel='Features',importance_type='weight',
max_num_features=None,grid=True, show_values=True,**kwargs)
二、参数解读
- booster:model
- ax:设置画布大小
- height:柱形的宽度
- xlim:x轴值的范围。xlim =(0,20)
- ylim:y轴值的范围。ylim =(0,20)
- title:图像标题
- xlabel:x轴标签,默认为"F score"
- ylabel:y轴标签,默认为"Features"
- importance_type:特征重要性的计算方式
- max_num_features:图上显示的最大重要特征数,默认为全部显示
- grid:设置图像网格,默认为True
- show_values:显示特征重要性的计算值,默认为True
- kwargs:发送一个键值对的可变数量的参数列表给函数
三、importance_type
选择输出哪一种重要程度
该参数类型为 str, 默认值为 ‘weight’ 。可选择的参数值有5种:
1. weight
在所有的树中,一个feature总共多少次被用于分割数据。
这个指标是指一个变量被用于分割的绝对次数,这就造成了这个指标的缺点。对于定类变量和定序变量,由于他们天生能用于分割的点就比较少,很容易被"weight"指标所忽略。
一个简单的例子就是,假如我们的模型要预测一个人脱发是否严重,那我们可以引入一些定距变量如体温,定比变量如身高、体重;我们当然也可以引入定类变量和定序变量,例如一个人“是否面临每周996加班的问题”。
显然,根据常识我们知道“是否996加班”对于脱发是有很大影响的。但是由于它是一个二分类的变量,只能取0或者1,也就是天生只能有一个分类的点,这样就导致被模型使用的次数会降低。
而身高、体重这种连续性的变量,模型可以找到很多的分割点,就可以不断地被模型使用。例如,体重可以划分为(50, 60]、(60,70]、(70,80]、(80,90]、(90,100]…由于这类变量先天就可以提供很多的分割点,模型就可以反复地去使用这些变量分割数据。虽然分割的次数很多,但是可能每次分割完以后都分得不很清楚,对结果的贡献也不大,最糟糕的情况是光增加过拟合了,对模型最终表现完全没有帮助。在这里,身高体重虽然用的次数多,但是如果我们最后比较一下谁更能把“是否脱发”分的清楚,可能“身高体重”会比“是否996加班”这个变量差得远得多。
2. gain (推荐)
该feature的所有分割的平均信息增益(average gain)。
也就是节点分裂时,该特征带来信息增益(目标函数)优化的平均值,通过取每个feature对模型中每棵树的贡献来计算对应特征对模型的相对贡献。
与其他feature相比,这个指标的值越高,意味着它对生成预测更重要。
这个衡量指标能够克服"weight"存在的问题。
信息增益可以真正地反映一个指标对于把预测的Y的label分清楚,做了多大的贡献。
3. cover
所有使用到该feature的分割的平均覆盖率
这个指标的含义是节点样本目标函数二阶导数的和。
具体解释在XGBoost的官方GitHub仓库的R语言接口下面的有解释,详见相关仓库内容的第35行:
code{cover}: the sum of second order gradient of training data classified to the leaf, if it is square loss, this simply corresponds to the number of instances in that branch. Deeper in the tree a node is, lower this metric will be.
有时gain 计算出来的特征重要性头尾部值差距较大,这是因为信息增益计算时,后续的优化可能都不是一个量级。类似于神经网络在优化损失函数时,后续的量纲可能是十倍、百倍的差异。
所以,综上而言,如果有下游业务方,可以用 cover 的特征重要性计算方法。
当然,如果是单纯的模型调优,gain 能指出最重要的特征。这些特征,某些场景下还能总结成硬规则。
4. total_gain
所有使用到该feature的分割的总增益
5. total_cover
所有使用到该feature的分割的总覆盖率
6. xgboost文档说明引用
”weight” is the number of times a feature appears in a tree
”gain” is the average gain of splits which use the feature
”cover” is the average coverage of splits which use the feature where coverage is defined as the number of samples affected by the split
四、feature_importances_
XGBoost 的 Sklearn API 把"gain"作为了其计算特征重要性的默认方法。
五、参考文档
- xgboost python API文档地址 Xgboost Python API Reference
- xgboost 参数完整文档github地址 Github: XGBoost Parameters
- 参数取值解释 原文地址 XGBT importance_type 参数解释
版权归原作者 Hissen_ 所有, 如有侵权,请联系我们删除。