[关闭]
@yxd 2016-12-27T21:12:05.000000Z 字数 2057 阅读 5509

Tree ensemble算法的特征重要度计算

特征选择 GBDT 特征重要度


集成学习因具有预测精度高的优势而受到广泛关注,尤其是使用决策树作为基学习器的集成学习算法。树的集成算法的著名代码有随机森林和GBDT。随机森林具有很好的抵抗过拟合的特性,并且参数(决策树的个数)对预测性能的影响较小,调参比较容易,一般设置一个比较大的数。GBDT具有很优美的理论基础,一般而言性能更有优势。关于GBDT算法的原理请参考我的前一篇博文《GBDT算法原理深入解析》

基于树的集成算法还有一个很好的特性,就是模型训练结束后可以输出模型所使用的特征的相对重要度,便于我们选择特征,理解哪些因素是对预测有关键影响,这在某些领域(如生物信息学、神经系统科学等)特别重要。本文主要介绍基于树的集成算法如何计算各特征的相对重要度。

使用boosted tree作为学习算法的优势:

特征重要度的计算

Friedman在GBM的论文中提出的方法:

特征的全局重要度通过特征在单颗树中的重要度的平均值来衡量:


其中,M是树的数量。特征在单颗树中的重要度的如下:

其中,为树的叶子节点数量,即为树的非叶子节点数量(构建的树都是具有左右孩子的二叉树),是和节点相关联的特征,是节点分裂之后平方损失的减少值。

实现代码片段

为了更好的理解特征重要度的计算方法,下面给出scikit-learn工具包中的实现,代码移除了一些不相关的部分。

下面的代码来自于GradientBoostingClassifier对象的feature_importances属性的计算方法:

  1. def feature_importances_(self):
  2. total_sum = np.zeros((self.n_features, ), dtype=np.float64)
  3. for tree in self.estimators_:
  4. total_sum += tree.feature_importances_
  5. importances = total_sum / len(self.estimators_)
  6. return importances

其中,self.estimators_是算法构建出的决策树的数组,tree.feature_importances_ 是单棵树的特征重要度向量,其计算方法如下:

  1. cpdef compute_feature_importances(self, normalize=True):
  2. """Computes the importance of each feature (aka variable)."""
  3. while node != end_node:
  4. if node.left_child != _TREE_LEAF:
  5. # ... and node.right_child != _TREE_LEAF:
  6. left = &nodes[node.left_child]
  7. right = &nodes[node.right_child]
  8. importance_data[node.feature] += (
  9. node.weighted_n_node_samples * node.impurity -
  10. left.weighted_n_node_samples * left.impurity -
  11. right.weighted_n_node_samples * right.impurity)
  12. node += 1
  13. importances /= nodes[0].weighted_n_node_samples
  14. return importances

上面的代码经过了简化,保留了核心思想。计算所有的非叶子节点在分裂时加权不纯度的减少,减少得越多说明特征越重要。

不纯度的减少实际上就是该节点此次分裂的收益,因此我们也可以这样理解,节点分裂时收益越大,该节点对应的特征的重要度越高。关于收益的定义请参考我的前一篇博文《GBDT算法原理深入解析》中的等式(9)的定义。

参考资料

[1] Feature Selection for Ranking using Boosted Trees
[2] Gradient Boosted Feature Selection
[3] Feature Selection with Ensembles, Artificial Variables, and Redundancy Elimination

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注