将新的拟合阶段添加到现有的 PipelineModel 中而无需再次拟合

Add new fitted stage to a exitsting PipelineModel without fitting again

我想将几个经过训练的管道连接成一个,这类似于 "" 但是下面的解决方案适用于 PySpark。

> pipe_model_new = PipelineModel(stages = [pipe_model , pipe_model2])
> final_df = pipe_model_new.transform(df1)

在 Apache Spark 2.0 中 "PipelineModel" 的构造函数被标记为私有的,因此它不能被外部调用。而在 "Pipeline" class 中,只有 "fit" 方法创建 "PipelineModel"

val pipelineModel =  new PipelineModel("randomUID", trainedStages)
val df_final_full = pipelineModel.transform(df)
Error:(266, 26) constructor PipelineModel in class PipelineModel cannot be accessed in class Preprocessor
    val pipelineModel =  new PipelineModel("randomUID", trainedStages)

和调用 fit 方法没有任何*错误。如果阶段是 Transfomer,而 PipelineModel 是**,则 fit 就像身份一样。

你可以查看relevant Python:

if isinstance(stage, Transformer):
    transformers.append(stage)
    dataset = stage.transform(dataset)

Scala code:

这意味着拟合过程只会验证架构并创建一个新的 PipelineModel 对象。

case t: Transformer =>
  t

* 唯一可能的问题是存在非懒惰 Transformers,但是,除了已弃用的 OneHotEncoder,Spark 核心 API 不提供此类功能。

** 在 Python:

from pyspark.ml import Transformer, PipelineModel

issubclass(PipelineModel, Transformer)
True 

在 Scala 中

import scala.reflect.runtime.universe.typeOf
import org.apache.spark.ml._

typeOf[PipelineModel] <:< typeOf[Transformer]
Boolean = true