一旦自定义 PySpark Transformer 成为合适的 ML 管道中的一个阶段,如何为它设置参数?

How to set parameters for a custom PySpark Transformer once it's a stage in a fitted ML Pipeline?

我已经按照显示的模式 here.

为自己的 Python 算法编写了自定义 ML 管道 EstimatorTransformer

但是,在该示例中,_transform() 所需的所有参数都通过估算器的 _fit() 方法方便地传递给了 Model/Transformer。但是我的转换器有几个参数可以控制转换的应用方式。这些参数特定于转换器,因此将它们与用于拟合模型的特定于估计器的参数一起提前传递到估计器中会感觉很奇怪。

我可以通过向转换器添加额外的 Params 来解决这个问题。当我在 ML 管道之外使用我的估算器和转换器时,这很好用。但是,一旦我的估算器对象作为一个阶段添加到管道中,我该如何设置这些特定于转换器的参数呢?例如,您可以在 pyspark.ml.pipeline.Pipeline 上调用 getStages(),因此可以获得估计量,但在 PipelineModel 上没有对应的 getStages() 方法。我也看不到任何在 PipelineModel 阶段设置参数的方法。

那么,在对拟合管道模型调用 transform() 之前,如何设置变压器的参数?我在使用 Spark 2.2.0.

PipelineModel 上没有 getStages() 方法,但 class 确实有一个名为 stagesundocumented member 方法。

例如,如果您刚刚拟合了一个具有 3 个阶段的管道模型,并且您想要在第二个阶段设置一些参数,您可以执行如下操作:

myModel = myPipelineModel.stages[1]
myModel.setMyParam(42)
# Or in one line:
#myPipelineModel.stages[1].setMyParam(42)

# Now we can push our data through the fully configured pipeline model:
resultsDF = myPipelineModel.transform(inputDF)