首先,目前计算特征重要性计算方法主要有两个方面:
1.计算重要性特征方法
1.1训练过程中计算
训练过程中通过记录特征的分裂总次数、总/平均信息增益来对特征重要性进行量化。例如实际工程中我们会用特征在整个GBDT、XGBoost里面被使用的次数或者带来的总/平均信息增益来给特征重要度打分,最后进行排序。由于本身Ensemble模型在选择特征分裂时带有一定随机性,一般会跑多个模型然后把特征重要性求平均后排序。
1.2训练后使用OOB(Out of Bag)数据计算
第二种方式是训练好模型之后,用Out of Bag(或称Test)数据进行特征重要性的量化计算。具体来说,先用训练好的模型对OOB数据进行打分,计算出AUC或其他业务定义的评估指标;接着对OOB数据中的每个特征:
(1)随机shuffle当前特征的取值;
(2)重新对当前数据进行打分,计算评估指标;
(3)计算指标变化率
按照上面方式,对每个特征都会得到一个变化率,最后按照变化率排序来量化特征重要性。
延伸到 DNN 对特征重要性判定:
DNN不像Boosting这类模型那样存在所谓的分裂次数与信息增益,就需要使用第二种方式,对每个特征进行随机shuffle,观察模型指标的变化,最后按照变化率进行排序。比如AUC下滑率,下滑的越多说明当前这个指标越重要。当然,实际操作中需要结合业务经验先指定一个候选变量池,对这部分变量计算重要度,不然计算开销太大。
2. 树模型特征重要性判定
2.1 Random forest (Bagging)
[if !supportLists]l [endif]OOB:上面已经介绍了
[if !supportLists]l [endif]Gini:就是看每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。
Sklearn里面的Gini指数和信息熵,默认是Gini指数。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长更加”精细”,因此对于高位数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果比较好。
2.2 GBDT(Boosting)
[if !supportLists]l [endif]Gini系数
在sklearn中,GBDT和RF的特征重要性计算方法是相同的,都是基于单棵树计算每个特征的重要性,探究每个特征在每棵树上做了多少的贡献,再取个平均值。
2.3 XGBoost(Boosting)
[if !supportLists]l [endif]Weight: 就是在子树模型分裂时,用到的特征次数,这里计算的是所有的树。
在sklearn中xgb.plot_importance()函数是绘制特征重要性的方法,默认的是weight.
[if !supportLists]Ø [endif]适用场景:weight将给予数值特征更高的值,因为它的变数越多,树分裂时可切割的空间越大。所以这个指标,会掩盖掉重要的枚举特征。
[if !supportLists]l [endif]Gain:是信息增益的泛化概念。这里是指节点分裂时,该特征带来信息增益(目标函数)优化的平均值。
[if !supportLists]Ø [endif]适用场景:gain用到了熵增的概念,它可以方便的找出最直接的特征。
[if !supportLists]l [endif]Cover:树模型在分裂时,特征下的叶子节点涵盖的样本数除以特征用来分裂的次数。分裂越靠近根部,cover值越大。
[if !supportLists]Ø [endif]适用场景:cover对于枚举特征,会更友好。
[if !supportLists]l [endif]其他重要计算方法4 --
permutation
permutation:如果这个特征很重要,那么我们打散所有样本中的该特征,则最后的优化目标将折损。这里的折损程度,就是特征的重要程度。由于其计算依赖单一特征,所以对非线形模型更友好。同时,如果特征中存在多重共线性,共线性的特征重要性都将非常靠后。这是因为混淆单一特征,不影响另一个特征的贡献。这样的结果是,即使特征很重要,也会排的很靠后。它在scikit-learn作为permutation_importance方法实现。
2.4 LightGBM(Boosting)
[if !supportLists]· [endif]split: 使用该特征的次数.
[if !supportLists]· [endif]gain: 该特征的总增益.
3.Bagging和Boosting的区别
(1)投票方面
Bagging:所有学习器平均投票。
Boosting:对学习器进行加权投票。
(2)学习顺序
Bagging的学习是并行的,每个学习器没有依赖关系。
Boosting学习是串行,学习有先后顺序。
(3)主要作用
Bagging主要用于提高泛化性能(解决过拟合,也可以说降低方差)
Boosting主要用于提高训练精度(解决欠拟合,也可以说降低偏差)
(4)样本选择上
Bagging:训练集在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重变化。而权值是根据上一轮的分类结果进行调整。
(5)样例权重
Bagging:使用均匀取样,每个样例的权重相等。
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
4. 随机森林和极端随机树的区别
随机森林的随机极端随机树的随机
样本随机
特征随机
参数随机
模型随机(ID3,C4.5)
特征随机
参数随机
模型随机(ID3,C4.5)
分裂随机
极端随机树是随机森林的一个变种, 原理几乎和RF一模一样,仅有区别有:
(1)对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集。
(2)在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。