在特征向量中计算多个缺失值

Eli*_*igo 4 python r machine-learning missing-data

编辑过的帖子

这是原帖的简短版本.

  1. 我们有一个训练数据集(一些特征显着相关).特征空间有20个维度(全部是连续的).
  2. 我们需要使用训练数据训练非参数(大多数特征形成非线性子空间,我们不能假设其中任何一个的分布)imputer(kNN或基于树的回归).
  3. 我们需要使用训练过的计算机预测查询数据中的多个缺失值(查询特征向量最多可以有13个缺失的特征,因此计算机应该处理缺失特征的任何组合).注:该imputer不应该在任何重新训练方式/安装使用查询数据(就像是在目前为止,我发现所有的主流R封装完成的:Amelia,impute,mimice...).这就是归因应该完全基于训练数据.
  4. 所有这些的目的描述如下.
  5. 下面是一个小数据样本.

原帖(TL; DR)

简而言之,我有一些复杂的数据可以做.我们有一个~100k 20D样本的训练数据集和一个较小的测试数据集.每个要素/维度都是连续变量,但比例不同.有两个不同的类.两个数据集都是非常NA膨胀的(NAs在维度上不是均匀分布的).我sklearn.ensemble.ExtraTreesClassifier用于分类,虽然树集合可以处理丢失的数据案例,但有三个理由可以进行估算

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

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

由于以下几个原因,线性模型不是一种选择:

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

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

  1. 我还没有发现在Python单个实现(包括impute,sklearn.preprocessing.Imputer,orange),处理功能的载体配合多套不同缺失值的,这是我们希望有一个只为缺失的功能所有可能的组合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
Run Code Online (Sandbox Code Playgroud)

小智 5

根据新的更新,我想我会建议在这里反对kNN或基于树的算法.由于插补是目标而不是您选择的方法的结果,因此您需要一种能够学习完成不完整数据的算法.

对我来说,这似乎非常适合使用去噪自动编码器.如果您熟悉神经网络,它的基本原理是相同的.您可以训练模型来预测输入数据,而不是训练预测标签.

"去噪"部分指的是一个中间步骤,您可以在尝试预测之前将输入数据的某个百分比随机设置为0.这会强制算法学习更丰富的功能以及如何在缺少部分时完成数据.在您的情况下,我建议在培训中少量退出(因为您的数据已经缺少功能)并且测试中没有丢失.

如果不首先查看您的数据,就很难编写一个有用的示例,但是这里介绍了自动编码器的基本知识(以及完整的代码实现):http://deeplearning.net/tutorial/dA.html

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