【发布时间】:2017-03-21 09:48:23
【问题描述】:
出于充分的理由,大多数(全部?)实现 fit 和 transform(转换器或估计器)的 sklearn 方法不能很好地处理包含 NaN 值的数据。因为大多数机器学习算法无法开箱即用地处理这些,并且各种转换与 NaN 不明确(6 的特征与 NaN 的特征之间的交互是什么?),当您尝试通过时会引发错误包含空值的数据集,例如 StandardScaler、PCA 和 RandomForestClassifier。
但是,我目前正在使用能够处理缺失值的估算器。这对我的数据集来说相当重要,因为大多数数据至少有一个缺失的特征(因此删除 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 对象中正常工作的任何属性。我找不到关于此的文档,所以我用fit、transform、fit_transform 和get_params 写了一些东西,但是我遇到了一些我还没有弄明白的神秘错误.
任何帮助表示赞赏。对不起,文字墙。
【问题讨论】:
-
这是一个很好的问题,但我认为您可能不得不自己动手。
-
我想是的,@maxymoo。我现在正在通过scikit-learn.org/stable/developers/…。
-
如果你工作了,你应该回馈;)
-
请注意,StandardScaler 现在接受 NaN 值。引用StandardScaler 的文档:“NaN 被视为缺失值:在拟合中被忽略,在变换中保持不变。” . sklearn 版本:0.23.2
标签: scikit-learn