雷锋网 AI 研习社按:本文为雷锋字幕组编译的技术博客,原标题 A Feature Selection Tool for Machine Learning in Python,作者为 William Koehrsen。

翻译 | 胡瑛皓、程炜 校对 |龙柯宇 整理 | MY

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

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

共线 (高相关)特征

决策树中的零贡献度特征

低贡献度特征

单值特征

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

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

样例数据集

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

样本数据。TARGET 为分类标签

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

建立实例

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

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

方法说明

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

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

缺失值

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

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

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

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

共线特征

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

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

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

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

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

零重要度特征

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

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

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

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

输入参数:task: 任务是「分类」或是「回归」

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

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

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

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

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

对于基于重要度的方法,以下两点需要记住:GBM 的训练具有随机性,也就是说每次运行模型得到的特征重要度都是不同的

这不应成为主要的问题(最重要的特征不会突然变成最不重要的),但它会改变一些特征的排序。它也可能影响到识别出的零重要度特征数。你并不需要对特征重要度每次变化的问题感到吃惊。为了训练机器学习模型,首先将特征进行独热编码。这就意味着在建模时加入的独热编码的特征可能是一些被识别为零重要度的特征

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

低重要度特征

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

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

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

在 dataframe 中查看特征重要度:

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

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

唯一值特征

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

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

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

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

去除特征

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

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

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

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

一次运行所有方法

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

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

结论

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

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

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

号外号外~

一个专注于

AI技术发展和AI工程师成长的求知求职社区

诞生啦!

欢迎大家访问以下链接或者扫码体验https://club.leiphone.com/page/home​club.leiphone.com

python 特征选择方法_机器学习小窍门:Python 帮你进行特征选择相关推荐

  1. python降维方法_机器学习数据降维方法总结(附python代码)

    介绍 在机器学习实战时,如果面对一个数据集具有上千个特征,那么对于模型训练将是一个巨大的挑战.面对如此多的数据变量,如果我们认真的去分析每一个变量将耗费我们几周甚至几个月的时间,那么你估计也要被开除了 ...

  2. python安装方法_听说你安装Python包很慢,试试这个方法

    使用Python有快五年了,最近这一年多,经常听到大家说在安装python第三方包很慢很慢.比如这速度,每秒十几kb而网络正常的情况下,pip下载的速度至少应该每秒几百kb才对,甚至还有可能更快,比如 ...

  3. 微信小程序python token验证_微信小程序python 用户认证

    按流程图来 先通过wx.login()获取code,再通过我们后台配置的接口获取openid和session_key // 登录 wx.login({ success: res => { con ...

  4. python中字符串类型的encode()方法_第五章 Python字符串常用方法详解

    5.1 Python字符串拼接(包含字符串拼接数字) 在 Python中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" ...

  5. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  6. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  7. python特征选择的过程_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

    花费了很长时间整理编辑,转载请联系作者授权,违者必究. 特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程.它是机器学习中非常重要的一步并在很大程度上可以提高 ...

  8. python数据分析实况_机器学习竞赛分享:通用的团队竞技类的数据分析挖掘方法...

    前言 该篇分享来源于NFL竞赛官方的R语言版本,我做的主要是翻译为Python版本: 分享中用到的技巧.构建的特征.展示数据的方式都可以应用到其他领域,比如篮球.足球.LOL.双人羽毛球等等,只要是团 ...

  9. python pca降维_机器学习之sklearn中的降维算法

    1. PCA与SVD sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块.在过去的十年中,如果要讨论算法进步的先锋,矩阵分解可以说是独树一帜.矩阵分解可 ...

  10. python实现线性回归预测_机器学习实战笔记(Python实现)-08-线性回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

最新文章

  1. ThinkPHP子类继承Controller类的注意事项
  2. 关于学习Python的一点学习总结(16->popitem()->sedefault()->update()->values())
  3. 原生js实现点击按钮切换全屏!
  4. 1.字母异位词分组(LeetCode第49题)
  5. ubuntu 在线安装php,ubuntu在线安装LNMP
  6. 科沃斯扫地机器人风扇模块_扫地机器人不能开机,不能关机,风扇不转
  7. 【C/C++开发】C++11 并发指南二(std::thread 详解)
  8. Python之collections模块详细实例
  9. 利用winrar自动备份重要资料
  10. unity怎么导入系统的树_unity3d 随机添加树木
  11. 如何重启虚拟机里的ssh服务器,通过SSH重启 vSphere 虚拟机
  12. poj 1502 单源最短路径
  13. 基于SSM的宠物医院信息管理系统javaweb毕业设计项目源码论文
  14. 斐讯 K3刷梅林改固件ac-3100 成功配置定时任务
  15. 潇洒郎: websockets 服务端设计:多线程执行async方法
  16. 怎么看rx580是不是470刷的_rx580显卡看是不是刷的教程
  17. 花之语第五期:紫罗兰
  18. 足球数据API接口 - 【实时指数2】API调用示例代码
  19. 如何查看TR069 协议设备的在线状态
  20. 给大家推荐一个比较好的VC论坛【VC驿站】

热门文章

  1. 汇编语言学习:VM上安装Win98系统
  2. 北大开源ECCV2018深度去雨算法:RESCAN
  3. AI美杜莎来袭 · 光点2021
  4. 敏捷开发 开源软件_开源软件开发的利与弊
  5. 广州“开四停四”交通限行,技术上是如何实现的?
  6. synchronized加锁过程
  7. openg离线包_高级openg 混合,一个完整程序
  8. 【读书笔记】大数据 数据挖掘 相关
  9. NSString NSCFString isMemberOfClass 遇到的相关的问题
  10. WOL(Wake On LAN - 局域网唤醒)外网唤醒 配置教程 远程开机