Scikits机器学习中的价值缺失
machine-learning
python
scikit-learn
6
0

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

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

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

  1. 计算列(特征)中数据的中位数,并使用此值(连续数据)
  2. 确定最经常出现的类别并使用此(类别数据)

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

收藏
评论

我希望我可以提供一个简单的示例,但是我发现RandomForestRegressor 不能优雅地处理NaN。当添加NaN百分比增加的功能时,性能会逐渐变差。即使“ nan”指示非常有用的信息,具有“太多” NaN的特征也会被完全忽略。

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

我尝试了各种插补技术来解决该问题(用均值/中位数代替,使用其他模型预测缺失值等),但结果好坏参半。

相反,这是我的解决方案:用一个明显超出范围的值(例如-1.0)替换NaN。这使树可以根据“未知值与已知值”标准进行拆分。但是,使用这样的超出范围的值会产生奇怪的副作用:超出范围的值附近的已知值可能会在算法试图找到合适的位置时与超出范围的值合并在一起分开。例如,已知的0可能会与用来代替NaN的-1混为一谈。因此,您的模型可能会更改,具体取决于超出范围的值是小于最小值还是大于最大值(分别与最小值或最大值混为一谈)。这可能会也可能不会帮助该技术的推广,其结果将取决于行为最小值或最大值样本与NaN值样本的相似程度。

收藏
评论

我确实遇到了这个问题。在实际情况下,我在R中找到了一个名为missForest的程序包,可以很好地处理此问题,从而估算出缺失值并大大增强了我的预测。

missForest不仅将NA替换为中位数或均值, 通过预测其认为缺失值应该是什么来替换它们。它使用对数据矩阵的观察值进行训练的随机森林进行预测。对于包含大量缺失值的大型数据集,它可能会非常慢地运行。因此,需要对这种方法进行权衡。

python中类似的选项是predictive_imputer

收藏
评论

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

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

例如:

df['xvariable_missing'] = np.where(df.xvariable.isna(),1,0)
df.xvariable = df.xvariable.fillna(df.xvariable.median())
收藏
评论

scikit-learn不支持缺少值。以前在邮件列表上已经对此进行了讨论,但是没有尝试实际编写代码来处理它们。

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

以上答案已经过时; scikit-learn的最新版本具有Imputer类, Imputer可以进行简单的按功能的缺失值估算。您可以向其提供包含NaN的数组,以将其替换为相应特征的均值,中位数或众数。

收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号