主成分分析(PCA)原理与特征选取
前言
在许多领域中存在着大量数据特征,我们通常需要在海量的数据中提取出有价值的信息,例如如何在众多的数据特征中筛选或者是提取出高度有效的特征指标,而PCA就是一种能够解决此类问题的有效方法。
一、什么是PCA?
PCA(Principal Component Analysis),即主成分分析方法,主成分顾名思义就是代表一个数据中或者是事件中最重要、最主要的成分。主成分分析是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上(k<=n),这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
二、PCA作用
主成分分析能将高维的数据映射到低维的空间中,同时保留数据集中最重要的特征,其中主要作用包括:
- 数据降维:PCA能够将高维数据转换为低维空间表示,能够很好的节约计算成本,同时更加有利于进行数据可视化与理解数据等。
- 特征提取:PCA可以识别数据中最重要的特征,通过累计方差贡献率,找到特征之间得分最高、对数据影响最大的特征。
- 压缩数据:PCA可以对数据进行压缩,减少存储空间与传输成本,在压缩的同时,尽可能保留了数据最主要的信息。
- 去噪:PCA可以帮助消除数据中的噪声,改善数据的质量和可靠性。
三、PCA原理
主成分分析法是运用“降维”思想,把多个指标变换成少数综合指标的多元统计方法,这里的综合指标就是主成分。每个主成分都是原始变量的线性组合,彼此相互独立,并保留了原始变量绝大部分信息。其本质是通过原始变量的相关性,寻求相关变 量的综合替代对象,并且保证了转化过程中的信息损失最小 。根据标准化后的数据集计算协方差矩阵R:
注意需要先对数据进行标准化
计算矩阵 R 的特征值 λ 1 ≥λ 2 ≥…≥λ n ≥ 0及 对应的特征向量 u1 ,u2 ,…,un ,其中 uj= (u1 j,u2 j, …,u nj) ,u nj 表示第 j 个特征向量的第 n 个分量; 由特征向量组成 n 个新的指标变量:
式中,y 1 是第 1 主成分,y 2 是第 2 主成分,…,y n 是第 n 主成分。 计算各主成分y j 贡献率 b j(j=1,2,…,n) 及 y 1,y 2 ,…,y n (p ≤ n)的累计贡献率 αp。
四、案例分析
1.引入库
#导入所需要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
2.读入数据
#导入数据
data = pd.read_excel('你的数据.xlsx')
data.set_index('索引',inplace=True)
display(data.head())
3.主成分分析获取重要特征数据
from sklearn.decomposition import PCA #机器学习中pca库
from sklearn.preprocessing import StandardScaler #标准化库
# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data.iloc[:, :-1]) #最后一列为标签
# 创建PCA模型
pca = PCA()
# 拟合PCA模型
pca.fit(scaled_data)
# 把累计方差解释可视化
explained_variance_ratio = pca.explained_variance_ratio_
cumulative_variance_ratio = np.cumsum(explained_variance_ratio)
plt.figure(figsize=(8, 6))
plt.plot(range(1, len(cumulative_variance_ratio) + 1), cumulative_variance_ratio, marker='o', linestyle='--')
plt.xlabel('Number of Principal Components')
plt.ylabel('Cumulative Explained Variance')
plt.title('Cumulative Explained Variance vs. Number of Principal Components')
plt.grid()
plt.show()
# 计算需要多少主成分以达到80%的累积方差
n_components = np.argmax(cumulative_variance_ratio >= 0.80) + 1
print(f"需要前 {n_components} 个主成分以达到80%的累积方差")
# 获取方差解释率超过80%的特征指标
selected_variance_ratios = explained_variance_ratio[:n_components]
selected_features = data.columns[:-1][:n_components]
# 输出方差解释率超过85%的特征指标和它们的贡献得分
print("方差解释率超过80%的特征指标和它们的贡献得分:")
for feature, variance_ratio in zip(selected_features, selected_variance_ratios):
print(f"特征: {feature}, 方差解释率: {variance_ratio:.4f}")
# 使用所选的主成分来转换数据
pca = PCA(n_components=n_components)
reduced_data = pca.fit_transform(scaled_data)
得到结构如下:
根据每个特征的贡献得分大小,可以有效的筛选出主要特征
总结
主成分分析的作用不仅仅于此,它还被广泛使用在各个领域,如金融、计算机视觉、文本分析等;关于主成分分析与特征提取方面还有很多改进的地方,例如可以将PCA与皮尔逊相关系数所结合,充分发挥两种方法的优点,提取出更具代表性和相关性的特征,从而提高模型的性能和可解释性。