【Python特征工程系列】一文教你使用PCA进行特征分析与降维(案例+源码)

本文主要是介绍【Python特征工程系列】一文教你使用PCA进行特征分析与降维(案例+源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是我的第287篇原创文章。

一、引言

      主成分分析(Principal Component Analysis, PCA)是一种常用的降维技术,它通过线性变换将原始特征转换为一组线性不相关的新特征,称为主成分,以便更好地表达数据的方差。

      在特征重要性分析中,PCA 可以用于理解数据中最能解释方差的特征,并帮助识别对目标变量影响最大的特征。可以通过查看PCA的主成分(主特征向量)以及各主成分所对应的特征重要性来推断哪些原始特征在新特征中起到了较大影响。

      PCA 的局限性:

  • PCA 是一种线性变换方法,可能无法很好地处理非线性关系的数据。
  • PCA 可能会丢失一些信息,因为它主要关注的是数据中的方差,而忽略了其他方面的信
  • PCA 假设主成分与原始特征之间是线性关系,这在某些情况下可能不成立。

二、实现过程

2.1 读取数据

# 准备数据
data = pd.read_csv(r'dataset.csv')
df = pd.DataFrame(data)
print(df)
# 目标变量和特征变量
target = 'target'
features = df.columns.drop(target)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=0)

df:

图片

2.2 对训练集做PCA主成分分析

自主选择主成分,并打印出每个主成分的解释性方差:

pca = PCA(n_components='mle')
pca.fit(X_train)
var_ratio = pca.explained_variance_ratio_
for idx, val in enumerate(var_ratio, 1):print("Principle component %d: %.2f%%" % (idx, val * 100))
print("total: %.2f%%" % np.sum(var_ratio * 100))

结果:

图片

共计10个主成分。

2.3 通过主成分分析原始特征重要性

打印出每个特征对于主成分的系数,这反映了原始特征的重要性:

print(pca.components_)

结果:

图片

通过计算10个主成分中,每个原始特征的系数绝对值之和作为该特征的最终贡献度:

# 计算原始特征与主成分的相关性(绝对值)
feature_importance = np.abs(pca.components_)
# 计算每个主成分中原始特征的权重(系数)和
feature_importance_sum = np.sum(feature_importance, axis=0)
# 打印原始特征的重要性(贡献度)
print("\n原始特征的重要性(贡献度):")
ranking_df = pd.DataFrame({'特征': features, '贡献度': feature_importance_sum})
ranking_df = ranking_df.sort_values(by='贡献度')
print(ranking_df)

结果:

图片

可视化:

图片

2.4 查看累计解释方差比率与主成分个数的关系

fig, ax = plt.subplots(figsize=(10, 7))
ax.plot(np.arange(1, len(var_ratio) + 1), np.cumsum(var_ratio), "-ro")
ax.set_title("Cumulative Explained Variance Ratio", fontsize=15)
ax.set_xlabel("number of components")
ax.set_ylabel("explained variance ratio(%)")
plt.show()

结果:

图片

前2个主成分累计解释性方差比率接近0.9,前3个主成分累计解释方差比率超过0.95。

2.5 自动选择最优的主成分个数

设定累计解释方差比率的目标,让sklearn自动选择最优的主成分个数:

target = 0.9  # 保留原始数据集90%的变异
res = PCA(n_components=target).fit_transform(X_train)
print("original shape: ", X_train.shape)
print("transformed shape: ", res.shape)

结果:

图片

选择了3个主成分。

2.6 主成分选择可视化(以2个主成分为例)

选择两个主成分,并进行可视化:

pca=PCA(n_components=2)  #加载PCA算法,设置降维后主成分数目为2
reduced_x=pca.fit_transform(X_train)#对样本进行降维
principalDf = pd.DataFrame(data = reduced_x, columns = ['principal component 1', 'principal component 2'])
print(principalDf)
y_train = np.array(y_train)
yes_x,yes_y=[],[]
no_x,no_y=[],[]
for i in range(len(reduced_x)):if y_train[i] ==1:yes_x.append(reduced_x[i][0])yes_y.append(reduced_x[i][1])elif y_train[i]==0:no_x.append(reduced_x[i][0])no_y.append(reduced_x[i][1])
plt.scatter(yes_x,yes_y,c='r',marker='x')
plt.scatter(no_x,no_y,c='b',marker='D')
plt.xlabel("First Main Component")
plt.ylabel("Second Main Component")
plt.show()

结果:

图片

可以看出2个主成分可以大概划分出两类。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

这篇关于【Python特征工程系列】一文教你使用PCA进行特征分析与降维(案例+源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(