当前位置: 首页 > news >正文

特征筛选还在用XGB的Feature Importance?试试Permutation Importance

特征筛选是建模过程中的重要一环。

基于决策树的算法,如 Random Forest,Lightgbm, Xgboost,都能返回模型默认的 Feature Importance,但诸多研究都表明该重要性是存在偏差的。

是否有更好的方法来筛选特征呢?Kaggle 上很多大师级的选手通常采用的一个方法是 Permutation Importance。这个想法最早是由 Breiman(2001)提出,后来由 Fisher,Rudin,and Dominici(2018)改进。

本文你将通过一个 Kaggle Amex 真实数据了解到,模型默认的 Feature Importance 存在什么问题,什么是 Permutation Importance,它的优劣势分别是什么,以及具体代码如何实现和使用。

本文目录

    • 模型默认的Feature Importance存在什么问题?
    • 什么是Permutation Importance?
    • Permutation Importance的优劣势是什么?
      • 3.1 优势
      • 3.2 劣势
    • Amex数据实例验证

本文由技术群一位大佬的推荐与分享,想加入交流或者完整代码,按照如下方式

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群+CSDN

模型默认的Feature Importance存在什么问题?

Strobl et al [3] 在 2007 年就提出模型默认的 Feature Importance 会偏好连续型变量或高基数(high cardinality)的类型型变量。这也很好理解,因为连续型变量或高基数的类型变量在树节点上更容易找到一个切分点,换言之更容易过拟合。

另外一个问题是,Feature Importance 的本质是训练好的模型对变量的依赖程度,它不代表变量在 unseen data(比如测试集)上的泛化能力。特别当训练集和测试集的分布发生偏移时,模型默认的 Feature Importance 的偏差会更严重。

举一个极端的例子,如果我们随机生成一些 X 和二分类标签 y,并用 XGB 不断迭代。随着迭代次数的增加,训练集的 AUC 将接近 1,但是验证集上的 AUC 仍然会在 0.5 附近徘徊。这时模型默认的 Feature Importance 仍然会有一些变量的重要性特别高。这些变量帮助模型过拟合,从而在训练集上实现了接近 1 的 AUC。但实际上这些变量还是无意义的。

什么是Permutation Importance?

Permutation Importance 是一种变量筛选的方法。它有效地解决了上述提到的两个问题。

Permutation Importance 将变量随机打乱来破坏变量和 y 原有的关系。如果打乱一个变量显著增加了模型在验证集上的loss,说明该变量很重要。如果打乱一个变量对模型在验证集上的 loss 没有影响,甚至还降低了 loss,那么说明该变量对模型不重要,甚至是有害的。

图片

▲ 打乱变量示例

变量重要性的具体计算步骤如下:

  • 1. 将数据分为 train 和 validation 两个数据集

  • 2. 在 train 上训练模型,在 validation 上做预测,并评价模型(如计算 AUC)

  • 3. 循环计算每个变量的重要性:

  • (3.1) 在 validation 上对单个变量随机打乱;

  • (3.2)使用第 2 步训练好的模型,重新在 validation 做预测,并评价模型;

  • (3.3)计算第 2 步和第 3.2 步 validation 上模型评价的差异,得到该变量的重要性指标

Python 代码步骤(model 表示已经训练好的模型):

def permutation_importances(model, X, y, metric):
    baseline = metric(model, X, y)
    imp = []
    for col in X.columns:
        save = X[col].copy()
        X[col] = np.random.permutation(X[col])
        m = metric(model, X, y)
        X[col] = save
        imp.append(baseline - m)
    return np.array(imp)

Permutation Importance的优劣势是什么?

3.1 优势

  • 可以在任何模型上使用。不只是在基于决策树的模型,在线性回归,神经网络,任何模型上都可以使用。

  • 不存在对连续型变量或高基数类别型变量的偏好。

  • 体现了变量的泛化能力,当数据发生偏移时会特别有价值。

  • 相较于循环的增加或剔除变量,不需要对模型重新训练,极大地降低了成本。但是循环地对模型做预测仍然会花费不少时间。

3.2 劣势

  • 对变量的打乱存在随机性。这就要求随机打乱需要重复多次,以保证统计的显著性。

  • 对相关性高的变量会低估重要性,模型默认的 Feature Importance 同样存在该问题。

Amex数据实例验证

在这里插入图片描述

▲ Kaggle Amex逾期预测比赛

理论听起来可能有点头痛,我们直接以 Kaggle 的 Amex 数据作为实例,验证下 Permutation Importance 的效果。

考虑到 Permutation Importance 的随机性,我们将数据划分为 10 个 fold,并且每个变量随机打乱 10 次,所以每个变量总共打乱 100 次,再计算打乱后模型评价差异的平均值,以保证统计上的显著性。之后我们可以再谈谈如何更好地随机打乱以节省资源。

这里我们分别对比3种变量重要性的排序:

  1. 模型默认的 Feature Importance

  2. Permutation Importance

  3. 标准化后的 Permutation Importance:Permutation Importance / 随机 100 次的标准差。这考虑到了随机性。如果在 Permutation Importance 差不多的情况下,标准差更小,说明该变量的重要性结果是更稳定的。

为了简化实验,这里随机筛选了总共 300 个变量。使用 300 个变量时,模型 10 fold AUC 为 0.9597。

下表是不同变化重要性排序下,模型 AUC 随着变量个数增加的变化情况:

图片

▲ 不同变量重要性排序下,模型效果的变化情况

由此我们可以得到如下结论:

  1. Permutation Importance 相较于模型默认的 Feature Importance 具有更好的排序性。当变量个数小于 250 个时,使用 Permutation Importance 排序的变量模型效果都更好。

  2. 随着变量个数的增加,模型默认的 Feature Importance 和 Permutation Importance 两种排序的模型 AUC 差异逐渐减小。这也间接说明 Permutation Importance 的重要性排序更好。因为在变量个数少的时候,两种排序筛选的变量差异会更大。随着变量的增加,两种排序下变量的重合逐渐增加,差异逐渐减小。

  3. 标准化后的 Permutation Importance 效果仅略微好于 Permutation Importance,这在真实业务场景意义较低,在建模比赛中有一定价值。

相关文章:

  • 06-ServletRequest
  • Spring Cloud Alibaba系列之nacos:(4)配置管理
  • 一篇五分生信临床模型预测文章代码复现——Figure 3. 基因富集分析(二)
  • 深度学习——day34 读论文:深度 ReLU 网络在特征提取和泛化中的深度选择(2022 Q1)
  • STM32G474产生一个锯齿波
  • 蓝队视角下的防御体系怎样进行突破
  • 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数
  • [平台运维、Hadoop]kafka streams概述
  • 【祝福伟大的祖国】Java Web 9.2 Request 对象 9.2.5 请求参数中文乱码问题
  • 《When you are old》一如苇中的风,轻柔却难忘
  • JavaFX实战:模拟电子琴弹奏效果,鼠标弹奏一曲piano送给大家
  • 基于VC++和AT89C52单片机的数字存储示波器设计
  • labview与stm32通信
  • OpenHarmony适配移植:X86、ARM、RISC-V、MIPS、LoongArch芯片架构简析
  • DBeaver manual
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ES6系列(二)变量的解构赋值
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • QQ浏览器x5内核的兼容性问题
  • React Transition Group -- Transition 组件
  • 百度地图API标注+时间轴组件
  • 回顾 Swift 多平台移植进度 #2
  • 回流、重绘及其优化
  • 软件开发学习的5大技巧,你知道吗?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 异步
  • 7行Python代码的人脸识别
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (02)Hive SQL编译成MapReduce任务的过程
  • (function(){})()的分步解析
  • (编译到47%失败)to be deleted
  • (二十四)Flask之flask-session组件
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (转载)从 Java 代码到 Java 堆
  • .cn根服务器被攻击之后
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .ui文件相关
  • /etc/fstab和/etc/mtab的区别
  • @Autowired标签与 @Resource标签 的区别
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [android] 手机卫士黑名单功能(ListView优化)
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [JavaEE系列] Thread类的基本用法
  • [javascript]Tab menu实现
  • [Java并发编程实战] 共享对象之可见性
  • [LeetCode周赛复盘] 第 312 场周赛20220925
  • [Mac软件]Goldie App v2.2 Mac黄金比例设计工具
  • [NET].NET Framework 3.5 SP1 真正的离线安装(转)
  • [Operating System] {ud923} P4L4: Datacenter Technologies
  • [Python]list.append字典的时候,修改字典会导致list内容变化的问题