liting李

2021-05-21   阅读量: 517

Python Scikit-learn

XGBT importance_type 参数解释

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分清楚,做了多大的贡献。这个是我比较推荐的计算方法,同时XGBoost的Sklearn API也把"gain"作为了计算feature importance的默认方法。


这里求的是所有用到这个feature的来分裂的节点的信息增益的均值。


(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的分割的总覆盖率。


54.8496 2 0 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子