【问题标题】:sklearn Pipeline with NaN values具有 NaN 值的 sklearn 管道
【发布时间】:2017-03-21 09:48:23
【问题描述】:

出于充分的理由,大多数(全部?)实现 fittransform(转换器或估计器)的 sklearn 方法不能很好地处理包含 NaN 值的数据。因为大多数机器学习算法无法开箱即用地处理这些,并且各种转换与 NaN 不明确(6 的特征与 NaN 的特征之间的交互是什么?),当您尝试通过时会引发错误包含空值的数据集,例如 StandardScalerPCARandomForestClassifier

但是,我目前正在使用能够处理缺失值的估算器。这对我的数据集来说相当重要,因为大多数数据至少有一个缺失的特征(因此删除 NA 是不可能的),并且估算或多或少是不可能的(原始数据中的许多列都是字符串,如地址或名称)。我的特征是数字的,但是没有很好的方法来编码一个特征中的缺失值,即字符串之间的模糊距离。

在我的数据集中,当我比较两个字符串但缺少一个或两个字符串时会出现 NA。将这些 NA 编码为零是告诉模型字符串非常不同,这与说“我们不知道”不同,并且可能导致错误分类。

就上下文而言,我的分类器目前是 XGBoost 增强型森林分类器,这些分类器可以毫无问题地获取缺失数据。该分类器通过学习正确的方向来“学习”最佳插补值,以在数据丢失的情况下进行任何拆分。

TL; DR:有没有一种在保留缺失数据的同时使用 sklearn 的各种转换器对象的好方法?对我来说合理行为的例子是:

  • StandardScaler 使用 np.nanmean 和类似方法在缩放数据时忽略 NaN
  • PolynomialFeatures 进行标准特征生成,但任何有 NaN 的地方,结果都是 NaN。也就是说,当“A”为 6 而“B”为 NaN 时,特征“A”和“B”之间的交互作用就是简单的 NaN。 B^2 是 NaN。
  • PCA 是一个更难的问题,我暂时忽略它...

我目前的想法是用正确的逻辑编写我自己的这些对象版本,编写 Pipeline 需要它们必须在 Pipeline 对象中正常工作的任何属性。我找不到关于此的文档,所以我用fittransformfit_transformget_params 写了一些东西,但是我遇到了一些我还没有弄明白的神秘错误.

任何帮助表示赞赏。对不起,文字墙。

【问题讨论】:

  • 这是一个很好的问题,但我认为您可能不得不自己动手。
  • 我想是的,@maxymoo。我现在正在通过scikit-learn.org/stable/developers/…
  • 如果你工作了,你应该回馈;)
  • 请注意,StandardScaler 现在接受 NaN 值。引用StandardScaler 的文档:“NaN 被视为缺失值:在拟合中被忽略,在变换中保持不变。” . sklearn 版本:0.23.2

标签: scikit-learn


【解决方案1】:

您可以创建一个管道步骤类,该类接受一个数组并使用您提到的一种技术将其 nan 转换为值。

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 2020-12-26
    • 1970-01-01
    • 2018-12-15
    • 2020-05-27
    • 2021-11-07
    • 2016-07-06
    • 2014-01-29
    相关资源
    最近更新 更多