机器学习小窍门:Python 帮你进行特征选择

2023-11-10

[转] https://www.leiphone.com/news/201807/3gGDmue2OXYZE0vQ.html

 

特征选择,也就是从数据集中找出并选择最有用特征的过程,是机器学习工作流中一个非常重要的步骤。不必要的特征降低了训练速度,降低了模型的可解释性,最重要的是降低了测试数据集的泛化能力。

在做机器学习问题的过程中,我们总是在重复应用一些特征选择方法,这很令人沮丧。因此我用 Python 建了一个特征选择类,代码已上传至 GitHub。这个 FeatureSelector 包含一些通用的特征选择方法:

  1. 缺失值比例高的特征 

  2. 共线 (高相关)特征 

  3. 决策树中的零贡献度特征 

  4. 低贡献度特征 

  5. 单值特征 

本文将通过一个机器学习数据集例子来展示如何使用 FeatureSelector。可以看到该工具如何快速实现这些方法,让机器学习工作流更高效。 

完整的代码可在 GitHub 上找到,欢迎各位任何形式的贡献。特征选择器在不断改进,它将根据社区的需要不断修正和完善!

 

样例数据集

本文将使用 Kaggle 的 Home Credit Default Risk 机器学习竞赛里的样本数据。(想参加比赛的可以看这篇文章)。 完整的数据集可以在此处下载, 本文将使用样本做演示用。

机器学习小窍门:Python 帮你进行特征选择

样本数据。TARGET 为分类标签

竞赛是一个监督分类问题。这是一个非常合适的数据集,因为它有很多缺失值、大量高度相关(共线)的特征以及许多无助于机器学习建模的不相关特征。

机器学习小窍门:Python 帮你进行特征选择

 

建立实例

为了建立一个 FeatureSelector 类的实例,我们需要输入一个结构化的数据集,其中行记录观测结果,列记录特征。有些方法中我们可以只使用特征来学习,但另外一些重要的方法也需要标签。由于这是一个监督分类的任务,我们会同时用到特征和标签。

(在 feature_selector.py 所在目录中执行以下代码)

机器学习小窍门:Python 帮你进行特征选择

 

方法说明

特征选择供有 5 个方法来找到需要剔除的特征。我们可以访问任意标识出的特征然后手工从数据集中剔除它们,或用特征选择器里的 remove 方法。 

本文将依次浏览这些定位特征的方法,并展示如何一次性执行这些方法。此外 FeatureSelector 还有一些绘图功能,因为在机器学习中可视化数据是非常关键的。

 

缺失值

第一个找到需要被剔除的特征的方法非常直接:缺失值比率超过指定阈值。以下代码可以定位出所有缺失值比例超过 60% 的特征(粗体为输出内容)。

机器学习小窍门:Python 帮你进行特征选择

我们可以从 dataframe 看到这些特征的缺失值比例:

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

可以访问 FeatureSelector 里的 ops 属性来看到这些被标记移除的特征。它存储为一个 Python dict,其中每一项以 list 形式存储特征名称。

机器学习小窍门:Python 帮你进行特征选择

最后,用以下命令绘制一下所有特征缺失值比例的分布情况:

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

 

共线特征

共线特征也就是那些互相之间高度相关的特征。由于其较高的方差和较低的可解释性,它们将导致测试集数据泛化能力变差。 

identify_collinear 方法基于指定的相关系数值,找到那些共线特征。对于每对相关的特征,程序识别出其中一个特征,并剔除它(因为只需要剔除其中一个):

机器学习小窍门:Python 帮你进行特征选择

可以用热力图简洁地可视化特征的相关性。图中显示了所有至少与一个特征的相关系数大于阈值的特征: fs.plot_collinear() 与之前方式类似,

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

在此之前,我们可通过 ops 字典访问整个高相关度的(将被剔除的)特征列表, 也可用 dataframe 方式查看那些高度相关的特征对。

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

 如果想直接了解整个数据集,我们也可以绘制数据集中所有特征的相关系数热力图。只要在方法中传入 plot_all = True:

机器学习小窍门:Python 帮你进行特征选择

 

零重要度特征 

前面两种方法可以用于任何结构的数据集。并且在给定阈值下,任何时候得到的结果都是一样的。接下来一种方法适用于有监督的机器学习。我们必须有用于训练的标签,结果也是不一定的。identify_zero_importance 函数根据 GBM 学习模型找到零重要度特征。

通过基于树的机器学习模型,比如 Boosting 集成方法,我们可以找到特征重要度。重要度的绝对值没有相对值重要。通过相对值,我们可以决定与任务相关性最强的特征。我们也可以使用特征重要度,去除零重要度特征完成特征选择。在基于树的模型中我们并不使用零重要度特征来分割各点,所以我们可以将它们去除而不影响模型性能。 

FeatureSelector 使用 GBM 从 LightGBM library 中找到特征重要度。运行 10 次以上 GBM 求平均得到特征重要性,从而减少方差。同时,模型使用验证集的 early stopping(有关闭选项),避免训练数据的过拟合。 

下面的代码调用这种方法,输出零重要度特征:

机器学习小窍门:Python 帮你进行特征选择

输入参数:

  • task: 任务是「分类」或是「回归」 

  • eval_metric:用于 early stopping 的矩阵 (如果禁用 early stopping,这项不是必须) 

  • n_iterations:用于求特征重要性平均值的训练运行次数 

  • early_stopping:是否将 early stopping 用于模型训练 

这时使用 plot_feature_importances 得到两张曲线图:

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

左边的 plot_n 是最重要特征(画出了重要性的归一化项,它们的和为 1)。右边的是累计的重要性相对于特征的个数,纵轴是累计重要度的 threshold。这个例子中是 99%。

对于基于重要度的方法,以下两点需要记住: 

  • GBM 的训练具有随机性,也就是说每次运行模型得到的特征重要度都是不同的 

这不应成为主要的问题(最重要的特征不会突然变成最不重要的),但它会改变一些特征的排序。它也可能影响到识别出的零重要度特征数。你并不需要对特征重要度每次变化的问题感到吃惊。

  • 为了训练机器学习模型,首先将特征进行独热编码。这就意味着在建模时加入的独热编码的特征可能是一些被识别为零重要度的特征

在特征去除阶段有去除任何独热编码特征的选项,然而如果在特征选择之后进行机器学习,我们必须对特征进行独热编码。

 

低重要度特征 

接下来的方法建立在零重要度函数上,它使用模型的特征重要度来进行之后的选择。identify_low_importance 函数找到最低重要度的特征,这些特征对特定的总重要度没有任何贡献。 

例如,下面的调用函数找到最低重要度的特征。它并不需要达到 99% 的总重要度: 

机器学习小窍门:Python 帮你进行特征选择

基于总重要度及这些信息的曲线,GBM 将很多特征判断为与学习无关。这种方法每次训练得到的结果并不相同。 

在 dataframe 中查看特征重要度: 

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

low_importance 方法来源于一种使用主成分分析(PCA)的方法。它通常只保留所需的主成分以将方差百分比保持在特定值上(比如 95%)。总重要度的百分比的计算也是基于这个想法。 

这种基于特征重要度的方法只在使用基于树的模型做预测时有用。除了具有随机性之外,这种基于重要度的方法是一个黑盒子。我们并不知道模型为什么将某种特征判断为无关。如果使用这些方法,将它们运行几次并观察结果如何变化。创建多个不同参数的数据集进行测试。

 

唯一值特征

最后一个是很基础的一种方法:找到任何有单一值的列。一个只有唯一值的特征无法用于机器学习,因为这个特征的方差为 0。比如,一个基于树的模型无法在只有一个值的特征上进行划分 (因为不能将观察对象分组)。

与其他方法不同,这里没有参数可以选择: 

机器学习小窍门:Python 帮你进行特征选择

我们可以画出每个分类唯一值的柱状图:

机器学习小窍门:Python 帮你进行特征选择

机器学习小窍门:Python 帮你进行特征选择

 需要记住的一点是默认在 Pandas 中计算唯一值之前先去掉非数元素(NaNs)。

 

去除特征 

一旦我们识别出需要去掉的特征,我们有两个选项来去掉它们。所有需要去掉的特征都存储在 FeatureSelector 的字典 ops 当中。我们可以使用这个清单来手动去掉这些特征,另一个选项是使用 remove 的内建函数。 

使用这种方法,我们使用 methods 来去掉特征。如果我们希望使用所有方法,我们只需要在函数中放入 methods = 'all'。

机器学习小窍门:Python 帮你进行特征选择

通过这种方法返回一个已经去除了特征的 datafram,同时也去除了在机器学习过程中创建的独热编码特征:

机器学习小窍门:Python 帮你进行特征选择

在进一步操作之前,先检查将要被去除的特征是一个好主意!原始的数据集被作为备份存储在 FeatureSelector 的 data 特性中。

 

一次运行所有方法

比起单独运行这些方法,我们可以使用 identify_all 来运行所有的方法。它为每种方法建立了一个参数字典:

机器学习小窍门:Python 帮你进行特征选择

由于我们重新运行了模型,你需要注意到总特征的个数将会变化,然后就可以调用 remove 函数来去除特征。

 

结论 

在训练机器学习模型之前,Feature Selector 类会执行一些常用操作来去除特征。它提供识别特征并去除的函数,并将之可视化。为了提高工作效率,可以单独或一次运行所有方法。 

missing,collinear和 single_unique 方法结果是确定的。而基于特征重要度的方法每次运行的结果都会变化。特征选择和机器学习很像,它们都需要大量经验,需要测试多种组合来找到最优答案。最好是在过程中尝试多种配置,特征选择器提供一种方法快速评估特征选择的参数。 

和往常一样,欢迎各位提出反馈和建设性的意见。我想强调,我正在 FeatureSelector 寻求帮助。任何人都可以在 GitHub 上做出贡献。对所有使用这个工具并提出的建议的人表示感谢!也可以通过推特 @koehrsen_will 和我联系。 

 

原文链接:https://towardsdatascience.com/a-feature-selection-tool-for-machine-learning-in-python-b64dd23710f0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习小窍门:Python 帮你进行特征选择 的相关文章

  • 完全卸载docker

    停止docker服务 systemctl stop docker 列出所有docker相关组件 yum list installed grep docker 删除上一条命令列出来的所有组件 yum y remove xxxx 谨慎操作 删除
  • 因果推断(五)——反事实,后悔药?

    反事实推断一个词概括就是 后悔 例子 还是以小夏开店为例 小夏请了A明星代言后 销售量虽然有提升 但是由于该明星的代言费很贵 导致最终还是亏本了 于是 小夏想要是当时没有请明星代言 会不会就不亏本了 推断没有发生过的事情 就是反事实推断 当
  • shell编程基础(四)-shell特殊符号

    目录 符号总览 1 输出 输入重导向 1 井号 comments 1 帐户的 home 目录 1 分号 Command separator 1 连续分号 Terminator 1 点 dot 2 string 单引号 single quot
  • k8s leaderelection

    const LEASELOCKNAME tes LEASELOCKNAMESPACE kube system func main LeaseLockID uuid New String client InitClientSet run fu
  • 少儿机器人编程与软件编程区别

    现在社会 机器人编程是一门博大精深 有着多学科融合性的课程 针对少儿方面 林林总总的相关编程培训也是层出不穷 格物斯坦来分析下这两者的区别所在 纯软件是个虚拟的世界 简单而完美 就像我们上学时所说的理想条件下 而真实世界太复杂了 并且总有意
  • 十分钟了解MES系统的发展历程和标准体系

    在20世纪70年代后期到21世纪这阶段 企业之间的主要竞争因素发生了较大的变化 客户对产品的需求逐渐多样化 制造企业的生产模式也开始由大批量的刚性生产变为了多品种 小批量的柔性生产模式 生产线也从以前的手工方式转为了以自动化的机器人生产线为
  • 使用R语言中的data

    使用R语言中的data table包进行数据操作和转换是非常高效和方便的 其中 melt函数是一个非常实用的函数 可以将数据表从宽格式转换为长格式 在本文中 我将详细介绍如何使用melt函数 以及通过源代码示例展示其用法和效果 1 什么是宽
  • Java什么情况下数据类型可以自动转换?什么情况下需要强制转换?

    在程序中 当把一种数据类型的值赋给另一种数据类型的变量时 需要进行数据类型转换 自动类型转换也叫隐式类型转换 指的是两种数据类型在转换的过程中不需要显式地进行声明 当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量时 系统就
  • minikube:部署一个nginx应用

    通过run命令运行pod 创建pod minikube kubectl run nginx image nginx port 80 查看pod的ip minikube kubectl get pods o wide 遇到查看不到IP的问题可
  • 关于自定义视图容器(Container View Controller)

    苹果对UIViewController以及其使用有着非常详细的文档 UIViewController Reference ViewController Programming Guide 一 UIViewController 作为iOS开发

随机推荐

  • 惠普笔记本重装win10系统教程

    惠普PAVILION 15 AU034TX X0S89PA 重装系统教程 文章目录 惠普PAVILION 15 AU034TX X0S89PA 重装系统教程 1 Bios设置启动盘 2 开始重装系统操作 3 电脑基本设置 4 激活win10
  • python源程序执行的方式是边编译边执行吗_Python代码是编译执行还是解释执行?...

    有人在讨论 Python 代码是编译执行还是解释执行 这个问题还可以换一种说法 Python 是编译型语言还是解释型语言 回答这个问题前 我们先弄清楚什么是编译型语言 什么是解释型语言 所谓编译执行就是源代码经过编译器编译处理 生成目标机器
  • MySQL存储过程专题

    文章目录 MySQL存储过程 0 环境说明 1 使用说明 2 准备 3 语法 3 0 语法结构 3 1 变量及赋值 1 局部变量 2 用户变量 3 会话变量 4 全局变量 3 2 入参出参 3 3 流程控制 判断 if case 3 4 流
  • Python反编译exe

    TOC Python反编译exe 下载工具 1 python国内下载 https mirrors huaweicloud com python 建议使用 3 10一下的版本 2 下载 下载pyinstxtractor 网址 https gi
  • Python-pandas-画柱状图/饼图

    一 柱状图 import pandas as pd pandas的制图功能是构建在matplotlib之上的 import matplotlib pyplot as plt 1 使用pandas画图 datas pd read excel
  • git rm -r cached <dir>按层次遍历目录导致删除目录下文件时“未匹配任何文件“错误

    haypin MBP cpp cmake js java python main git add haypin MBP cpp cmake js java python main find ipath js o ipath build o
  • Qt窗口大小设置

    用Qt创建一个窗口 如何调整窗口的大小呢 1 setBaseSize 调用这个方法 1 setBaseSize 800 600 运行程序 发现一点效果都没有 注意我这里并没有使用setFixedSize setMaximumSize 因为虽
  • LightGBM原理简介

    1 LightGBM简介 Light Gradient Boosting Machine 是一个实现GBDT算法的框架 支持高效率的并行训练 并且具有以下优点 1 更快的训练速度 2 更低的内存消耗 3 更好的准确率 4 分布式支持 可以快
  • 智能指针详细解析(智能指针的使用,原理解析)

    本文转自努力的少年博主 https blog csdn net sjp11 article details 123899141 目录 一 智能指针的基本概念 二 智能指针的定义和使用 三 auto ptr 四 unique ptr 五 sh
  • 在群晖上安装Nextcloud-AIO详解

    本文是应网友 刘源 的要求折腾的 什么是 Nextcloud AIO Nextcloud AIO 就是 Nextcloud All in One 顾名思义就是一个 Nextcloud 的 All in One 版本 这是一个基于 Docke
  • 图解浏览器缓存,教你提高用户体验

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由前端林子发表于云 社区专栏 浏览器缓存 是浏览器端保存数据 用于快速读取或避免重复资源请求的优化机制 有效的缓存使用可以避免重复的网络请求和加快页面速度 从而提高用户体验 一
  • 2021上海交大网络安全保研夏令营经验

    个人情况 某985高校信息安全专业 排名前6 六级539 校级一等奖学金多次 竞赛 数模美赛m奖 数模国赛省二等 科研 无成果发表 只有一些实验室 校级项目经历 一 选拔流程 各学科组织专家组对申请者进行全面考查 形式为线下复试包括笔试和面
  • ORACLE-电信行业解决方案研讨会笔记

    ORACLE近况 08财年收入224亿美元10W员工中国2100 员工 中间件 理念COMPLETE OPEN INTEGRATED产品策略 开发工具 JDeveloper为oracle 的将来开发工具 BEA workshop向Jdeve
  • Requests爬虫方法

    目录 一 Requests 简介 1 1 requests是什么 1 2 安装 1 3 response的属性及类型 二 requests使用 2 1 requests 的 get 请求 2 2 requests 的 post 请求 2 3
  • LRU 最近最少使用算法

    LRU 最近最少使用算法 设计LRU Cash 数据结构 设计方法 代码实现 总结 百度百科 LRU是Least Recently Used的缩写 即最近最少使用 是一种常用的页面置换算法 选择最近最久未使用的页面予以淘汰 该算法赋予每个页
  • 项目打War 并部署到Tomcat上去(注重步骤)

    一 打包 点开我们idea 中对应的maven 在对应模块中找到有 root 的那个模块 进行package 打包 打包完成后 去对应的路径下找到刚打的新鲜war包 进入bin 目录后 双击startup bat 运行即可
  • java几种删除_几种删除Linux目录的方法

    在Linux中有很多方法可以删除目录 在图形化界面可以利用文件管理器 或者通过终端删除 本文将介绍在文本界面使用命令删除目录 使用rmdir删除目录 Rmdir命令间成 remove directory 用于删除空目录的命令 例如 删除一个
  • Spring Boot 整合 JSON - Jackson/Gson/FastJson

    学习 Spring Boot 整合 JSON Jackson Gson FastJson 1 Spring MVC 整合 JSON 先来回顾下在 Spring MVC 中如何整合 JSON Spring MVC 可以接收 JSON 参数 也
  • BeanUtils.copyProperties基本用法与小坑

    1 实际应用 BeanUtils copyProperties 赋值目标对象 模板源对象 我们都知道当有两个对象AB 属性名称一样的情况下 如果需要把A的全部属性给B 传统写法是 B setXX A getXX 如果只有几个特别的参数需要赋
  • 机器学习小窍门:Python 帮你进行特征选择

    转 https www leiphone com news 201807 3gGDmue2OXYZE0vQ html 特征选择 也就是从数据集中找出并选择最有用特征的过程 是机器学习工作流中一个非常重要的步骤 不必要的特征降低了训练速度 降