为了处理spark ml管道中新的和看不见的标签,我想使用最频繁的插补 . 如果管道包含3个步骤
-
预处理
-
学习最频繁的项目
每个分类列的 -
stringIndexer
-
矢量汇编程序
-
估算器,例如随机森林
假设(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")
用 null
替换新的/看不见的标签
- 这些故意引入的零点是由最频繁的imputer推算的
但是,这种设置非常难看 . 像CrossValidator这样的工具不再起作用(因为我无法提供单个管道)
如何访问管道中的拟合标签以构建一个Transformer,它将新值设置为null?
您是否看到了更好的方法来完成处理新值?我假设最频繁的估算是正确的,即对于具有大约90列的数据集,只有极少数列将包含看不见的标签 .
1 回答
我终于意识到这个功能需要驻留在管道中才能正常工作,即需要一个额外的新PipelineStage组件 .