Eli*_*igo 4 python r machine-learning missing-data
编辑过的帖子
这是原帖的简短版本.
Amelia,impute,mi和mice...).这就是归因应该完全基于训练数据.原帖(TL; DR)
简而言之,我有一些复杂的数据可以做.我们有一个~100k 20D样本的训练数据集和一个较小的测试数据集.每个要素/维度都是连续变量,但比例不同.有两个不同的类.两个数据集都是非常NA膨胀的(NAs在维度上不是均匀分布的).我sklearn.ensemble.ExtraTreesClassifier用于分类,虽然树集合可以处理丢失的数据案例,但有三个理由可以进行估算
scikit树集合(都ExtraTrees和RandomForest)的实现不处理缺失值.但这一点并不重要.如果它不是前两个我会使用rpy2+一些不错的R实现.训练数据集的情况非常简单,因为我可以应用特定于类的中位插补策略来处理缺失值,这种方法到目前为止一直运行良好.显然,这种方法不能应用于查询 - 我们没有开始的类.由于我们知道类可能在查询中具有显着不同的份额,因此我们无法应用类无关紧要的方法,因为这可能会引入偏差并降低分类性能,因此我们需要从模型中计算缺失值.
由于以下几个原因,线性模型不是一种选择:
基于树的回归模型出于同样的原因并不好.因此我们最终选择kNN(k个最近邻居),球树或具有半径阈值的LSH更具体.这种方法非常适合这项任务,因为维度(ergo距离)是相关的,因此我们在极其NA的情况下获得了良好的性能,但有几个缺点:
impute,sklearn.preprocessing.Imputer,orange),处理功能的载体配合多套不同缺失值的,这是我们希望有一个只为缺失的功能所有可能的组合imputer.以下是我想听到您的意见:
数据
以下是训练数据集的一小部分示例.我减少了功能的数量,使其更具可读性.查询数据具有相同的结构,除了明显缺少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中实现去噪自动编码器.