缺失值的插补和分类值的处理

数据挖掘 Python scikit-学习 熊猫 分类数据 数据插补
2022-01-30 16:16:01

我有一个包含许多缺失值的数据集(1000 万行,55 列)。我需要以某种方式使用其他非缺失值来预测这些值,即将它们替换为非 NaN 的值。平均值和中位数不是这里的解决方案。

我试图为此研究其他方法,但由于我有很多分类变量,它们都不起作用。我还尝试使用一种热编码将分类变量转换为整数,但我不确定这是否是我的解决方案,因为只有 1 个分类列我会得到 600 个新列。如果我对其他分类列执行相同操作,我将获得数百万个新列。其中一个分类列是 URL 字符串,每一行都不同,因此我有 1000 万个不同的 URL。

另一个分类列是描述,每一行也不同。我可能会删除 URL 列,但我不能删除描述、标题、位置等。我尝试了 PCA,但它也不适用于分类数据。我缺少分类和整数/浮点值的数据。get_dummies 方法会是解决这个问题的好方法吗?对于缺失值插补,我尝试了 KNN 和最大似然,但由于分类变量而出现错误。缺失数据是完全随机缺失的。

你对如何解决这个问题以及我应该使用哪些包有什么建议吗?

2个回答

我认为就像@El Burro 建议的那样,您我认为您应该主要关注功能转换对不同的功能使用不同的技术。对于简单的特征,例如职业或性别,使用 one-hot 编码,而对于其他特征,您可以使用某种分层映射聚类(例如,将值映射到您定义的组,例如,如果这些 url 链接到产品,用相似类型的产品创建 30 个不同的组,并将 url 映射到这些组。然后您可以再次对这些映射的特征使用 one-hot 编码)。

对于您提到的文本功能,我非常有信心您可以放弃其中的一些。如果你真的想利用从文本生成的某种信息,对于初学者来说,你可以做一些tf-idf 特征提取,以便为每个文本片段生成特征或考虑主题建模(看看gensim for python如果感兴趣)并将每个文本表示为主题的混合。

我在使用的一个数据集中遇到了同样的问题,答案是更多地关注特征转换。如果您只是简单地包含数据集的所有特征进行编码,您最终可能会得到比行更多的列!

我很肯定您的数据集中可能有许多特征可以归为一列,由于多重共线性可能会删除一些特征(但我建议您也使用其他特征选择技术仔细检查)。

1.) 主要是尽量减少特征的数量(特征转换)而不丢弃任何特征。2.) 尝试估算 nan 值,然后找到数值特征的多重共线性。3.) 如果一个特征包含超过 95% 的 nan 值,最好放弃它,因为插补会降低性能4.) 方差也是如此。如果一个特性有超过 95%的值是相同的(例如,如果我的燃料特性有 98 个汽油值和 2 个柴油值,我会放弃该特性,因为它不会有太大贡献)。在 sklearns 网站上搜索VarianceThreshold以获取文档。

还有更多技术,我相信以上所有方法都会减少你的特征数量,从而减少你的维度。