Scikit 学习缺失数据 - 分类值

数据挖掘 预测建模 scikit-学习 分类数据 多类分类 缺失数据
2021-09-23 13:42:12

我有一个包含分类特征的数据集,它有 4 个标签和 4 个特征。(它是一个元分类器,所以基分类器的输出作为这个分类器的输入)

Label  Feat1 Feat2 Feat3 Feat4
 1      1     1      2     2
 2      3     1      2     2 
 3      4     3      3     1     
 4      4     1      2     4

我正在使用 scikit learn,并且正在考虑使用朴素贝叶斯或决策树。分类器需要能够处理缺失的特征,我在 scikit learn 的页面上读到决策树不支持缺失值。

我正在寻找的是关于如何在使用 scikit learn 时处理缺失的分类值的建议。此外,任何指向解决此问题的学术论文的链接将不胜感激。

4个回答

我们需要更多关于预测问题和特征的信息才能给出更精确的信息。

无论如何,我很惊讶到目前为止没有答案包括所有可能的选项,因为它们并不多:

  1. 摆脱不完整的观察或特征——显然,只有在不完整的情况下才可行,否则你会丢失太多信息
  2. 用 -1 之类的值替换NA——这取决于您使用的分类器;例如,如果您的分类器支持分类变量,您可以为这些 NA 创建一个新类别。在一些连续变量中,有时会有一些有意义的值(例如,在文本挖掘分类中,如果你有一个title-length特征但你没有标题,用 替换可能是有意义的title-length=0
  3. 填补缺失的数据

最后一点包含了太多的东西:

  1. 用中位数替换 NA(这是通常的惰性方法;sklearn有一个类
  2. 如果是时间序列,则替换为前后值的平均值——在 pandas 中,这可以使用DataFrame.resample()来完成。
  3. 使用 k最近的邻居。使用其他变量构建 KNN 模型,然后对这些邻居进行平均(如果您使用欧几里德距离,您可能应该首先进行归一化)。我从未见过这样做过,但您可能也可以尝试使用其他模型来预测丢失的 NA。

但这一切在很大程度上取决于你在做什么。例如,如果您已经执行了聚类分析并且您知道您的数据是由聚类组成的,那么您可以使用每个聚类中的中值。

其他解决方案可能包括多模式或多视图模型等。这些是可以处理缺失模态的最新技术,您可以将一个特征或特征子集视为一种模态。例如,您可以为您的各种特征子集构建不同的分类器(使用每个子集中的完整案例),然后在此之上构建另一个分类器以合并这些概率。如果您的大部分数据丢失,我只会尝试这些技术。使用自动编码器有更高级的深度学习版本。

在我看来,处理丢失的数据总是更好,而不是依靠分类器。

有很多方法可以处理它:

  • 删除缺失的观察
  • 删除该行中所有单元格为 NA 的行
  • 用任意一个随机标签填充缺失数据
  • 以缺失属性的最大频率填充标签

PS:我建议使用 python pandas 库进行数据清理。

我不会使用中位数填充缺失的分类值,而是使用该模式。这样做,即使您的模态是字符串,您也一定会填充现有的模态。根据缺失值背后的过程,正如 Ricardo Cruz 所说,您还可以为缺失值添加一种新模式

在实际构建模型并在其上应用一些算法之前执行数据清理始终是一个好习惯。为了像处理缺失值一样进行数据清理,“pandas”库是非常受欢迎的。这是“pandas”最新版本的链接,以及 pandas“处理缺失值”参考的链接。