具有NaN值的sklearn管道

时间:2016-11-07 22:07:50

标签: scikit-learn

出于好的理由,实现fittransform(变换器或估算器)的大多数(全部?)sklearn方法对包含NaN值的数据不起作用。因为大多数机器学习算法无法处理这些开箱即用,并且各种变换与NaN不一致(具有6和1与NaN的特征之间的交互是什么?),当您尝试通过时会出现错误包含空值的数据集,例如StandardScalerPCARandomForestClassifier

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

在我的数据集中,当我比较两个字符串但缺少一个或两个字符串时会出现NAs。将这些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写了一些内容,但是我收到了一些神秘的错误我还没有感到困惑。

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

1 个答案:

答案 0 :(得分:0)

您可以创建一个流水线步骤类,该类采用一个数组并将其nans转换为您提到的一种技术。