在要素向量

时间:2015-09-04 22:52:37

标签: python r machine-learning missing-data

已修改帖子

这是原帖的简短版本。

  1. 我们有一个训练数据集(某些功能显着相关)。特征空间有20个维度(全部是连续的)。
  2. 我们需要使用训练数据训练非参数(大多数特征形成非线性子空间,我们不能假设其中任何一个的分布)imputer(kNN或基于树的回归)。
  3. 我们需要使用经过培训的imputer预测查询数据中的多个缺失值(查询特征向量最多可以有13个缺失的特征,因此计算机应该处理缺失特征的任意组合)。 注意不应该使用查询数据对imputer进行任何重新训练/拟合(就像我在目前为止找到的所有主流R包中所做的那样:Amelia,{{ 1}},imputemi ...)。那就是归因应该完全基于训练数据。
  4. 所有这些的目的如下所述。
  5. 下面是一个小数据样本。
  6. 原帖(TL; DR)

    简单地说,我已经得到了一些复杂的数据。我们获得了大约100k 20D样本和较小测试数据集的训练数据集。每个要素/维度都是连续变量,但比例不同。有两个不同的类。两个数据集都是非常NA膨胀的(NAs在维度上不是均匀分布的)。我使用mice进行分类,虽然树集合可以处理丢失的数据案例,但执行插补有三个原因

    1. 通过这种方式,我们可以在查询数据集的分类过程中从森林中的所有树中获得投票(不仅仅是那些没有缺少功能/特征的投票)。
    2. 我们在培训期间不会丢失数据。
    3. sklearn.ensemble.ExtraTreesClassifier树集合(scikitExtraTrees)的实现不处理缺失值。但这一点并不重要。如果不是前两个,我会使用RandomForest +一些不错的R实现。
    4. 训练数据集的情况非常简单,因为我可以应用特定于类的中位插补策略​​来处理缺失值,这种方法到目前为止一直运行良好。显然,这种方法不能应用于查询 - 我们不会开始使用这些类。由于我们知道类可能在查询中具有显着不同的份额,因此我们无法应用类无关紧要的方法,因为这可能会引入偏差并降低分类性能,因此我们需要从模型中计算缺失值。

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

      1. 所有特征在某种程度上都是相关的;
      2. 理论上我们可以在样本特征向量中获得所有可能的缺失特征组合,即使我们的工具需要至少7个非缺失特征,我们最终得到~1 ^ E6个可能的模型,这看起来并不像如果你问我,非常优雅。
      3. 基于树的回归模型出于同样的原因并不好。因此我们最终选择kNN(k个最近邻居),球树或具有半径阈值的LSH更具体。这种方法非常适合这项任务,因为维度(ergo距离)是相关的,因此我们在极其NA的情况下获得了良好的性能,但有几个缺点:

        1. 我还没有找到Python中的单个实现(包括rpy2imputesklearn.preprocessing.Imputer)来处理具有不同缺失值集的特征向量,即我们希望只有一个imputer用于所有可能的缺失功能组合。
        2. kNN使用成对点距离进行预测/插补。正如我已经提到的,我们的变量具有不同的尺度,因此在距离估计之前必须对特征空间进行归一化。我们需要知道每个维度的理论最大/最小值才能正确地进行缩放。这不是一个问题,因为这是一个建筑简单的问题(用户必须提供最小/最大值的向量)。
        3. 所以我希望听到您的意见:

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

            以下是训练数据集的一小部分示例。我减少了功能的数量,使其更具可读性。查询数据具有相同的结构,除了明显缺少orange信息。

            category

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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