SKLearn PCA explained_variance_ration cumsum 给出数组 1

SKLearn PCA explained_variance_ration cumsum gives array of 1

我对 PCA 有疑问。我读到 PCA 需要干净的数值。我从一个名为 trainDf 且形状为 (1460, 79).

的数据集开始我的分析

我通过删除空值、输入和删除列来清理和处理数据,我得到了一个数据框 transformedData,形状为 (1458, 69)

数据清理步骤为:

  1. LotFrontage 用平均值进行插补
  2. MasVnrArea 以 0 进行插补(少于 10 列)
  3. 分类列的顺序编码
  4. Electrical 使用最频繁的值进行插补

我发现了具有 IQR 的异常值并得到了 withoutOutliers 形状 (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.        ]

然后我尝试了:

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.        ]

最后:

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.]

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

这里是数据分布

transformedData

withoutOutliers

normalizedData

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

简而言之,在应用 PCA 之前应缩放所有数据(例如使用 StandardScaler)。

我在 Data science stackexchange 上得到了答案。