SKLearn PCA Explained_variance_ration cumsum 给出 1 的数组

数据挖掘 Python scikit-学习 主成分分析 数据分析 方差
2022-03-14 21:25:06

我有 PCA 的问题。我读到 PCA 需要干净的数值。trainDf我从一个名为shape的数据集开始我的分析(1460, 79)

我通过删除空值、插补和删除列来进行数据清理和处理,我得到了一个transformedDatashape的数据框(1458, 69)

数据清洗步骤为:

  1. LotFrontage用平均值估算
  2. MasVnrArea用 0 估算(小于 10 列)
  3. 分类列的序号编码
  4. Electrical以最频繁的值估算

我发现了 IQR 的异常值并得到withoutOutliers了 shape (1223, 69)

在此之后,我查看了直方图并决定将其应用于PowerTransformer某些特征和StandardScaler其他特征,然后我得到了normalizedData.

现在我尝试做 PCA,我得到了这个:

pca = PCA().fit(transformedData)

print(pca.explained_variance_ratio_.cumsum())

plt.plot(pca.explained_variance_ratio_.cumsum())
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')

此 PCA 的输出如下:

[0.67454179 0.8541084  0.98180307 0.99979932 0.99986346 0.9999237
 0.99997091 0.99997985 0.99998547 0.99999044 0.99999463 0.99999719
 0.99999791 0.99999854 0.99999909 0.99999961 0.99999977 0.99999988
 0.99999994 0.99999998 0.99999999 1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.        ]

PCA1

然后我尝试了:

pca = PCA().fit(withoutOutliers)

print(pca.explained_variance_ratio_.cumsum())

plt.plot(pca.explained_variance_ratio_.cumsum())
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')

出去:

[0.68447278 0.86982875 0.99806386 0.99983727 0.99989606 0.99994353
 0.99997769 0.99998454 0.99998928 0.99999299 0.9999958  0.99999775
 0.99999842 0.99999894 0.99999932 0.99999963 0.9999998  0.9999999
 0.99999994 0.99999998 0.99999999 1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.        ]

PCA2

最后:

pca = PCA().fit(normalizedData)

print(pca.explained_variance_ratio_.cumsum())

plt.plot(pca.explained_variance_ratio_.cumsum())
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')

出去:

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

PCA3

最后一次执行怎么可能给出这样的输出?

以下是数据分布

transformedData

转换数据历史

withoutOutliers

无异常值历史

normalizedData

归一化数据历史

如有必要,我将添加任何进一步的数据,提前感谢任何可以提供帮助的人!

1个回答

对于PCA,使用标准化将所有(!)特征放在同一尺度上非常重要,例如使用standard.scaler,即具有均值 0 和标准偏差 1。

另请参阅帖子。

原因是 PCA 着眼于由不同特征解释的方差。因此,为了使特征具有可比性,需要标准化。