使用 scikit-learn 在 Python 中实现 PCA

pythonserver side programmingprogramming

简介

主成分分析 (PCA) 是一种流行的降维方法,它使从高维数据集中提取有用信息变得更加容易。它通过将数据重新投影到不同的轴上来实现这一点,在该轴上可以捕获最高方差。PCA 降低了数据集的复杂性,同时保留了其基本结构。它有助于数据分析中的特征选择、数据压缩和降噪等,甚至可以降低所分析数据的维数。图像处理、生物信息学、经济学和社会科学只是 PCA 的一些应用领域。

它有多种应用,包括图像识别(人类和非人类)、遗传学、金融、消费者细分、推荐系统和情绪分析。总之,主成分分析是一种灵活的方法,可用于各种设置。

了解 PCA 背后的理论

什么是主成分分析 (PCA)?

主成分分析 (PCA) 是一种降维技术,用于将高维数据转换为低维表示,同时保留最重要的信息。它识别数据变化最大的方向(主成分)。

PCA 中的数学概念

PCA 涉及线性代数和矩阵运算。它使用特征向量和特征值等概念来计算主成分。特征向量表示最大方差的方向,特征值表示每个特征向量解释的方差量。

解释方差比

解释方差比表示每个主成分解释的数据总方差的比例。它有助于确定要保留多少个主成分,以在降维和保留信息之间实现最佳平衡。

使用 scikit-learn 实现 PCA

安装 scikit-learn

要安装 scikit-learn,您可以使用以下命令 -

Python 代码

pip install scikit-learn

加载必要的库

在 Python 中,您需要导入实现 PCA 所需的库 -

Python 代码

from sklearn.decomposition import PCA
import numpy as np

数据预处理

缩放特征

在应用 PCA 之前,建议将特征缩放为零均值和单位方差。这可以使用 scikit-learn 的 StandardScaler 实现 -

Python 代码

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

处理缺失值(如果适用)

如果您的数据包含缺失值,您可能需要在执行 PCA 之前处理它们。根据缺失数据的性质,可以使用诸如归纳或删除之类的技术。

执行 PCA

要对缩放数据执行 PCA,请创建 PCA 类的实例并将其拟合到数据中 −

Python 代码

pca = PCA()
pca.fit(scaled_data)

选择组件数量

您可以根据解释方差比率选择组件数量。例如,要保留 95% 的方差,您可以使用 −

Python 代码

n_components = np.argmax(np.cumsum(pca.explained_variance_ratio_) >= 0.95) + 1

解释主成分

可以使用 pca.components 访问主成分。主成分是原始特征的线性组合,每个特征代表数据变化的唯一轴。可以分析主成分的系数以揭示它们在解释总方差方面的相对重要性。

可视化 PCA 结果

双标图

双标图是一种散点图,可同时显示点和 PC。因此可以看到数据和主要成分之间的联系。Matplotlib 和 scikit-learn 是可用于生成双标图的两个库示例 -

Python 代码

import matplotlib.pyplot as plt

# 假设 X 是原始数据矩阵
X_pca = pca.transform(scaled_data)

plt.scatter(X_pca[:, 0], X_pca[:, 1]) # 将 0 和 1 替换为所需的主要成分
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()

碎石图

主成分的特征值(或解释方差)从最高到最低绘制在碎石图中。这对于确定要保留多少块很有用。 Matplotlib 可用于创建屏幕图 −

Python 代码

plt.plot(range(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, marker='o')
plt.xlabel('Principal Components')
plt.ylabel('Explained Variance Ratio')
plt.show()

这些可视化提供了对数据结构的洞察以及每个主成分在捕获原始数据变异性方面的重要性。

评估 PCA 的性能

评估解释方差比

在应用 PCA 后,评估每个主成分解释的数据变化量至关重要。此数据对于决定保留多少部分很有用。可以使用 scikit-learn 的 PCA 对象的"explained_variance_ratio_"字段在 Python 中访问解释方差比。以下是一段示例代码 -

Python 代码

from sklearn.decomposition import PCA

# 假设 'X' 是您的预处理数据
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 访问解释方差比率
explained_variance_ratio = pca.explained_variance_ratio_
print("Explained Variance Ratio:", explained_variance_ratio)

重建原始数据

通过将数据映射到低维空间,PCA 能够降低数据的维数。使用 'inverse_transform()' 函数,您可以从压缩表示中返回原始数据。以下是一段示例代码 -

Python 代码

# 重建原始数据
X_reconstructed = pca.inverse_transform(X_pca)

评估降维对模型性能的影响

使用 PCA 后,您需要弄清楚降维如何影响机器学习模型的成功。在应用 PCA 之前和之后,您可以比较准确率或均方误差等性能指标。这是一个示例代码片段 −

Python 代码

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# 假设 'y' 是你的目标变量
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42)

# 在精简数据上训练和评估逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
accuracy_pca = model.score(X_test, y_test)

# 在原始数据上训练和评估逻辑回归模型
model_original = LogisticRegression()
model_original.fit(X_train_original, y_train)
accuracy_original = model_original.score(X_test_original, y_test)

print("使用 PCA 的准确率:", accuracy_pca)
print("不使用 PCA 的准确率:", accuracy_original)

通过比较使用和不使用 PCA 时模型的效果,您可以了解降维对您的特定工作有何影响。

结论

总之,使用 Python 中 scikit-learn 实现的 PCA 可以高效地完成降维和特征提取。如果正确理解、实施和评估,PCA 可以为广泛应用领域中更有效的数据分析、可视化和建模铺平道路。


相关文章


有用资源