DNN深度学习模型 机器学习模型 特征筛选 各个特征重要度排序

2021-01-30 19:23:52 浏览数 (2)

背景

在机器学习或者深度学习模型训练完成后,通常我们需要对输入特征进行重要度排序及筛选,好去找到一些重要度没这么高的特征,将其排除以提高模型收敛速度及准确率。

特征重要程度排序

特征排序方法1 特征分裂

训练过程中计算训练过程中通过记录特征的分裂总次数、总/平均信息增益来对特征重要性进行量化。例如实际工程中我们会用特征在整个GBDT、XgBoost里面被使用的次数或者带来的总/平均信息增益来给特征重要度打分,最后进行排序。由于本身Ensemble模型在选择特征分裂时带有一定随机性,一般会跑多个模型然后把特征重要性求平均后排序。

特征排序方法2 OOB

训练后使用OOB(Out of Bag)数据计算第二种方式是训练好模型之后,用Out of Bag(或称Test)数据进行特征重要性的量化计算。具体来说,先用训练好的模型对OOB数据进行打分,计算出AUC或其他业务定义的评估指标;接着对OOB数据中的每个特征:

(1)随机shuffle当前特征的取值;

(2)重新对当前数据进行打分,计算评估指标;

(3)计算指标变化率按照上面方式,对每个特征都会得到一个变化率,最后按照变化率排序来量化特征重要性。再

每次一个特征shffle并预测,评判方式是输出与之前预测结果差值的标准差

下面是代码参考

代码语言:txt复制
for key in COLUMNS:
    copy = origin.copy()
    copy[key] = copy[key].sample(frac=1, random_state=1).reset_index()[key]
    cp_out = predict(copy)
    out[key] = out['tag'] - cp_out['tag']
    out[key] = out[key]**2
    print('key = ', key ,' affect = ', out[key].sum()**0.5)
    
(pd.DataFrame(out.sum(axis=0))**0.5).sort_values(by=0 , ascending=False)

DNN深度学习模型不像Boosting这类模型那样存在所谓的分裂次数与信息增益,就需要使用第二种方式,对每个特征进行随机shuffle,观察模型指标的变化,最后按照变化率进行排序。比如AUC下滑率,下滑的越多说明当前这个指标越重要。当然,实际操作中需要结合业务经验先指定一个候选变量池,对这部分变量计算重要度,不然计算开销太大。

特征筛选

接下来我们使用特征筛选的几种方法去筛选特征

基于对抗验证(Adversarial Validation)的特征筛选

基本思路:通过找出并去掉在训练和测试集上(或者是两个不同时间窗口内)分布不一致的特征,减小模型对训练数据的过拟合,从而提高模型泛化性和效果

实现方案:将训练和测试集分别打上1,0的标签并进行训练,最终模型特征重要度越高的特征就是训练和测试样本分布区别越大的特征,通过尝试去掉这些特征实现模型效果提升

image.pngimage.png

基于SHAP值一致性的特征筛选

什么是SHAP值:可以理解为用于解释特征对预测结果贡献的一个指标(具体参考https://christophm.github.io/interpretable-ml-book/shapley.html),假如有A,B,C三个特征,那么对于每条样本,A、B、C三个特征都对应一个SHAP值体现其对结果的贡献。

基本思路:有效的特征应该保证对预测结果的贡献具有一致性(对相似的样本,特征贡献都为正或都为负)

实现方案:在样本集A、B上分别训练模型并对B中的样本计算SHAP值a、b,计算a、b中每个特征SHAP值的相关系数,如果呈正相关说明该特征预测结果具有一致性,如果不相关甚至负相关,则代表该特征对预测结果贡献不稳定,需要舍弃。

Ref

  1. https://cloud.tencent.com/developer/article/1061660
  2. https://www.zhihu.com/question/310837513/answer/588954482

0 人点赞