在scikits机器学习中缺少值

Vla*_*dtn 30 python machine-learning missing-data scikits scikit-learn

是否有可能在scikit-learn中缺少值?他们应该如何代表?我找不到任何关于这方面的文件.

Fre*_*Foo 30

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

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

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

  • 我只想指出,randomforest可以很好地处理nan值 (3认同)
  • 人们需要明智地将缺失值推算到什么上,而不仅仅是选择均值,中位数或众数。在某些情况下,“ 0”可能是最有意义的,在这种情况下,您可以使用“ df [column_name] .fillna(0,inplace = True)”。同样对于“ monthsSinceLastDelinquency”之类的功能,将缺失值归为有效范围之外的值是最有意义的。决策树可以对此进行有意义的拆分,并保留数据中的信息。 (2认同)

Joh*_*ior 16

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

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

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

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

  • 对缺失值使用“明显超出范围”的值的好主意。这对于决策树来说应该非常有效。 (2认同)

Joh*_*y V 12

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

必要的是具有针对缺失值的单独规则的模型,任何猜测缺失值的尝试都可能降低模型的预测能力.


Jcr*_*w06 9

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

  1. 计算列中的数据的中位数(功能)并使用此(连续数据)
  2. 确定最常出现的类别并使用此(分类数据)

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