前言
在特征的选择过程中,如果学习器(基学习器)是树模型的话,可以根据特征的重要性来筛选有效的特征。本文是对Random Forest、GBDT、XGBoost如何用在特征选择上做一个简单的介绍。
各种模型的特征重要性计算
Random Forests
袋外数据错误率评估
RF的数据是boostrap的有放回采样,形成了袋外数据。因此可以采用袋外数据(OOB)错误率进行特征重要性的评估。
袋外数据错误率定义为:袋外数据自变量值发生轻微扰动后的分类正确率与扰动前分类正确率的平均减少量。
(1)对于每棵决策树,利用袋外数据进行预测,将袋外数据的预测误差记录下来,其每棵树的误差为vote1,vote2,…,voteb
(2)随机变换每个预测变量,从而形成新的袋外数据,再利用袋外数据进行验证,其每个变量的误差是votel1,votel2,…votelbGini系数评价指标 (和GBDT的方法相同)
GBDT
在sklearn中,GBDT和RF的特征重要性计算方法是相同的,都是基于单棵树计算每个特征的重要性,探究每个特征在每棵树上做了多少的贡献,再取个平均值。
在利用随机森林对特征重要性进行评估写的比较清楚了,但是还是有一点小的问题,比较ensemble模型 零碎记录中对源代码的解析可以看出,前者计算中丢失了weighted_n_node_samples。
- 利用Gini计算特征的重要性
单棵树上特征的重要性定义为:特征在所有非叶节在分裂时加权不纯度的减少,减少的越多说明特征越重要。
沿用参考博客里的符号,我们将变量重要性评分(variable importance measures)用 VIM V I M 来表示,将Gini指数用 GI G I 来表示
节点m的Gini指数的计算公式为:
GIm=1−∑k=1|K|p2mk G I m = 1 − ∑ k = 1 | K | p m k 2
其中,K表示有K个类别, pmk p m k 表示节点m中类别k所占的比例。直观地说,就是随便从节点m中随机抽取两个样本,其类别标记不一致的概率。
特征 Xj X j 在节点 m m 的重要性可以表示为加权不纯度的减少