2012-02-20 91 views

回答

25

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

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

以上回答是过时的; scikit-learn的最新版本有一个类别Imputer,它可以简化每个功能的缺失值插补。您可以为其提供包含NaN的数组,以便将其替换为相应功能的平均值,中位数或模式。

+0

我只是想说明randomforest处理nan值的好处 – 2013-02-02 02:10:29

+0

GBM的情况仍然如此吗? scikit学习版本没有反映R中的编码是否有理由优雅地处理缺失的值?这是该算法的一个有吸引力的功能,我希望它能在scikit中编码。 – 2014-07-01 21:37:59

+0

@B_Miner:几乎所有的scikit-learn估算器都是这种情况。缺少值处理是与学习分开完成的,但可以使用“管道”将两者结合起来。 – 2014-07-02 08:33:24

11

我希望我可以提供一个简单的例子,但我发现RandomForestRegressor确实而不是处理nan的优雅。在增加纳米百分比的功能时,性能会变得更糟。具有“太多”nan的特征完全被忽略,即使nan指示非常有用的信息。

AFAIK算法将永远不会创建的决定“isnan”或“ISMISSING”的分裂。如果该特征只有一个已知值并且该特征的其余值为nan /未知,算法将忽略树的特定级别上的特征

我已经尝试了各种估算方法来解决这个问题(均值/中位数替换,预测缺失使用不同的模型,值等),但结果喜忧参半。

相反,这是我的解决办法:更换男的跟单,显然超出范围值(-1.0等)。这使树能够按照“未知值vs已知值”的标准进行分割。然而,需要注意的是,使用这种超出范围的值进行替换时存在问题:当算法试图找到一个合适的地方进行拆分时,已知值可能会与范围外值混在一起。例如,最小已知值可能会超出范围值(您已知的0与您用来替换nan值的-1相等)。因此,您的模型可能会根据您的超出范围值是否小于最小值或者是否大于最大值(它们可能分别与最小值或最大值混合)而发生变化。

+0

对于缺失值使用“明显超出范围”值的好主意。这对于决策树应该相当有效。 – pansen 2017-09-11 12:12:42

3

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

+2

该链接不再有效。我认为当前的URL是:http://docs.orange.biolab.si/reference/rst/Orange.feature.imputation.html。 – JustAC0der 2015-11-02 20:11:36

+0

是的,你说得对。固定。 – 2015-11-03 22:29:14

8

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

  1. 计算中值从柱(功能)的数据,并使用 此(连续数据)
  2. 确定最频繁出现的类别,并使用此 (分类数据)

根据对Breiman而言,算法的随机性和树的数量将允许校正,而不会对预测的准确性产生太多影响。我觉得如果NA值的存在是稀疏的,那么包含许多NA值的特征我认为很可能会产生影响。

8

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

什么是需要有一个单独的规则缺失值的模型,任何猜测缺失值的尝试都可能会降低模型的预测能力。

+1

是的。而且,在很多情况下,数据可能非常大(NULL)(让我们说每行的20%被填充)。基于DT的方法应该能够汲取这些 - 如果使用得当,模型可以比使用估算数据的模型好得多。 – user48956 2016-09-15 20:41:45

+0

@Johnny V“独立规则模式”是什么意思? – KouchakYazdi 2017-03-03 13:56:56

+0

我使用的策略是添加缺失值标志列以及用中位数或模式填充缺失值。这样做是为了让记录被模型视为正常,除非缺失值是显着的,在这种情况下,模型将为丢失的数据标志制定一条规则。例如“如果记录缺少数据点,则归类为A类” – 2017-05-02 09:47:06

1

我确实遇到过这个问题。在实际的情况下,我发现R中的一个包叫missForest,可以很好地处理这个问题,弥补缺失值并大大提高我的预测。 我认为这种基于随机森林填补的方法比简单地用中位数或平均数替换NA好得多,但它对大数据集的工作确实很慢。所以这种方法有一个折衷。

1

当您在输入要素中遇到缺失值时,业务的第一顺序不是如何计算缺失值。最重要的问题是为什么应该你。除非您清楚明确地了解数据背后的“真实”现实,否则您可能需要削减敦促进行估算。这首先不是关于技术或包装。

从历史上看,我们采用了像决策树这样的树方法,主要是因为我们中的一些人至少觉得像估计线性回归,逻辑回归或甚至神经网络的回归估计缺少估计,我们应该有方法,不需要imputing错过'列之中'。所谓的缺乏信息性。对于那些熟悉贝叶斯的人来说,这应该是熟悉的概念。

如果你真的对大数据进行建模,除了谈论它,这个机会是你面对大量的列。在文本分析等特征提取的常见做法中,您可能会说丢失平均值= 0。这很好,因为你知道根本原因。事实上,特别是当面对结构化数据源时,您不知道或根本没有时间来了解根本原因。但是你的引擎力量可以插入一个价值,无论是NAN还是引擎可以容忍的其他地方持有者,我可能会非常认同你的模型和你的模型一样好,这是没有道理的。

一个有趣的问题是:如果我们离开missingness由其分裂过程中密切背景下,一级或二级代理进行判断,并造林实际上使上下文判断一个有争议的问题,因为背景本身就是随机选择?然而,这是一个'更好'的问题。至少它不会伤害那么多。它当然应该使得保留缺失是不必要的。作为一个实际问题,如果你有大量的输入功能,你可能不会有一个'好'的策略来进行归因。从纯粹的归责角度来看,最佳做法不过是单变量。在射频比赛中哪个比较好用,就是在用它建模之前使用射频进行估算。因此,除非有人告诉我(或我们),“我们无法做到这一点”,我认为我们应该能够推进缺失的“细胞”,完全绕过“最佳”的估算主题。