如何处理插补没有意义的 NaN 值? (对于 PCA)

Posted

技术标签:

【中文标题】如何处理插补没有意义的 NaN 值? (对于 PCA)【英文标题】:How to deal with NaN values where imputation doesn't make sense? (for PCA) 【发布时间】:2019-08-24 16:22:55 【问题描述】:

我很难弄清楚如何处理数据插补没有意义的 NaN 变量。我正在尝试进行文本/文档聚类,并且有一些缺失值需要保持缺失,因为没有明智的方法来填充它们。我的数据集包含一些数值、日期、文本等。实际上DannyDannyDanny 的example 在副标题“当插补没有意义时考虑情况”下。是我的问题的一个很好的例子。在矢量化之后,我需要执行 PCA 来降低维度,这样我就可以在没有内存错误的情况下处理大数据并减少计算时间。这就是问题开始的地方,因为 scikit-learn 的 PCA 算法都不能处理 NaN(或者它们可以吗?)。用 sklearn.preprocessing.Imputer 填充缺失值是没有意义的,因为;

-并非所有这些都是数字或连续值。事实上,有一些列有日期和没有日期!

-其中一些必须保持为 NaN,否则它们可能(或可能?)对聚类产生不良影响。

而且我不能仅仅因为几个缺失值而简单地删除列(或行)。太松了... 我的问题是:

    如何处理不影响聚类结果的 NaN 值? (合理的数据插补或其他...) 有没有可以在python中处理NaN值的PCA算法?

PS:对不起我的英语不好

【问题讨论】:

【参考方案1】:

直观地说,如果您不能使用不同的方法进行估算,或者它没有意义,那么您将删除这些行 -> 但需要注意的是,您可能最终得到的行数不多,具体取决于您的数据。这仅在您拥有一个非常好的数据集且 NaN 百分比非常低时才有效。

另一种方法是删除具有非常高 NaN 的列,此时它们对模型并不是很有用。

您可以研究的最后一种方法是用不在该列范围内的极端值填充这些值,例如“-9999”之类的唯一标识符或您喜欢的东西。这主要是允许算法拾取异常值,而不是将其纳入模型。

希望这会有所帮助!

【讨论】:

【参考方案2】:

没有。

PCA 意味着基本上每个输出变量都在某种程度上依赖于每个输入变量。所以投影后,整个向量会变成NaN。直观地说,缺失值(您不能归为 0)意味着您可以在某个方向上任意移动您的点。但是因为您仍然可以移动该点,所以您不知道它在任何坐标中的位置 - 它可能在任何地方。

PCA 在低维连续数据上最有意义。您对数据的描述听起来好像 PCA 不适合在这里使用。

【讨论】:

很好的解释。我也在想同样的事情。愚蠢的我,无法考虑用 codingenthusiast 建议的唯一标识符填充这些 NaN 值。但是他/她/[fillhere] 的解决方案仍然取决于聚类模型的性能。这就是为什么我仍然对填充 NaN 有一些疑问。 @编码爱好者

以上是关于如何处理插补没有意义的 NaN 值? (对于 PCA)的主要内容,如果未能解决你的问题,请参考以下文章

单元无回答的缺失数据处理方法

如何处理 Python 中应该缺失的缺失值(不应插入 NaN)?

scikit学习除NaN以外的插补值

写入期望类型不是浮点数的数据库时如何处理 NaN 值?

棘手的条件插补,理想情况下使用 Tidyverse

scipy.minimize 如何处理 NaN?