主成分分析(PCA)详解

主成分分析(PCA)是一种重要的降维技术,它能够在减少数据集维度的同时保留尽可能多的信息量。本文将探讨PCA的必要性、工作原理、应用前的预处理步骤以及主成分的解释方法。

为什么需要PCA

在处理具有大量属性的数据集时,PCA显得尤为重要。现实世界中的数据集往往包含大量杂乱无章的属性。如果不对这些大数据集进行降维处理,直接应用机器学习模型将会导致计算成本高昂。因此,为了降低维度并保留尽可能多的信息,需要使用PCA,目的是在减少时间和空间复杂度的同时,提供准确的机器学习模型。对于属性较少的数据集,可以避免使用PCA。

应用PCA前的预处理步骤

在应用PCA之前,需要考虑以下几点:

  • PCA不能应用于包含空值的数据集。因此,在进行PCA之前,需要对空值进行处理,比如删除变量或使用均值或中位数来填补缺失数据。
  • 不应该在不同量表的属性上应用PCA。在应用PCA之前,需要对变量进行标准化。
import pandas as pd import numpy as np import matplotlib.pyplot as plt data = pd.read_csv(r"C:\Users\Himanshu\Downloads\Facebook_metrics\dataset_Facebook.csv", sep=';') data.drop(columns='Type', inplace=True) # 为了简化分析,只保留数值数据 data.head()

将检查数据集的统计摘要,以了解不同属性的量表。以下可以看到每个属性都在不同的量表上。因此,在不改变属性量表的情况下,不能直接进行PCA。

主成分的数量由谁决定

除非另有规定,主成分的数量将等于属性的数量。初始数据集有18个属性,因此得到了18个主成分。这些成分是新的变量,实际上是输入变量的线性组合。一旦得到了每个主成分解释的方差量,就可以基于想要保留的信息量来决定模型需要多少成分。主成分之间是不相关的。这些主成分被称为特征向量,每个特征向量解释的方差量被称为特征值。

from sklearn.decomposition import PCA from sklearn.preprocessing import RobustScaler rs = RobustScaler() scaled = pd.DataFrame(rs.fit_transform(data), columns=data.columns) scaled.head()

现在将使用PCA对缩放后的数据集进行处理。如果想要预定义数量的成分,可以使用PCA(n_components)来实现。

pca = PCA() pca.fit_transform(scaled.dropna()) print(pca.explained_variance_ratio_)

这里的输出是每个主成分解释的方差量。由于数据集中有18个属性,因此得到了18个主成分。请记住,第一个主成分总是包含最大的方差量。

现在有18个主成分,将尝试找出这些成分是如何受到每个属性影响的。可以检查第一个主成分对前3个属性(包括正负影响)的影响。以下是Python代码,用于获取主成分对属性的影响,通过改变特征和成分的数量。

def feature_weight(pca, n_comp, n_feat): comp = pd.DataFrame(np.round(pca.components_, 2), columns=scaled.columns).iloc[n_comp - 1] comp.sort_values(ascending=False, inplace=True) comp = pd.concat([comp.head(n_feat), comp.tail(n_feat)]) comp.plot(kind='bar', title='Top {} weighted attributes for PCA component {}'.format(n_feat, n_comp)) plt.show() return comp feature_weight(pca, 0, 3)

可以从这里解释,第一个主成分主要受到帖子参与度(如点赞、评论、展示和覆盖)的影响。同样,可以根据对数据的理解,使用上述图表解释其他主成分。

def screeplot(pca): var_len = len(pca.explained_variance_ratio_) indx = np.arange(var_len) var_pca = pca.explained_variance_ratio_ plt.figure(figsize=(14, 8)) ax = plt.subplot() cum_var = np.cumsum(var_pca) ax.bar(indx, var_pca) ax.plot(indx, cum_var) ax.set_xlabel("Principal Components") ax.set_ylabel("Percentage Variance Explained") plt.title('Cumulative Variance Explained by Principal Components') screeplot(pca)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485