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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。

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

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

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

  • 改进的模型性能
  • 减少过度拟合
  • 更快的训练和推理
  • 增强的可解释性

下面我们深入了解在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()

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

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

 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、不同模型有不同模型的方法:

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

3、交互作用:

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

3、不稳定:

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

4、Hyperparameters:

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

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

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

  • 尝试多种方法以获得更健壮的视图
  • 聚合结果的集成方法
  • 更多地关注相对顺序,而不是绝对值
  • 差异并不一定意味着有问题,检查差异的原因会对数据和模型有更深入的了解

https://avoid.overfit.cn/post/b3803a40489d4eb0b6d5eda77ddf1556

作者:Roushanak Rahmat, PhD

目录
相关文章
|
1月前
|
缓存 Rust 算法
从混沌到秩序:Python的依赖管理工具分析
Python 的依赖管理工具一直没有标准化,主要原因包括历史发展的随意性、社区的分散性、多样化的使用场景、向后兼容性的挑战、缺乏统一治理以及生态系统的快速变化。依赖管理工具用于处理项目中的依赖关系,确保不同环境下的依赖项一致性,避免软件故障和兼容性问题。常用的 Python 依赖管理工具如 pip、venv、pip-tools、Pipenv、Poetry 等各有优缺点,选择时需根据项目需求权衡。新工具如 uv 和 Pixi 在性能和功能上有所改进,值得考虑。
89 35
|
19天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
26天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
123 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
1月前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
76 21
|
1月前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
38 10
|
7天前
|
SQL 关系型数据库 MySQL
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
|
自然语言处理 算法 Python
|
自然语言处理 算法 索引
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。