【问题标题】:scikit-learn: filling missing values by random samplingscikit-learn:通过随机抽样填充缺失值
【发布时间】:2017-08-09 01:54:21
【问题描述】:

我很惊讶sklearn.preprocessing.Imputer 没有提供以下填充缺失值的策略:对于任何缺失值,从给定值中随机均匀地采样一个值并替换。

我认为这是一个比用平均值、最频繁或中值替换更好的策略,因为它不会在值的分布中产生人为的尖峰。

我需要自己编写一个转换器吗?

ps。在更元级别的讨论中,当我在 scikit-learn 这样的库中找不到我认为简单、几乎标准的操作作为组件时,我总是有点困惑。让我想知道:这个库是不是非常未完成,还是我正在尝试做一些违反最佳实践的事情?有什么建议吗?

【问题讨论】:

  • 您需要一个本地窗口来定义要从中采样的均匀分布,以防止尖峰?也许您正在搜索(线性)插值?
  • 不确定我是否理解您所指的问题。插补策略在保持分布方面不需要是完美的,只需比均值、中值、最常见的差那么明显。随机抽样不能做到这一点吗?
  • 我会说,这取决于您从中采样的分布。你想如何定义它?无论如何,您似乎正在对您正在操作的各个条目施加某种时间关系?在没有这种关系的情况下,估算平均值是一个很好的选择。但是,对于时间序列数据,可能有更好的方法。
  • 这不是时间序列,没有时间关系。
  • 当分类器具有某种区分性时,这些尖峰真的有问题吗?真的比添加噪音更好吗? (当它不在 sklearn 中时,我希望它对大多数用户来说不是那么重要和/或通过科学工作没有太多备份;当然这并不意味着它不是一个好的添加)

标签: python machine-learning scikit-learn data-science


【解决方案1】:

对于离散数字序列,从现有值中随机抽样可能比使用均值或中位数更好,因为这会将所有缺失值替换为单个数字,并且肯定会给分布带来人为的尖峰。

【讨论】:

    【解决方案2】:

    我认为这是一个比用平均值、最频繁或中值替换更好的策略,因为它不会在值的分布中产生人为的尖峰。

    很遗憾,这是错误的。当您对连续变量的分布一无所知时,最好的猜测是总是均值,因为它不太可能在您的数据中引入偏差。

    如果您决定使用 any 分布中的随机抽样来填充缺失值,则您总是假设该分布是生成观察值的分布。因此,在您的数据集中引入明显的偏差。

    不过,您可以看看sklearn.impute.IterativeImputer ,它提供了一种更复杂的插补方法。

    【讨论】:

    • 你能通过链接到文献来证明你的观点吗?据我记得,最好的插补策略很大程度上取决于你想做什么。如果你想估计平均值,是的,平均值插补是要走的路。如果你想估计协方差......我有疑问。
    • 当你用观察到的平均值填充时,你只是从一个分布中“抽样”,这个分布的平均值是观察到的样本平均值,并且没有方差可言。这当然也不是产生观察的分布!
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2020-04-18
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2014-10-04
    • 2012-10-25
    相关资源
    最近更新 更多