如果子集中的任何值丢失,如何填充丢失的数字,具有相同子集的所有其他列都丢失

数据挖掘 机器学习 相关性 数据插补
2022-02-13 11:42:02

有一个清晰的模式显示两个单独的子集(列集);如果一列中缺少一个值,则同一子集中的其他列的值对于任何行都将丢失。

这是缺失数据的可视化

在此处输入图像描述

到目前为止,我一直在尝试使用 ycimpute 库来学习其他值,并应用了 Iterforest。

我注意到,Logistic 回归的分数太弱了(0.6),并且认为 Iterforest 可能学得不够,或者无论如何,除了外部子集可能还不够?例如,具有 11 列的子集可能会从其他列中学习,但不能从其成员中学习,具有四列的子集也是如此。

此条形图显示更好的缺失数量

在此处输入图像描述

所以当然,处理缺失比删除行更好,因为它会影响我的预测,它确实包含相对相同的缺失数量。

有没有更好的方法来处理这些?

[编辑] 确认无效模式:

在此处输入图像描述

2个回答

你应该尝试所有的:

  • 使用可以处理缺失数据的分类器。决策树可以处理输入和输出中缺失的特征。Try xgboost,这对 kaggle 比赛的获胜者很有帮助。看到这个答案

  • 现成的插补程序

  • 编写您自己的自定义插补例程(此选项可能会让您获得最佳性能)

  • 给定您的缺失值模式,将问题分成四个部分并为每个部分学习分类器。

用于插补的自定义例程

让我们将您的列集称为 A、B、C 和 D。

查看MICE的这个解释,它似乎受益于缺失值的随机模式。在您的情况下,链式方程只会采用一种方式,并且像 MICE 中的重复迭代可能无济于事。但是您的缺失值的高度规则性可能会使您自己的 MICE 变体更容易实现。

  • 使用集合 A 中的行来填充 B。您可以将其写为矩阵问题XW=Z,X是填充的行AB,Z是填充的行AB. 这两组不相交,因为BA,这涵盖了所有行。学习W, 交叉验证并用它来估算 B.

  • 使用 A 和 B 估算 C。

    • 你在 A 上双标,但我认为这不是一个整体的问题。A中的任何错误都会对结果产生双倍的影响。
  • 使用 A,B,C 估算 D。

使用估算值与 A、B、C、D 一起学习。与 MICE 不同,您的误差不会对所有估算值都相等,因此您可能希望通过使用具有不同权重的四个数据集来抵消 A 引起的误差。“带有 A 的行都是原始数据,因此它的权重更高”。“带有 B 的行会受到少量惩罚,因为我的数据较少。”

这四个权重将由另一个“堆叠”分类器学习,类似于下一节。

堆叠分类器

插补的一个可能缺点是插补可能不准确,最终在不同的数据点上会有不同的错误。所以,跳过插补,只做预测。

不是按照填充最多到填充最少的顺序对列进行排序,而是按以下顺序对行(即数据点)进行排序:最多列到最少列。

然后你有四组数据。为每个分类器训练一个分类器,一个使用所有数据但使用较少特征的分类器,然后一个使用更多特征但较少数据的分类器,直到最后一个使用最多特征但使用最少数据的分类器。哪个是最好的?更多数据或更多功能。这是基于您的数据集的经验答案

得到四个分类器后,将它们与顶部的另一个线性分类器(“堆叠”分类器)结合起来。它可能决定给具有最多特征的分类器或具有最多数据的分类器赋予更多权重,我们将看到(我打赌大多数数据)。但是,您正在以最佳方式使用所有功能和所有数据。我认为这至少应该是一个合理的基线。

您也可以尝试链接它们,从使用(最少数据,最多功能)的最后一个分类器开始。下一个分类器使用更多的数据但更少的特征。对于某些(常见)数据,它有一个新特征,如果数据点是“新的”,则为 0,并且y0如果它来自旧集。

有三种集成方法,Bagging 随机采样较少的数据来训练分类器(有助于处理非常嘈杂的数据并提供较低的方差),随机森林等方法随机丢弃列,以及提升哪些链学习。您预测值(使用任何东西,包括 Bagging 和随机森林),然后训练另一个模型(上述类型)来预测残差等等。

您可以查找这些文献,但老实说,这四个分类器(最大数据,最小特征),...,(最小数据,最大特征)可以使用任何库轻松生成。然后使用集成学习技术链接或堆叠分类器。

我通常使用鼠标来进行缺失数据插补。它依赖于链式方程并且表现非常好。它也有一个随机森林方法,但是输入 methods(mice) 你会发现一个可用选项列表,可以克服标准方法遇到的问题,例如逻辑回归技术。另一种选择是使用 caret 包中的 na.impute 选项。