【发布时间】:2015-12-01 04:14:35
【问题描述】:
已编辑帖子
这是原始帖子的简短且有些明确的版本。
- 我们有一个训练数据集(一些特征显着相关)。特征空间有 20 个维度(都是连续的)。
- 我们需要使用训练数据训练非参数(大多数特征形成非线性子空间,我们不能假设其中任何一个的分布)估算器(kNN 或基于树的回归)。
- 我们需要使用经过训练的 imputer 预测查询数据中的多个缺失值(一个查询特征向量最多可以有 13 个缺失特征,因此 imputer 应该处理缺失特征的任何组合)。 注意不应使用查询数据以任何方式重新训练/拟合 imputer(就像我目前在所有主流 R 包中所做的那样:
Amelia、impute、@987654325 @ 和mice...)。也就是说,估算应仅基于训练数据。 - 所有这些的目的如下所述。
- 下方有一个小数据样本。
原帖 (TL;DR)
简单地说,我有一些复杂的数据插补要做。我们有一个约 100k 20D 样本的训练数据集和一个较小的测试数据集。每个特征/维度都是一个连续变量,但尺度不同。有两个不同的类。两个数据集都非常 NA 膨胀(NA 在维度上分布不均)。我使用sklearn.ensemble.ExtraTreesClassifier 进行分类,虽然树集合可以处理缺失数据的情况,但执行插补的原因有三个
- 通过这种方式,我们可以在查询数据集的分类过程中从森林中的所有树(不仅仅是那些没有缺失特征的树)中获得投票。
- 我们不会在训练期间丢失数据。
-
scikit实现树集合(ExtraTrees和RandomForest)不处理缺失值。但这一点并不是那么重要。如果不是前两者,我会使用rpy2+ 一些不错的 R 实现。
训练数据集的事情非常简单,因为我可以应用特定于类的中值插补策略来处理缺失值,并且这种方法到目前为止运行良好。显然,这种方法不能应用于查询——我们没有开始的类。由于我们知道类在查询中可能具有显着不同的份额,我们不能应用类无关方法,因为这可能会引入偏差并降低分类性能,因此我们需要从模型中估算缺失值。
线性模型不是一种选择,原因如下:
- 所有特征都有一定的相关性;
- 理论上,我们可以在样本特征向量中获得所有可能的缺失特征组合,即使我们的工具需要至少 7 个非缺失特征,我们最终会得到 ~1^E6 个可能的模型,这看起来不太优雅如果你问我。
出于同样的原因,基于树的回归模型也不好。因此,我们最终选择了 kNN(k 最近邻)、球树或具有半径阈值的 LSH 以更具体。这种方法非常适合该任务,因为维度(ergo 距离)是相关的,因此我们在极度 NA 丰富的情况下获得了不错的性能,但也有几个缺点:
- 我还没有在 Python 中找到一个单独的实现(包括
impute、sklearn.preprocessing.Imputer、orange)来处理具有不同缺失值集的特征向量,也就是说,我们希望对所有人都只有一个 imputer缺失特征的可能组合。 - kNN 使用成对点距离进行预测/插补。正如我已经提到的,我们的变量具有不同的尺度,因此必须在距离估计之前对特征空间进行归一化。我们需要知道每个维度的理论最大值/最小值才能正确缩放。这不是什么大问题,因为它是一个架构简单的问题(用户必须提供一个最小/最大值的向量)。
所以我想听听你的意见:
- 是否有任何经典的方法来解决上面列表中给出的与 kNN 相关的问题?我相信这一定是一个常见的案例,但我还没有在网上找到任何具体的内容。
- 在我们的案例中是否有更好的方法来估算数据?你会推荐什么?请提供 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 Ask 和How to make a reproducible example。我已经编辑过,试图让这个更消化一点,但是对于我认为不在你的分支中工作的人来说,它仍然很长并且不清楚
-
您能否详细解释一下您的数据的性质以及您希望如何对其进行分类?归责可能不是要走的路。你愿意接受不是 kNN 的算法建议吗?
-
很抱歉这么晚才更新。希望问题现在很清楚。
标签: python r machine-learning missing-data