一个可以进行机器学习特征选择的python工具

2024-06-21 09:38

本文主要是介绍一个可以进行机器学习特征选择的python工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


:Will Koehrsen

编译:ronghuaiyang

前戏

用这个工具可以高效的构建机器学习工作流程。一起来了解一下这个工具吧。

特征选择是在数据集中寻找和选择最有用的特征的过程,是机器学习pipeline中的一个关键步骤。不必要的特征降低了训练速度,降低了模型的可解释性,最重要的是,降低了测试集的泛化性能。

我发现自己一遍又一遍地为机器学习问题应用特别的特征选择方法,这让我感到沮丧,于是我在Python中构建了一个特征选择类可在GitHub上找到。 FeatureSelector包括一些最常见的特征选择方法:

  1. 缺失值百分比高的特征

  2. 共线性(高相关性)的特征

  3. 在基于树的模型中零重要性的特征

  4. 低重要性的特征

  5. 具有单一唯一值的特征

在本文中,我们将在一个样例机器学习数据集上使用 FeatureSelector。我们将看到它如何允许我们快速实现这些方法,从而实现更有效的工作流。

完整的代码可在GitHub上获得,我鼓励任何贡献。 Feature Selector正在开发中,并将根据社区的需要不断改进!

样例数据集

在本例中,我们将使用Kaggle上的Home Credit Default Risk machine learning competition数据。(要开始竞赛,请参见本文)。整个数据集可下载,这里我们将使用一个例子来演示。

640?wx_fmt=png

样例数据,TARGET是分类的标签

这个比赛是一个监督分类问题,这是一个很好的数据集,因为它有许多缺失的值,许多高度相关(共线)的特征,和一些不相关的特征,这对机器学习模型没有帮助。

创建实例

要创建 FeatureSelector类的实例,我们需要传入一个结构化数据集,其中包含行和列中的特征。我们可以使用一些只有特征的方法,但是基于重要性的方法也需要训练标签。由于我们有一个监督分类任务,我们将使用一组特征和一组标签。

(确保在与feature_selector.py相同的目录中运行这个脚本)

from feature_selector import FeatureSelector	
# Features are in train and labels are in train_labels	
fs = FeatureSelector(data = train, labels = train_labels)
方法

特征选择器有五种方法来查找要删除的特征。我们可以访问任何已识别的特征并手动从数据中删除它们,或者使用特征选择器中的“remove”函数。

在这里,我们将详细介绍每种识别方法,并展示如何同时运行所有5种方法。 FeatureSelector还具有一些绘图功能,因为可视化检查数据是机器学习的关键组件。

缺失值

查找要删除的特征的第一种方法很简单:看看哪些特征的缺失值的比例大于某个阈值。下面的调用标识了缺失值超过60%的特征。

fs.identify_missing(missing_threshold = 0.6)	
17 features with greater than 0.60 missing values.

我们可以看到dataframe中每一列缺失值的比例:

fs.missing_stats.head()

640?wx_fmt=png

要查看要删除的特征,我们访问 FeatureSelector的 ops属性,这是一个Python字典,值为特征列表。

missing_features = fs.ops['missing']	
missing_features[:5]	
['OWN_CAR_AGE',	'YEARS_BUILD_AVG',	'COMMONAREA_AVG',	'FLOORSMIN_AVG',	'LIVINGAPARTMENTS_AVG']

最后,我们绘制了所有特征缺失值的分布图:

fs.plot_missing()

640?wx_fmt=png

共线性的特征

共线性特征是彼此高度相关的特征。在机器学习中,由于方差大、模型可解释性差,导致测试集泛化性能下降。

方法 identify_collinear根据指定的相关系数值查找共线特征。对于每一对相关的特征,它识别出要删除的特征之一(因为我们只需要删除一个):

fs.identify_collinear(correlation_threshold = 0.98)	
21 features with a correlation magnitude greater than 0.98.

我们可以用关联做出一个清晰的可视化,那就是热图。这显示了在阈值以上至少有一个相关性特征的所有特征:

fs.plot_collinear()

640?wx_fmt=png

如前所述,我们可以访问将要删除的相关特征的整个列表,或者查看dataframe中高度相关的特征对。

# list of collinear features to remove	
collinear_features = fs.ops['collinear']	
# dataframe of collinear features	
fs.record_collinear.head()

640?wx_fmt=png

如果我们想要研究我们的数据集,我们还可以通过将 plot_all=True传递给调用来绘制数据中所有关联的图表:

640?wx_fmt=png

零重要性特征

前两种方法可以应用于任何结构化数据集,并且是确定性的——对于给定的阈值,每次结果都是相同的。下一种方法只适用于有监督的机器学习问题,在这种问题中,我们有训练模型的标签,并且是不确定的。 identify_zero_importance函数根据梯度提升机(GBM)学习模型查找不重要的特征。

使用基于树的机器学习模型,例如增强集成,我们可以找到特征重要性。重要性的绝对值没有相对值重要,相对值可以用来确定任务的最相关的特征。我们还可以通过删除零重要性的特征来进行特征选择。在基于树的模型中,不使用零重要性的特征来分割任何节点,因此我们可以在不影响模型性能的情况下删除它们。

FeatureSelector使用LightGBM库中的梯度提升机查找特征重要性。为了减少方差,将GBM的10次训练的特征重要性计算平均值。此外,使用带有验证集的early stop(可以选择关闭验证集)对模型进行训练,以防止对训练数据的过拟合。

下面的代码调用该方法,提取零重要性特征:

# Pass in the appropriate parameters	
fs.identify_zero_importance(task = 'classification', 	eval_metric = 'auc', 	n_iterations = 10, 	early_stopping = True)	
# list of zero importance features	
zero_importance_features = fs.ops['zero_importance']	
63 features with zero importance after one-hot encoding.

我们传入的参数如下:

任务:对应问题的“分类”或“回归”

eval_metric:用于早期停止的指标(如果禁用了早期停止,则没有必要使用该指标)

n_iteration:训练次数,用来对特征重要性取平均

early ly_stop:是否使用early stop来训练模型

这次我们得到了两个带有 plot_feature_importances的图:

# plot the feature importances	
fs.plot_feature_importances(threshold = 0.99, plot_n = 12)	
124 features required for 0.99 of cumulative importance

640?wx_fmt=png

640?wx_fmt=png

在左边,我们有 plot_n最重要的特征(按照归一化重要性绘制,总和为1),在右边,我们有相对于特征数量的累积重要性。垂直线是在累积重要性的“阈值”处绘制的,在本例中是99%。

对于基于重要性的方法,有两个注意事项值得记住:

  • 梯度提升机的训练是随机的,这意味着每次运行模型时特征输入都会发生变化

这应该不会产生重大影响(最重要的特征不会突然变得最不重要),但是它会改变一些特征的顺序。它还可以影响识别的零重要性特征的数量。如果特征的重要性每次都发生变化,不要感到惊讶!

  • 为了训练机器学习模型,首先对特征进行“独热编码”。这意味着一些重要性为0的特征可能是在建模过程中添加的独热编码特征。

当我们到达特征删除阶段时,有一个选项可以删除任何添加的独热编码特征。然而,如果我们在特征选择之后进行机器学习,我们还是要对特征进行一次独热编码!

低重要性特征

下一个方法建立在零重要性函数的基础上,利用模型的特征输入进行进一步的选择。函数 identify_low_importance查找对总重要性没什么贡献的最低重要性的特征。

例如,下面的调用找到了最不重要的特征,这些特征对于99%的总重要性是不需要的:

fs.identify_low_importance(cumulative_importance = 0.99)	
123 features required for cumulative importance of 0.99 after one hot encoding.	
116 features do not contribute to cumulative importance of 0.99.

基于累积重要性图和这些信息,梯度提升机认为许多特征与学习无关。同样,这种方法的结果将在每次训练运行时发生变化。

要查看dataframe中的所有重要特征:

fs.feature_importances.head(10)

640?wx_fmt=png

low_importance方法借鉴了使用主成分分析(PCA)的一种方法,这种方法通常只保留需要保留一定百分比的方差(如95%)的PC。占总重要性的百分比是基于相同的思想。

基于特征重要性的方法只有在我们使用基于树的模型进行预测时才真正适用。除了随机性之外,基于重要性的方法是一种黑盒方法,因为我们不知道为什么模型认为这些特征是无关的。如果使用这些方法,请多次运行它们以查看结果的变化,也许还可以创建具有不同参数的多个数据集进行测试!

单一唯一值的特征

最后一个方法是相当基本的:找到任何只有一个惟一值的列。只有一个惟一值的特征对机器学习没有用处,因为这个特征的方差为零。例如,基于树的模型永远不能对只有一个值的特征进行分割(因为没有分组来划分观察结果)。

这里没有参数选择,不像其他方法:

fs.identify_single_unique()	
4 features with a single unique value.

我们可以绘制每个类别中唯一值的数量直方图:

fs.plot_unique()

640?wx_fmt=png

需要记住的一点是,在默认情况下计算panda中的惟一值之前先删除 NaNs 。

去除特征

一旦我们确定了要丢弃的特征,我们有两个选项来删除它们。所有要删除的特征都存储在 FeatureSelector的 ops字典中,我们可以使用列表手动删除特征。另一个选项是使用“remove”内置函数。

对于这个方法,我们传入用于删除特征的 方法。如果我们想使用所有实现的方法,我们只需传入 methods='all'

# Remove the features from all methods (returns a df)	
train_removed = fs.remove(methods = 'all')	
['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run	
Removed 140 features.

此方法返回一个删除了特征的dataframe。还可以删除机器学习过程中创建的独热编码特征:

train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)	
Removed 187 features including one-hot features.

在继续操作之前,检查将被删除的特征可能是一个好主意!原始数据集存储在 FeatureSelector的 data 属性中作为备份!

一次运行所有方法

我们可以使用 identify_all而不是单独使用这些方法。这需要每个方法的参数字典:

fs.identify_all(selection_params = {'missing_threshold': 0.6,    	'correlation_threshold': 0.98, 	'task': 'classification',    	'eval_metric': 'auc', 	'cumulative_importance': 0.99})	
151 total features out of 255 identified for removal after one-hot encoding.

请注意,由于我们重新运行了模型,总特征的数量将发生变化。然后可以调用“remove”函数来删除这些特征。

总结

在训练机器学习模型之前,Feature Selector类实现了几个常见的删除特征的操作。它提供了识别要删除的特征以及可视化功能。方法可以单独运行,也可以一次全部运行,以实现高效的工作流。

missing、 collinear和 single_unique方法是确定的,而基于特征重要性的方法将随着每次运行而改变。特征选择,就像机器学习领域,很大程度上是经验主义的,需要测试多个组合来找到最佳答案。在pipeline中尝试几种配置是最佳实践,特征选择器提供了一种快速评估特征选择参数的方法。

640?wx_fmt=png— END—

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

640?wx_fmt=jpeg

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧640?wx_fmt=gif

这篇关于一个可以进行机器学习特征选择的python工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系