【算法】关于xgboost特征重要性的评估

xgboost很好用,但是很多同学对它特征重要性评估的原理不太明白。今天简单梳理下:

特征重要性函数

调用xgb.feature_importances_函数,即可求出各个特种的重要性,这是我们的目标。
现在就来探究一下,这个feature_importances是怎么得到的。
【算法】关于xgboost特征重要性的评估
那么重要性指标到底是如何评价的呢?进入feature_importances_,可以看到:
①求每个特征对应的score
②把每个特征得到的score/sum(score)
大概思路如此。
【算法】关于xgboost特征重要性的评估
那么,现在就要知道,这个score到底是怎么求得的?

此时,我们需要知道,特征重要性指标评估三种常用的方式:

gain 增益意味着相应的特征对通过对模型中的每个树采取每个特征的贡献而计算出的模型的相对贡献。与其他特征相比,此度量值的较高值意味着它对于生成预测更为重要。

cover 覆盖度量指的是与此功能相关的观测的相对数量。例如,如果您有100个观察值,4个特征和3棵树,并且假设特征1分别用于决定树1,树2和树3中10个,5个和2个观察值的叶节点;那么该度量将计算此功能的覆盖范围为10 + 5 + 2 = 17个观测值。这将针对所有4项功能进行计算,并将以17个百分比表示所有功能的覆盖指标。

freq 频率(频率)是表示特定特征在模型树中发生的相对次数的百分比。在上面的例子中,如果feature1发生在2个分裂中,1个分裂和3个分裂在每个树1,树2和树3中;那么特征1的权重将是2 + 1 + 3 = 6。特征1的频率被计算为其在所有特征的权重上的百分比权重。

增益是解释每个特征的相对重要性的最相关属性。
【算法】关于xgboost特征重要性的评估
至于gain的算法,可以回顾下cart或者xgboost相关内容:
【算法】关于xgboost特征重要性的评估
继续点击进入get_score函数。可以看到,源码中,就是用gain来做重要性判断的。
【算法】关于xgboost特征重要性的评估
这么说显得稍微抽象一点,我们画树图,或者直接把trees打印出来:

【算法】关于xgboost特征重要性的评估
【算法】关于xgboost特征重要性的评估

可以看到,每颗tree都有对应的fid、gain、cover、leaf,只需要把对应的gain提取出来即可。
回到get_score函数,可以看到,大致思路如我所想:
①for tree in trees
②for line in tree.split
③get gain

这里需要注意的是:特征gain的叠加性,判断一个特征的gain,需要把其在每棵树对应的gain分别得到,然后求平均,这样比较靠谱。
【算法】关于xgboost特征重要性的评估
一顿操作之后,可以看到,每个特征对应的average gain就得到了:
【算法】关于xgboost特征重要性的评估

再根据之前所说的求重要性占比,即可得到一个特征就增益系数gain而言,对整个模型的重要性程度
【算法】关于xgboost特征重要性的评估