spark ml 管道处理看不见的标签

spark ml pipeline handle unseen labels

为了在 spark ml 管道中处理新的和看不见的标签,我想使用最频繁的插补。 如果流水线包含 3 个步骤

  1. 预处理
  2. 学习最频繁的项目
  3. 每个分类列的字符串索引器
  4. 矢量汇编程序
  5. 估算器,例如随机森林

假设 (1) 和 (2,3) 和 (4,5) 构成单独的管道

以下

val fittedLabels = pipeline23.stages collect { case a: StringIndexerModel => a }
val result = categoricalColumns.zipWithIndex.foldLeft(validationData) {
    (currentDF, colName) =>
      currentDF
        .withColumn(colName._1, when(currentDF(colName._1) isin (fittedLabels(colName._2).labels: _*), currentDF(colName._1))
          .otherwise(lit(null)))
  }.drop("replace")

将 new/unseen 标签替换为 null

但是,这个设置非常难看。因为像 CrossValidator 这样的工具不再工作(因为我不能提供单一的管道)

如何访问管道中的合适标签以构建一个处理将新值设置为 null 的 in Transformer?

您是否看到更好的方法来完成处理新值? 我假设最频繁的插补是可以的,即对于一个大约有 90 列的数据集,只有很少的列会包含一个看不见的标签。

我终于意识到这个功能需要驻留在管道中才能正常工作,即需要一个额外的新 PipelineStage 组件。