Boruta 和 SHAP :不同特征选择技术之间的比较以及如何选择

2024-04-13 20:18

本文主要是介绍Boruta 和 SHAP :不同特征选择技术之间的比较以及如何选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:DeepHub IMBA本文约1800字,建议阅读5分钟 在这篇文章中,我们演示了正确执行特征选择的实用程序。

当我们执行一项监督任务时,我们面临的问题是在我们的机器学习管道中加入适当的特征选择。只需在网上搜索,我们就可以访问讨论特征选择过程的各种来源和内容。

总而言之,有不同的方法来进行特征选择。文献中最著名的是基于过滤器和基于包装器的技术。在基于过滤器的过程中,无监督算法或统计数据用于查询最重要的预测变量。在基于包装器的方法中,监督学习算法被迭代拟合以排除不太重要的特征。

通常,基于包装器的方法是最有效的,因为它们可以提取特征之间的相关性和依赖性。另一方面,它们更容易过拟合。为了避免这种问题并充分利用基于包装器的技术,我们需要做的就是采用一些简单而强大的技巧。我们可以通过一点数据理解和一个特殊的技巧来实现更好的特征选择。别担心,我们使用的不是黑暗魔法,而是SHAP(SHApley Additive exPlanations)的力量。

为了在特征选择过程中更好地利用 SHAP 的功能,我们发布了 shap-hypetune:一个用于同时调整超参数和特征选择的 Python 包。它允许在为梯度提升模型定制的单个管道中组合特征选择和参数调整。它支持网格搜索或随机搜索,并提供基于包装的特征选择算法,如递归特征消除 (RFE) 或 Boruta。进一步添加包括使用 SHAP 重要性进行特征选择,而不是经典的基于原生树的特征重要性。

在这篇文章中,我们演示了正确执行特征选择的实用程序。如果我们高估了梯度提升的解释能力,或者只是我们没有一般的数据理解,这表明并不像预期的那么简单。我们的范围是检测各种特征选择技术的表现如何以及为什么使用 SHAP 会有所帮助。


什么是Boruta?

每个人都知道(或很容易理解)RFE 递归特征消除是如何工作的。考虑到较小的特征集,它递归地拟合监督算法。其中排除的特征是根据某些权重的大小(例如,线性模型的系数或基于树的模型的特征重要性)被认为不太重要的特征。

Boruta 与 RFE 一样,是一种基于包装器的特征选择技术。可能很少有人听过它的名字,但是它同样强大。Boruta 背后的想法非常简单。给定一个表格数据集,我们在数据的扩展版本上迭代地拟合监督算法(通常是基于树的模型)。在每次迭代中,扩展版本由原始数据与水平连接的混洗列的副本组成。我们只维护在每次迭代中的特征:

  1. 比最好的随机排序特征具有更高的重要性;

  2. 比随机因素(使用二项式分布)好于预期。

RFE 和 Boruta 都使用提供特征重要性排名的监督学习算法。这个模型是这两种技术的核心,因为它判断每个特征的好坏。这里可能会出现问题。决策树的标准特征重要性方法倾向于高估高频或高基数变量的重要性。对于 Boruta 和 RFE,这可能会导致错误的特征选择。

本次实验

我们从 Kaggle 收集了一个数据集。我们选择了一个银行客户数据集,我们尝试预测客户是否很快就会流失。在开始之前,我们将一些由简单噪声构成的随机列添加到数据集中。我们这样做是为了了解我们的模型如何计算特征重要性。我们开始拟合和调整我们的梯度提升(LGBM)。我们用不同的分裂种子重复这个过程不同的时间来覆盖数据选择的随机性。下面提供了平均特征重要性。

令人惊讶的是,随机特征对我们的模型非常重要。另一个错误的假设是将 CustomerId 视为有用的预测器。这是客户的唯一标识符,梯度提升错误地认为它很重要。

鉴于这些前提,让我们在我们的数据上尝试一些特征选择技术。我们从RFE开始。我们将参数的调整与特征选择过程相结合。和以前一样,我们对不同的分裂种子重复整个过程,以减轻数据选择的随机性。对于每个试验,我们考虑标准的基于树的特征重要性和 SHAP 重要性来存储选定的特征。通过这种方式,我们可以绘制在试验结束时选择某个特征的次数。

使用 RFE 选择某个特征的次数(左);使用 RFE + SHAP 选择某个特征的次数(右)

在我们的案例中,具有标准重要性的 RFE 显示是不准确的。它通常选择与 CustomerId 相关的随机预测变量。SHAP + RFE 最好不要选择无用的特征,但同时承认一些错误的选择。

作为最后一步,我们重复相同的过程,但使用 Boruta。

Boruta(左)选择一个特征的次数;使用 Boruta + SHAP 选择某个特征的次数(右)

单独的标准 Boruta 在不考虑随机变量和 CustomerId 方面做得很好。SHAP + BORUTA 似乎也能更好地减少选择过程中的差异。

总结

在这篇文章中,我们介绍了 RFE 和 Boruta(来自 shap-hypetune)作为两种有价值的特征选择包装方法。此外,我们使用 SHAP 替换了特征重要性计算。SHAP 有助于减轻选择高频或高基数变量的影响。综上所述,当我们对数据有完整的理解时,可以单独使用RFE。Boruta 和 SHAP 可以消除对正确验证的选择过程的任何疑虑。

最后源代码在这里:

https://github.com/cerlymarco/MEDIUM_NoteBook/tree/master/ShapBoruta_FeatureSelection

本文作者:Marco Cerliani

编辑:文婧

这篇关于Boruta 和 SHAP :不同特征选择技术之间的比较以及如何选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901116

相关文章

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab