Python中进行特征重要性分析的9个常用方法

详解feature_importances_ 基于模型的评估指标 1. feature_importances_的计算过程 2.feature_importances_的计算特性 2.1 feature_importances_的随机性 2.2 feature_importances_受建模过程影响 3 基于feature_importances_的特征筛选 阅读详情

特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。

为什么特征重要性分析很重要?

如果有一个包含数十个甚至数百个特征的数据集,每个特征都可能对你的机器学习模型的性能有所贡献。但是并不是所有的特征都是一样的。有些可能是冗余的或不相关的,这会增加建模的复杂性并可能导致过拟合。

特征重要性分析可以识别并关注最具信息量的特征,从而带来以下几个优势:

  • 改进的模型性能

  • 减少过度拟合

  • 更快的训练和推理

  • 增强的可解释性

下面我们深入了解在Python中的一些特性重要性分析的方法。

特征重要性分析方法

1、排列重要性 PermutationImportance

该方法会随机排列每个特征的值,然后监控模型性能下降的程度。如果获得了更大的下降意味着特征更重要



from sklearn.datasets import load\_breast\_cancer  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.inspection import permutation\_importance  
from sklearn.model\_selection import train\_test\_split  
import matplotlib.pyplot as plt  
   
cancer = load\_breast\_cancer()  
   
X\_train, X\_test, y\_train, y\_test = train\_test\_split(cancer.data, cancer.target, random\_state=1)  
   
rf = RandomForestClassifier(n\_estimators=100, random\_state=1)  
rf.fit(X\_train, y\_train)  
   
baseline = rf.score(X\_test, y\_test)  
result = permutation\_importance(rf, X\_test, y\_test, n\_repeats=10, random\_state=1, scoring='accuracy')  
   
importances = result.importances\_mean  
   
# Visualize permutation importances  
plt.bar(range(len(importances)), importances)  
plt.xlabel('Feature Index')  
plt.ylabel('Permutation Importance')  
plt.show()


[外链图片转存中…(img-pi8NSf8x-1704351889783)]

2、内置特征重要性(coef_或feature_importances_)

一些模型,如线性回归和随机森林,可以直接输出特征重要性分数。这些显示了每个特征对最终预测的贡献。



from sklearn.datasets import load\_breast\_cancer  
from sklearn.ensemble import RandomForestClassifier  
   
X, y = load\_breast\_cancer(return\_X\_y=True)  
   
rf = RandomForestClassifier(n\_estimators=100, random\_state=1)  
rf.fit(X, y)  
   
importances = rf.feature\_importances\_  
   
# Plot importances  
plt.bar(range(X.shape\[1\]), importances)  
plt.xlabel('Feature Index')  
plt.ylabel('Feature Importance')  
plt.show()


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3、Leave-one-out

迭代地每次删除一个特征并评估准确性。



 from sklearn.datasets import load\_breast\_cancer  
 from sklearn.model\_selection import train\_test\_split  
 from sklearn.ensemble import RandomForestClassifier  
 from sklearn.metrics import accuracy\_score  
 import matplotlib.pyplot as plt  
 import numpy as np  
   
 # Load sample data  
 X, y = load\_breast\_cancer(return\_X\_y=True)  
   
 # Split data into train and test sets  
 X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.3, random\_state=1)  
   
 # Train a random forest model  
 rf = RandomForestClassifier(n\_estimators=100, random\_state=1)  
 rf.fit(X\_train, y\_train)  
   
 # Get baseline accuracy on test data  
 base\_acc = accuracy\_score(y\_test, rf.predict(X\_test))  
   
 # Initialize empty list to store importances  
 importances = \[\]  
   
 # Iterate over all columns and remove one at a time  
 for i in range(X\_train.shape\[1\]):  
    X\_temp = np.delete(X\_train, i, axis=1)  
    rf.fit(X\_temp, y\_train)  
    acc = accuracy\_score(y\_test, rf.predict(np.delete(X\_test, i, axis=1)))  
    importances.append(base\_acc - acc)  
       
 # Plot importance scores      
 plt.bar(range(len(importances)), importances)  
 plt.show()


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4、相关性分析

计算各特征与目标变量之间的相关性。相关性越高的特征越重要。



import pandas as pd  
from sklearn.datasets import load\_breast\_cancer  
   
X, y = load\_breast\_cancer(return\_X\_y=True)  
df = pd.DataFrame(X, columns=range(30))  
df\['y'\] = y  
   
correlations = df.corrwith(df.y).abs()  
correlations.sort\_values(ascending=False, inplace=True)  
   
correlations.plot.bar()


5、递归特征消除 Recursive Feature Elimination

递归地删除特征并查看它如何影响模型性能。删除时会导致更大下降的特征更重要。



 from sklearn.ensemble import RandomForestClassifier  
 from sklearn.feature\_selection import RFE  
 import pandas as pd  
 from sklearn.datasets import load\_breast\_cancer  
 import matplotlib.pyplot as plt  
   
 X, y = load\_breast\_cancer(return\_X\_y=True)  
 df = pd.DataFrame(X, columns=range(30))  
 df\['y'\] = y  
   
 rf = RandomForestClassifier()  
   
 rfe = RFE(rf, n\_features\_to\_select=10)  
 rfe.fit(X, y)  
   
 print(rfe.ranking\_)


输出为[6 4 11 12 7 11 18 21 8 16 10 3 15 14 19 17 20 13 11 11 12 9 11 5 11]

6、XGBoost特性重要性

计算一个特性用于跨所有树拆分数据的次数。更多的分裂意味着更重要。



 import xgboost as xgb  
 import pandas as pd  
 from sklearn.datasets import load\_breast\_cancer  
 import matplotlib.pyplot as plt  
   
 X, y = load\_breast\_cancer(return\_X\_y=True)  
 df = pd.DataFrame(X, columns=range(30))  
 df\['y'\] = y  
   
 model = xgb.XGBClassifier()  
 model.fit(X, y)  
   
 importances = model.feature\_importances\_  
 importances = pd.Series(importances, index=range(X.shape\[1\]))  
 importances.plot.bar()


7、主成分分析 PCA

对特征进行主成分分析,并查看每个主成分的解释方差比。在前几个组件上具有较高负载的特性更为重要。



 from sklearn.decomposition import PCA  
 import pandas as pd  
 from sklearn.datasets import load\_breast\_cancer  
 import matplotlib.pyplot as plt  
   
 X, y = load\_breast\_cancer(return\_X\_y=True)  
 df = pd.DataFrame(X, columns=range(30))  
 df\['y'\] = y  
   
 pca = PCA()  
 pca.fit(X)  
   
 plt.bar(range(pca.n\_components\_), pca.explained\_variance\_ratio\_)  
 plt.xlabel('PCA components')  
 plt.ylabel('Explained Variance')


8、方差分析 ANOVA

使用f_classif()获得每个特征的方差分析f值。f值越高,表明特征与目标的相关性越强。



 from sklearn.feature\_selection import f\_classif  
 import pandas as pd  
 from sklearn.datasets import load\_breast\_cancer  
 import matplotlib.pyplot as plt  
   
 X, y = load\_breast\_cancer(return\_X\_y=True)  
 df = pd.DataFrame(X, columns=range(30))  
 df\['y'\] = y  
   
 fval = f\_classif(X, y)  
 fval = pd.Series(fval\[0\], index=range(X.shape\[1\]))  
 fval.plot.bar()


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

9、卡方检验

使用chi2()获得每个特征的卡方统计信息。得分越高的特征越有可能独立于目标。



 from sklearn.feature\_selection import chi2  
 import pandas as pd  
 from sklearn.datasets import load\_breast\_cancer  
 import matplotlib.pyplot as plt  
   
 X, y = load\_breast\_cancer(return\_X\_y=True)  
 df = pd.DataFrame(X, columns=range(30))  
 df\['y'\] = y  
   
 chi\_scores = chi2(X, y)  
 chi\_scores = pd.Series(chi\_scores\[0\], index=range(X.shape\[1\]))  
 chi\_scores.plot.bar()


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么不同的方法会检测到不同的特征?

不同的特征重要性方法有时可以识别出不同的特征是最重要的,这是因为:

1、他们用不同的方式衡量重要性:

有的使用不同特特征进行预测,监控精度下降

像XGBOOST或者回国模型使用内置重要性来进行特征的重要性排列

而PCA着眼于方差解释

2、不同模型有不同模型的方法:

线性模型倾向于线性关系、树模型倾向于接近根的特征

4、交互作用:

有的方法可以获取特征之间的相互左右,而有一些则不行,这就会导致结果的差异

5、不稳定:

使用不同的数据子集,重要性值可能在同一方法的不同运行中有所不同,这是因为数据差异决定的

6、Hyperparameters:

通过调整超参数,如PCA组件或树深度,也会影响结果

所以不同的假设、偏差、数据处理和方法的可变性意味着它们并不总是在最重要的特征上保持一致。

选择特征重要性分析方法的一些最佳实践

  • 尝试多种方法以获得更健壮的视图

  • 聚合结果的集成方法

  • 更多地关注相对顺序,而不是绝对值

  • 差异并不一定意味着有问题,检查差异的原因会对数据和模型有更深入的了解

---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

利用PermutationImportance挑选变量 我们在构建树类模型(XGBoost、LightGBM等)时,如果想要知道哪些变量比较重要的话。可以通过模型的feature_importances_方法来获取特征重要性。例如LightGBM的feature_importances_可以通过特征的分裂次数或利用该特征分裂后的增益来衡量。一般情况下,不同的衡量准则得到的特征重要性顺序会有差异。我一般是通过多种评价标准来交叉选择特征。博主认为,若一个特... 阅读详情

相关推荐

排列重要性 Python:使用特征重要性进行特征选择

排列重要性(Permutation Importance)是一种常用的特征选择方法,可以通过对特征进行打乱和评估模型性能的变化来确定特征的重要性。我们首先准备了数据集和训练好的机器学习模型,然后实现了排列重要性算法来度量特征的重要性。最后,我们根据得分对特征进行排序,并选择排名靠前的特征作为最重要的特征。通过使用排列重要性算法,我们可以更好地理解特征对机器学习模型的预测能力的影响程度。我们可以根据得分的大小对特征进行排序,并选择排名靠前的特征作为最重要的特征。是我们训练好的机器学习模型,

ByteJolt的博客 408

量化特征贡献度函数:feature_importances_函数/LGBMClassifier/XGBClassifier

feature_importances_是scikit-learn机器学习库中许多模型对象的属性,在训练模型之后调用该属性可以输出各个特征在模型中的重要性。在上述代码中,我们训练了一个随机森林回归模型,并使用feature_importances_输出了各个特征的重要性。输出结果为:[0.08519548, 0.39799048, 0.40214713, 0.11466691],即第2个特征和第3个特征在模型中较为重要,而第1个和第4个特征的重要性相对较低。

记录 IT 领域经验与见解的博客 5283

机器学习 | Python中进行特征重要性分析的9个常用方法

在Python中,特征重要性分析是机器学习模型解释和特征选择的关键步骤。

尘世冰封的专栏 167

Python每日一记42>>>机器学习中特征重要性feature_importances_

在进行机器学习算法中,我们常用的算法就像下面的代码形式类型 经历导入数据-预处理-建模-得分-预测 但是总觉得少了点什么,虽然我们建模的目的是进行预测,但是我们想要知道的另一个信息是变量的重要性,在线性模型中,我们有截距和斜率参数,但是其他机器学习算法,如决策树和随机森林,我们貌似没有这样的参数 值得庆幸的是我们有变量重要性指标feature_importances_,但是就目前而言,这个参数好...

教练我想学编程 2万+

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 365

Quartus II设计程序计数器PC、由PC产生ROM的地址(含仿真)

设计程序计数器PC,正常工作模式下,系统启动,设置PC的初始值,之后每来一个clk,PC的输出值应该增加1;当程序发生跳转时,PC的值应该发生改变,级将跳转的地址值赋进行输出。PC后端连接一个ROM,由PC来产生ROM的地址,仿真进行验证。

m0_73700621的博客 1815

Python特征重要性分析的9个常用方法

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。为什么特征重要性分析很重要?如果有一个包含数十个甚至数百个特征的数据集,每个特征都可能对你的机器学习模型的性能有所贡献。但是并不是所有的特征都是一样的。有些可能是冗余的或不相关的,...

小白学视觉 1002

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

【Python】Python特征重要性分析的9个常用方法

特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。为什么特征重要性分析很重要?如果有一个包含数十个甚至数百个特征的数据集,每个特征都可能对你的机器学习模型的性能有所贡献。但是并不是所有的特征都是一样的。有些可能是冗余的或不相关的,这会增加建模的复杂性并可能导致过拟合。扩展阅读:Python特征选择(...

fengdu78的博客 655

构造地貌研究入门:手把手教你用ArcGIS插件CalHypso分析流域地貌形态

本文详细介绍了如何使用ArcGIS插件CalHypso进行流域地貌形态分析,包括工具安装、数据预处理、HI曲线生成及结果解读等关键步骤。通过实战操作,帮助读者掌握面积高程积分(HI)曲线的应用技巧,为构造地貌研究提供量化工具。

weixin_33704234的博客 105

innovus 命令每日精要 | 掌控Innovus布线的利器——setNanoRouteMode详解

在数字IC后端设计的复杂世界里,布线优化是至关重要的一步。今天,我来给大家深入讲解Innovus工具中setNanoRouteMode命令的精妙之处,让你轻松驾驭布线策略,提升设计质量。setNanoRouteMode是Innovus中用于配置NanoRoute绕线行为的关键命令。通过其丰富的参数,你可以精细控制布局后阶段的绕线策略、信号完整性优化、工艺适配及设计规则修复等流程。下面,我将按功能分类总结其核心选项,并针对不同场景给出建议。

weixin_50820814的博客 3528
上一篇: 每日Python:十个实用代码技巧
下一篇: Django 5.0正式发布,最流行Python Web框架
Python_P叔
博客等级 码龄3年 5451粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值