【问题标题】:Impute multiple missing values in a feature-vector在特征向量中估算多个缺失值
【发布时间】:2015-12-01 04:14:35
【问题描述】:

已编辑帖子

这是原始帖子的简短且有些明确的版本。

  1. 我们有一个训练数据集(一些特征显着相关)。特征空间有 20 个维度(都是连续的)。
  2. 我们需要使用训练数据训练非参数(大多数特征形成非线性子空间,我们不能假设其中任何一个的分布)估算器(kNN 或基于树的回归)。
  3. 我们需要使用经过训练的 imputer 预测查询数据中的多个缺失值(一个查询特征向量最多可以有 13 个缺失特征,因此 imputer 应该处理缺失特征的任何组合)。 注意不应使用查询数据以任何方式重新训练/拟合 imputer(就像我目前在所有主流 R 包中所做的那样:Ameliaimpute、@987654325 @ 和 mice...)。也就是说,估算应仅基于训练数据。
  4. 所有这些的目的如下所述。
  5. 下方有一个小数据样本。

原帖 (TL;DR)

简单地说,我有一些复杂的数据插补要做。我们有一个约 100k 20D 样本的训练数据集和一个较小的测试数据集。每个特征/维度都是一个连续变量,但尺度不同。有两个不同的类。两个数据集都非常 NA 膨胀(NA 在维度上分布不均)。我使用sklearn.ensemble.ExtraTreesClassifier 进行分类,虽然树集合可以处理缺失数据的情况,但执行插补的原因有三个

  1. 通过这种方式,我们可以在查询数据集的分类过程中从森林中的所有树(不仅仅是那些没有缺失特征的树)中获得投票。
  2. 我们不会在训练期间丢失数据。
  3. scikit 实现树集合(ExtraTreesRandomForest)不处理缺失值。但这一点并不是那么重要。如果不是前两者,我会使用 rpy2 + 一些不错的 R 实现。

训练数据集的事情非常简单,因为我可以应用特定于类的中值插补策略来处理缺失值,并且这种方法到目前为止运行良好。显然,这种方法不能应用于查询——我们没有开始的类。由于我们知道类在查询中可能具有显着不同的份额,我们不能应用类无关方法,因为这可能会引入偏差并降低分类性能,因此我们需要从模型中估算缺失值。

线性模型不是一种选择,原因如下:

  1. 所有特征都有一定的相关性;
  2. 理论上,我们可以在样本特征向量中获得所有可能的缺失特征组合,即使我们的工具需要至少 7 个非缺失特征,我们最终会得到 ~1^E6 个可能的模型,这看起来不太优雅如果你问我。

出于同样的原因,基于树的回归模型也不好。因此,我们最终选择了 kNN(k 最近邻)、球树或具有半径阈值的 LSH 以更具体。这种方法非常适合该任务,因为维度(ergo 距离)是相关的,因此我们在极度 NA 丰富的情况下获得了不错的性能,但也有几个缺点:

  1. 我还没有在 Python 中找到一个单独的实现(包括imputesklearn.preprocessing.Imputerorange)来处理具有不同缺失值集的特征向量,也就是说,我们希望对所有人都只有一个 imputer缺失特征的可能组合。
  2. kNN 使用成对点距离进行预测/插补。正如我已经提到的,我们的变量具有不同的尺度,因此必须在距离估计之前对特征空间进行归一化。我们需要知道每个维度的理论最大值/最小值才能正确缩放。这不是什么大问题,因为它是一个架构简单的问题(用户必须提供一个最小/最大值的向量)。

所以我想听听你的意见:

  1. 是否有任何经典的方法来解决上面列表中给出的与 kNN 相关的问题?我相信这一定是一个常见的案例,但我还没有在网上找到任何具体的内容。
  2. 在我们的案例中是否有更好的方法来估算数据?你会推荐什么?请提供 Python 中的实现(R 和 C/C++ 也可以考虑)。

数据

这是训练数据集的一个小样本。我减少了功能的数量以使其更具可读性。查询数据具有相同的结构,只是明显缺少category 信息。

v1  v2  v3  v4  v5  category
0.40524 0.71542 NA  0.81033 0.8209  1
0.78421 0.76378 0.84324 0.58814 0.9348  2
0.30055 NA  0.84324 NA  0.60003 1
0.34754 0.25277 0.18861 0.28937 0.41394 1
NA  0.71542 0.10333 0.41448 0.07377 1
0.40019 0.02634 0.20924 NA  0.85404 2
0.56404 0.5481  0.51284 0.39956 0.95957 2
0.07758 0.40959 0.33802 0.27802 0.35396 1
0.91219 0.89865 0.84324 0.81033 0.99243 1
0.91219 NA  NA  0.81033 0.95988 2
0.5463  0.89865 0.84324 0.81033 NA  2
0.00963 0.06737 0.03719 0.08979 0.57746 2
0.59875 0.89865 0.84324 0.50834 0.98906 1
0.72092 NA  0.49118 0.58814 0.77973 2
0.06389 NA  0.22424 0.08979 0.7556  2

【问题讨论】:

  • 未处理的缺失值似乎是问题的主要原因。您能否阐明使用 R 实现(即对缺失值 IIRC 进行插补)将如何“在训练期间丢失数据”?
  • 1.您引用的语句是指 Python 实现(首选 Python 解决方案) 2. 重点是在测试/查询数据中估算多个缺失值,因此 R 实现在训练期间执行估算这一事实无关紧要。
  • 请参阅How to AskHow to make a reproducible example。我已经编辑过,试图让这个更消化一点,但是对于我认为不在你的分支中工作的人来说,它仍然很长并且不清楚
  • 您能否详细解释一下您的数据的性质以及您希望如何对其进行分类?归责可能不是要走的路。你愿意接受不是 kNN 的算法建议吗?
  • 很抱歉这么晚才更新。希望问题现在很清楚。

标签: python r machine-learning missing-data


【解决方案1】:

基于新的更新,我认为我会在此处推荐反对 kNN 或基于树的算法。由于插补是目标,而不是您选择的方法的结果,因此您需要一种能够学习完成不完整数据的算法。

对我来说,这似乎非常适合使用去噪自动编码器。如果您熟悉神经网络,则基本原理相同。您无需训练来预测标签,而是训练模型以显着扭曲来预测输入数据。

“去噪”部分是指中间步骤,您在尝试预测之前将输入数据的某些百分比随机设置为 0。这迫使算法学习更丰富的特征,以及当有缺失的部分时如何完成数据。在您的情况下,我建议在训练中减少少量辍学(因为您的数据已经缺少特征)并且在测试中没有辍学。

如果不先查看数据就很难编写有用的示例,但此处介绍了自动编码器的基本功能(以及完整的代码实现):http://deeplearning.net/tutorial/dA.html

这个链接使用了一个名为 Theano 的 Python 模块,我强烈推荐它来完成这项工作。该模块的灵活性胜过我为机器学习研究过的所有其他模块,而且我看过很多。这不是最容易学习的东西,但如果你要做很多这样的事情,我会说这是值得的。如果您不想经历所有这些,那么您仍然可以在没有它的情况下在 Python 中实现去噪自动编码器。

【讨论】:

  • 非常感谢您的回答。我添加了一个数据样本。也许它也会帮助你提供一些额外的建议。我曾经相信基于树的回归器会学习替换缺失的数据。
  • 感谢您添加数据样本。这证实了我的直觉,即去噪自动编码器非常适合。我感觉您正在寻找要参考的代码示例,而 Theano 链接还不够。您是在寻找更纯 Python 的示例,还是希望使用 Theano 实现?
  • 很高兴它有帮助。如果你被神经网络的东西或一般的 Theano 编码困住了,这个视频真的很棒:youtube.com/watch?v=S75EdAcXHKk它的所有代码都在 github 上。我一直引用它:github.com/Newmu/Theano-tutorials
猜你喜欢
  • 2014-04-12
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多