最近将主流模型的sklearn的代码撸了一遍,特别是计算特征重要性这块仔仔细细了解了一番;常用算法中xgboost、gbdt、randomforest、tree等都可以输出特征的重要性评分,下面着重记录xgboost和gbdt特征重要性计算过程,randomforest和gbdt差不多,就不赘述了。
1.xgboost
1.简介
xgboost是当下流行的boosting算法,基学习器可以是gbtree也可以是gbliner
当基学习器是gbtree时,可以计算特征重要性;
在基础的xgboost模块中,计算特征重要性调用get_score()
在xgboost的sklearn API中,计算特征重要性调用feature_importance_;
feature_importance_依然派生于get_score(),所以查看xgboost的get_score()源码就可知其所以然;
2.url:https://github.com/zengfanxi/xgboost/blob/master/python-package/xgboost/core.pyget_score有两个参数,fmap是一个包含特征名称映射关系的txt文档; importance_type指importance的计算类型;可取值有5个:weight:权重(某特征在整个树群节点中出现的次数,出现越多,价值就越高)
gain:(某特征在整个树群作为分裂节点的信息增益之和再除以某特征出现的频次)
total_gain(同上,代码中有介绍,这里total_gain就是gain)
cover和total_cover
cover比较复杂,python文档未做解释,其实是指某特征节点样本的二阶导数和再除以某特征出现的 我在xgboost R API文档中找到了部分解释: https://github.com/dmlc/xgboost/blob/f5659e17d5200bd7471a2e735177a81cb8d3012b/R-package/man/xgb.plot.tree.Rd
代码中频繁提到通过get_dump获取树规则,举个例子看看什么是树规则:
trees = bst.get_dump(with_stats=True)
for tree in trees:
print(tree)
# 以下输出了2次迭代的决策树规则,规则内包含量特征名、gain和cover,
# 源码就是提取上述3个变量值进行计算特征重要性
[out]:
0:[inteval<1] yes=1,no=2,missing=1,gain=923.585938,cover=7672
1:[limit<9850] yes=3,no=4,missing=3,gain=90.4335938,cover=6146.5
3:leaf=-1.86464596,cover=5525.25
4:leaf=-1.45520294,cover=621.25
2:[days<3650] yes=5,no=6,missing=5,gain=164.527832,cover=1525.5
5:leaf=-1.36227047,cover=598
6:leaf=-0.688206792,cover=927.5
0:[days<7850] yes=1,no=2,missing