在采用决策树算法建立模型的场景中,例如GBDT、XGBoost、LightGBM、Random Forest等,我们习惯通过Feature Importance指标作为特征筛选的重要方法之一。从特征定量分析的可解释性角度来讲,这种方法实现过程方便,且评估逻辑简单,因此在决策树的实际建模场景中应用较为广泛。
针对Feature Importance的应用,虽然实践效果较好,但仍存在一定的缺点,主要体现在以下两个方面:
(1)Feature Importance的数值量化体现,对于连续型特征或高维度的离散型特征比较偏好,原因是分布平缓或均匀的特征变量,更容易在树节点上呈现出合适的切分点,这样反映出的信息权重可以更客观的描述当前特征对模型的重要性。如果某些离散特征的取值类型分布较少,这样得到的重要性系数可能存在较大偏差。
(2)Feature Importance结果反映的是模型拟合的结果,也就是建模训练样本数据的特征属性,若将变量重要性系数直接作为测试样本数据的特征属性,在某些场景中难以说明模型变量的泛化能力,尤其是在测试数据与训练数据分布存在较大偏差的情况下,显然通过模型训练数据得到的Importance系数,在测试数据上验证是显得不太合理的。
围绕以上Feature Importance的应用场景与特点属性,本文将介绍一种更优的特征筛选方法:Permutation Importance(排列重要性),此方法本质上同样反映的是特征重要性系数,但可以有效解决上文介绍Feature Importance系数存在的缺点。对于Permutation Importance,核心思想是将特征的取值分布随机打乱,同一个特征有了不同的数据排列属性,自变量与因变量的关系也有所区别,这样目的是为了更全面的检验当前特征变量对目标变量的影响程度,通过特征重要性系数Permutation Importance筛选得到的特征,能够较好的保证模型对新测试数据的泛化能力。通过对特征变量的取值分布进行随机打乱,如果在测试数据上可以较明显的增加模型损失,说明此特征对模型很重要;如果在测试数据上对模型的损失影响不大,说明对此特征对模型不重要。这里简要说明Permutation Importance场景下特征分布随机排列的情形,图1所示为特征Var1数据重新随机排列的示意图,在实际场景中算Permutation Importance系数时,往往会对特征变量进行多次排列,从而算出重要性系数的平均值,这样在一定程度避免分布的偶然性,特征系数结果显得更为客观。

                                                         图1 特征数据重新排列

为了更直观的体现特征Permutation Importance系数的应用价值,接下来我们围绕具体的样本数据来实现Permutation Importance的生成过程,并展示其系数分布结果。同时,我们同步实现常规的Feature Importance系数,将两种特征重要性系数的结果进行对比分析。
本文选取的样本数据包含5000条样本与12个字段,具体数据样例如图2所示。其中,字段ID为样本主键;Var01~Var10为特征变量,分布类型均为数值型;Target为目标变量,取值类型为二分类型(0/1)。为了保证特征重要性系数的生成,我们采用XGBoost分类算法来的构建模型,模型训练过程如图3所示。

                                                                图2 样本数据样例


                                                             图3 XGBoost模型构建

当XGBoost模型训练成功后,便可以实现特征重要性的输出,我们首先通过调用feature_importances_属性来生成特征的Feature Importances系数。同时,为了更形象的展示特征重要性系数分布,这里采取可视化方式将其结果进行呈现,具体实现过程如图4所示,输出的重要性系数与可视化图表分别如图5、图6所示。

                                                图4 Feature Importances系数实现

                                                   图5 Feature Importances系数结果

                                                   图6 Feature Importances系数分布

由上图的Feature Importances系数结果与分布对比可知,特征Var05对当前模型的重要性是最高的(0.111396),而贡献度最低的为特征Var09(0.092068)。这种方法是我们日常习惯用来评估特征变量对模型的重要性,从而便于模型解释或特征筛选,此指标的分析意义是比较好的,但前边我们已经介绍,Feature Importances仍然存在一定缺点,也并非本文介绍重点,接下来我们通过以上XGBoost模型来输出Permutation Importance排列重要性系数,从而与Feature Importances进行对比分析。
特征的Permutation Importance系数,由于需要对特征变量的取值随机排序,且重新排列次数可以自定义设置,排列循环次数越多得到的系数分布更能客观反映特征对模型的重要性,一般情况下排列次数可以设置为5~10。特征变量的Permutation Importance系数可以直接通过调用sklearn库的permutation_importance类函数来实现,其中排列次数根据n_repeats来定义,特征Permutation Importance的具体实现过程如图7所示。

                                                 图7 Permutation Importances系数实现

由于生成的特征Permutation Importance结果是一个Dictionary,里边包含了3个数组,分别为importances(n次排列的重要性系数)、importances_mean(平均排列重要性系数)、importances_std(排列重要性系数标准差)。对其输出数据,我们重点希望获取的结果是平均排列重要性系数importances_mean,这里为了说明排列重要性系数的实现过程,我们将importances、importances_mean依次提权并转化为DataFrame来分析,其中importances的排列系数分布结果如图8所示。

                                                     图8 Importances排列系数分布

对于上图展示的特征5次排列后importances系数分布结果,其中per1~per5表示排列次数,可以看出对于个别特征变量,重新排列后对模型的重要性系数有一定波动,例如特征Var01、Var02等,而特征Var03、Var08等相对较为平稳。正因如此,Permutation Importance可以更全面的反映特征对模型的重要性,考虑了未来测试数据分布对特征重要性的影响,从而体现特征变量重要性的泛化能力。由于特征多次排列会输出多个系数值,我们最终是希望通过某个统一值来量化评测,因此采用系数的平均值较为合理,这也是图7过程输出的importances_mean结果,具体系数分布如图9所示,同时通过可视化形式将其结果进行展现,如图10所示。

                                                         图9 Importances系数平均值


                                                图10 Permutation Importance系数分布

通过上图展现的特征Permutation Importance系数结果可知,对模型重要性最高的特征变量是Var06(0.14272),对模型重要性最高的特征变量是Var10(0.06920),这个分析结果与前边特征Feature Importances系数结果(图5)是有一定区别的。同时,根据Feature Importances系数分布(图6)与Permutation Importances的系数分布(图10)的对比可以直观了解到,二者分布形态还是有较明显差异。对于图6展示的Feature Importances系数分布,体现出各特征变量的重要性比较接近,而图10展示的Permutation Importances系数分布可以将特征变量的重要性进行了较好的区分,显然后者更有利于特征变量的筛选,以及对模型特征重要性的客观评估,这也是Permutation Importances系数的优势。
通过以上实践,我们围绕具体样本数据对比分析了特征Feature Importances与Permutation Importances的结果,也客观认识到Permutation Importances系数的独特之处与应用价值。因此,在建立树模型的实际场景中,我们可以尝试优先使用特征的排列重要性系数Permutation Importances来评估变量的贡献能力。当然,特征Feature Importances仍然也可以作为特征筛选方法之一。为了更全面分析特征变量对模型的重要性能影响,我们可以同步采用Feature Importances与Permutation Importances来实现特征重要性系数,这也是从事数据分析的重要思路与方法。
为了便于大家对特征Permutation Importance排列重要性系数的进一步熟悉与理解,本文额外附带了与以上内容同步的python代码与样本数据,供大家参考学习,详情请移至知识星球查看相关内容。

更多详细内容,有兴趣的童鞋可关注:

~原创文章

风控模型中特征重要度的两种筛选方法相关推荐

  1. 利用lightgbm做learning to rank 排序,解析模型中特征重要度

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 去年实习时,因为项目需要,接触了一下Learning to Rank(以下简称L2R),感觉很 ...

  2. Json返回时间中出现乱码问题的两种解决方法

    Json返回时间中出现乱码问题的两种解决方法 参考文章: (1)Json返回时间中出现乱码问题的两种解决方法 (2)https://www.cnblogs.com/hanyinglong/archiv ...

  3. 在.NET中执行Async/Await的两种错误方法

    微信公众号:架构师高级俱乐部 关注可了解更多的编程,架构知识.问题或建议,请公众号留言; 如果你觉得此文对你有帮助,欢迎转发 在.NET中执行异步/等待的两种错误方法 在应用开发中,我们为了提高应用程 ...

  4. c++STL中的find()函数 有两种使用方法

    c++STL中的find()函数 有两种使用方法 方法一: 开头引头文件:中的函数 其调用形式为 find(start,end,value) start搜寻的起点,end搜寻的终点,要寻找的value ...

  5. Java中关于Arrays.sort的两种重载方法的理解

    前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...

  6. 计算机一级无法打开office,电脑中无法运行Office2016的两种解决方法

    最近,有些用户在电脑中安装完office2016后打开该程序时总是提示:无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll .那么,遇到这问题该怎么来解决 ...

  7. python timer使用-python中timer定时器常用的两种实现方法

    方法一,使用线程中现成的: 这种一般比较常用,特别是在线程中的使用方法,下面是一个例子能够很清楚的说明它的具体使用方法: #! /usr/bin/python3 #! -*- conding: utf ...

  8. mybatis中sql语句中大于小于号的两种解决方法

    1.使用<![CDATA[]]>,因为CDATA 部分中的所有内容都会被解析器忽略,所以建议使用<![CDATA[]]> 来解决小于号问题:实例:<![CDATA[ sq ...

  9. 如何浅显得理解风控模型中的特征筛选|附实操细节(全)

    今天我们综合了星球同学的一些需求,给大家梳理了这样一篇风控建模中特征筛选,希望对所有的风控人员在模型开发上都有所启发. 本文,我们会跟大家介绍特征选择的内容,包括其中的重点问题跟注意的细节. 因为完整 ...

最新文章

  1. 2022-2028年中国文化旅游业投资分析及前景预测报告(上中下卷)
  2. Unity内置的三套消息发送机制的应用实例
  3. 前端学习(499):水平居中布局得第一种方式得优点和缺点
  4. 苹果手机扩容对手机好不好?
  5. 在Ubuntu和CentOS上搭建NodeJs的执行环境步骤
  6. 手挽手带你学VUE:四档 Vue-cli3 Vuex Vue-router
  7. 山东理工大学2021年下半年实验室安全考试
  8. CASIA WebFace | face recognition data | 人脸识别数据集 | 云盘分享 |
  9. python rect用法,功能
  10. 寻迹pid算法 c语言,基于STC12C5A60S2单片机及PID控制算法的气味循迹车设计
  11. 虚拟机Ubuntut tftp服务不启动,service tftpd-hpa restart 失败的处理
  12. vuejs搭建的项目对于ie浏览器的处理
  13. SpringBoot整合Swagger2,并设置springsecurity放行和token
  14. Peoplesoft Pentest
  15. html为知笔记模板,为知笔记使用技巧:如何建立模板
  16. 数据库之Mac下Mysql命令全集
  17. 凸优化笔记(一):仿射集,凸集与锥
  18. AliCDN,盛开在云端的花朵
  19. 《学习geometric deep learning笔记系列》第一篇,Non-Euclidean Structure Data之我见
  20. 使用RTOS系统如何选取大容量存储芯片NAND FLASH

热门文章

  1. 淘宝网林昊:行走在技术巅峰
  2. 如何回答join到底释不释放锁?
  3. java 摄像头 win7_Win7系统下JAVA摄像头调用_实例代码介绍
  4. windows线程状态
  5. Spring发展历史
  6. Cocos2d-x制作跳棋第四步:胜负判断、AI具体实现及实现特殊组合动作的小技巧
  7. Java实现大数相乘
  8. C++小游戏视频及资料集(一)
  9. 动态规划C++实现--龙与地下城游戏
  10. 【郑轻】[1391]李白饮酒