spark ml 管道处理看不见的标签
spark ml pipeline handle unseen labels
为了在 spark ml 管道中处理新的和看不见的标签,我想使用最频繁的插补。
如果流水线包含 3 个步骤
- 预处理
- 学习最频繁的项目
- 每个分类列的字符串索引器
- 矢量汇编程序
- 估算器,例如随机森林
假设 (1) 和 (2,3) 和 (4,5) 构成单独的管道
- 我可以为训练和测试数据拟合和转换 1。这意味着所有 nan 值都已处理,即 imputed
- 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 组件。
为了在 spark ml 管道中处理新的和看不见的标签,我想使用最频繁的插补。 如果流水线包含 3 个步骤
- 预处理
- 学习最频繁的项目
- 每个分类列的字符串索引器
- 矢量汇编程序
- 估算器,例如随机森林
假设 (1) 和 (2,3) 和 (4,5) 构成单独的管道
- 我可以为训练和测试数据拟合和转换 1。这意味着所有 nan 值都已处理,即 imputed
- 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 组件。