在scikits机器学习中缺少值

时间:2012-02-20 17:56:08

标签: python machine-learning scikit-learn missing-data scikits

scikit-learn是否可能缺少值?他们应该如何代表?我找不到任何关于此的文件。

7 个答案:

答案 0 :(得分:29)

scikit-learn不支持缺少值。之前已经在邮件列表上讨论过这个问题,但没有尝试实际编写代码来处理它们。

无论你做什么,都不使用NaN来编码缺失值,因为许多算法拒绝处理包含NaN的样本。

上述答案已过时;最新版本的scikit-learn有一个类Imputer,它可以实现简单的每个功能缺失值插补。您可以为包含NaN的数组提供相应功能的平均值,中位数或模式。

答案 1 :(得分:15)

我希望我能提供一个简单的例子,但我发现RandomForestRegressor 优雅地处理NaN。添加NaN百分比越来越高的功能时性能会越来越差。具有“太多”NaN的特征被完全忽略,即使当nan表示非常有用的信息时也是如此。

这是因为算法永远不会在决策“isnan”或“ismissing”上创建拆分。如果该特征在该样本子集中具有单个NaN,则该算法将忽略树的特定级别的特征。但是,在树的较低级别,当样本量较小时,样本子集更有可能在特定要素的值中不具有NaN,并且可能在该要素上发生分割。

我尝试了各种插补技术来处理问题(用平均值/中位数替换,用不同的模型预测缺失值等),但结果是混合的。

相反,这是我的解决方案:用一个明显超出范围的值(如-1.0)替换NaN。这使树能够按照“未知值与已知值”的标准进行拆分。但是,使用这种超出范围的值会产生奇怪的副作用:当算法试图找到一个好的位置时,超出范围值的已知值可能会与超出范围的值混为一谈分开。例如,已知的0可能会被-1用于替换NaN的集合。因此,您的模型可能会发生变化,具体取决于您的超出范围值是否小于最小值,或者它是否大于最大值(它可能分别与最小值或最大值混为一谈)。这可能有助于或可能无助于该技术的推广,结果将取决于行为最小值或最大值样本与NaN值样本的相似程度。

答案 2 :(得分:12)

用平均值/中位数/其他数据替换缺失值可能无法解决问题,因为缺少该值的事实可能很重要。例如,在一项关于身体特征的调查中,如果受访者对于异常高或小而感到尴尬,他们可能不会放高。这意味着缺失值表明受访者异常高或小 - 与中值相反。

对于缺失值具有单独规则的模型,任何猜测缺失值的尝试都可能会降低模型的预测能力。

答案 3 :(得分:9)

在数据上运行 RandomForestRegressor 时遇到了非常类似的问题。 NA值的存在为预测抛出了“nan”。通过围绕几个讨论滚动,Breiman的文档分别为连续和分类数据推荐了两种解决方案。

  1. 计算列(功能)中的数据的中位数并使用 这(连续数据)
  2. 确定最常出现的类别并使用它 (分类数据)
  3. 根据Breiman的说法,算法的随机性和树的数量将允许校正而不会对预测的准确性产生太大影响。如果NA值的存在稀疏,我认为会出现这种情况,我认为包含许多NA值的特征很可能会产生影响。

答案 4 :(得分:3)

Orange是另一个python机器学习库,它有专门用于插补的设施。我没有机会使用它们,但可能很快,因为用零,平均值或中位数替换nan的简单方法都存在重大问题。

答案 5 :(得分:2)

我确实遇到过这个问题。在一个实际的案例中,我在R中找到了一个名为missForest的软件包,可以很好地处理这个问题,从而减少了缺失值并大大增强了我的预测。

missForest不是简单地用中位数或均值替换NA,而是用它认为缺失值的预测来代替它们。它使用随机森林进行预测,对数据矩阵的观测值进行训练。它在包含大量缺失值的大型数据集上运行速度非常慢。所以这种方法需要权衡。

python中的类似选项是predictive_imputer

答案 6 :(得分:1)

当您在输入要素上遇到缺失值时,第一个业务顺序不是如何估算缺失值。最重要的问题是你为什么要这样做。除非你清楚明确地了解数据背后的“真实”现实,否则你可能想要减少冲动的冲动。这首先不是技术或包装。

从历史上看,我们采用像决策树这样的树方法,主要是因为我们中的一些人至少认为估计回归如估计线性回归,逻辑回归,甚至NN都是扭曲的,我们应该有不需要输入缺失的方法。 '列中'。所谓缺少信息量。对于熟悉贝叶斯的人来说,这应该是熟悉的概念。

如果你真的在大数据上建模,除了谈论它之外,你有可能面对大量的专栏。在像文本分析这样的特征提取的通常实践中,你可能会说丢失意味着count = 0。这很好,因为你知道根本原因。现实,特别是在面对结构化数据源时,您不知道或根本没有时间知道根本原因。但是你的引擎会强制插入一个值,无论是NAN还是引擎可以容忍的其他占位符,我可能会认为你的模型和你估算的一样好,这没有意义。

一个有趣的问题是:如果我们通过分裂过程中的密切背景来判断缺失,即第一级或第二级代理,那么森林化是否真的使语境判断成为没有实际意义,因为语境本身是随机选择?然而,这是一个“更好”的问题。至少它没有那么大的伤害。它当然应该使保留缺失不必要。

实际上,如果你有大量的输入功能,你可能不会有一个“好”的策略来推算。从纯粹的归责角度来看,最佳做法不是单变量。在RF的竞争中,这几乎意味着在使用它进行建模之前使用RF进行估算。

因此,除非有人告诉我(或我们),“我们无法做到这一点”,我认为我们应该能够推进缺失的“细胞”,完全绕过“最佳”的主题。