主成分分析(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)