具有 200 个特征的 DataFrame 上的 PCA 结果异常高

Posted

技术标签:

【中文标题】具有 200 个特征的 DataFrame 上的 PCA 结果异常高【英文标题】:Unusually high PCA result on DataFrame with 200 features 【发布时间】:2018-01-16 14:21:08 【问题描述】:

我在具有 200 个特征的数据帧上使用 sklearn 中包含的 PCA() 实现。此数据框是使用以下代码创建的:

df = data.pivot_table(index='customer', columns='purchase', values='amount', aggfunc=sum)
df = df.reset_index().rename_axis(None, axis=1)
df = df.fillna(value=0)

然后,我实现了PCA()

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA

pca = PCA(n_components=1)
p = pca.fit(df)
sum(pca.explained_variance_ratio_)

最后,我得到了如下所示的结果:

0.99999940944358268

我错了,或者当组件的数量设置为 200 中的 1 时,这个结果通常是不合逻辑的?


更多问题

简而言之,我的数据实际上只倾向于一个特征吗? 可能是什么原因造成的? 在运行 PCA 之前对每个客户的特征值求和会影响这一点吗? 我应该如何重组我的数据来克服这个看似错误的问题?

【问题讨论】:

***.com/questions/22984335/…。我认为这是参考您所拥有的东西的好地方,这将使您对 PCA 有一个很好的了解。 谢谢!绝对是一个内容丰富的问题​​——我学到了很多。我还注意到我没有首先规范化/缩放数据(一个好主意)或在拟合模型后进行转换(我假设,必须?)。 是的,您必须使用 preprocessing 标准化数据,这是 scikit-learn 中许多机器学习估计器的要求。我讨厌复制和粘贴,希望你能找到你需要的东西。 【参考方案1】:

您应该在以下来源中阅读有关主成分分析的更多信息:

Explained Variance Ration on One Principal Component Eigenvectors & Eigenvalues Everything about PCA

当组件的数量设置为 200 个中的 1 个时,这个结果是否实用通常是不合逻辑的?

可以通过解释方差接近于零的方式调整具有大量特征的数据。为了实现这一点,特征之间必须高度相关。在您的情况下,我可能会假设两种情况:

要么有很多缺失值,因为你用零填充它们(不是最先进的方法),这会为更高的关系创造一个位置; 要么您的数据真的高度相关,所以PCA() 很好地聚合了 功能中的 200 个功能的信息。 要么你的数据有问题。

简而言之,我的数据实际上只倾向于一个特征吗?

这可能是什么原因造成的?

如上所述,PCA 不适用于原始功能,因为它会创建新功能,从数据中汇总尽可能多的信息。因此,它实际上并不倾向于一个默认功能。

我建议您执行一些数据预处理,因为大约 99% 的解释方差比具有 1 个特征看起来非常可疑。这可能是由上述陈述引起的。

在运行 PCA 之前对每个客户的特征值求和会影响这一点吗?

任何数据操作都会影响分解,除了某些情况,例如将相同的正整数添加到一组正整数等等。您应该在求和运算前后对您的数据应用PCA 以观察效果。

我应该如何重组我的数据来克服这个看似错误的问题?

首先,我会建议另一种方法来完成数据。您可以使用平均值或中位数逐列插入缺失值。其次,您应该了解特征的实际含义以及是否可以在分解之前删除其中的一些。您还可以实现缩放技术和/或标准化技术。但是这些通常应该在模型拟合之前和之后进行测试,因为它们也会影响模型指标。

【讨论】:

非常感谢您详尽的回答。我绝对需要阅读/学习更多。关于缺失值的一个快速问题 - 你的意思是只为每一列输入平均值或中位数吗?我觉得 0 是最准确的填充物,因为数据是在特定项目上花费的金额。所以如果一个顾客买了面包但没有买牛奶,我想她的牛奶价值应该是零。因此,我的数据中有很多零,因为每个客户只从 200 个可能的选项中购买了一些东西。 嗯,好的。那可以工作。但是,如果每个客户都缺少某些值,则应该完全删除它们。想象一下,没有人买过牛奶,所以牛奶应该从你的DataFrame 中删除。或者您也可以聚合产品并创建食品类别,即。 e.日记类等等。基本上,在应用分解之前减少数据的维数是可以的,只要你在逻辑上这样做。 有道理-谢谢!在这种特定情况下,除非至少一个样本具有相应的值,否则不会出现特征。分组是我要研究的东西。删除基于 % null(即 90%)的特征也是一种有效的方法吗? 这取决于您拥有的客户数量。如果您仍有大量数据需要训练,90% 可能没问题。您应该根据这一事实校准阈值。

以上是关于具有 200 个特征的 DataFrame 上的 PCA 结果异常高的主要内容,如果未能解决你的问题,请参考以下文章

具有大量特征的 pyspark PCA

以数字方式编码 Dataframe 特征

Python 上的 SVM:特征选择之后

OpenCV 例程200篇227. 特征描述之 LBP 纹理特征算子

OpenCV 例程200篇227. 特征描述之 LBP 纹理特征算子

具有特征名称的 OneHot 向量