【问题标题】:How to set parameters for a custom PySpark Transformer once it's a stage in a fitted ML Pipeline?一旦自定义 PySpark Transformer 成为合适的 ML 管道中的一个阶段,如何为它设置参数?
【发布时间】:2018-07-16 12:10:30
【问题描述】:

我已经按照here 显示的模式为我自己的 Python 算法编写了自定义 ML 管道 EstimatorTransformer

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

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

那么,在我在装配好的管道模型上调用transform() 之前,如何在我的变压器上设置参数?我在 Spark 2.2.0 上。

【问题讨论】:

  • 啊。我刚刚发现 PipelineModel.transform 带有可选参数,所以我会调查一下...
  • 使用PipelineModel.transform() 我看不到如何将params 参数中提供的参数定位到我在管道中的阶段。我无法引用估算器实例,因为记住我的参数只存在于转换器中,我无法访问!
  • 我绝对不想将特定于转换器的参数添加到估算器中,因为它们与估算器无关。此外,一个给定的模型,一旦经过训练,就可以在一段时间后多次使用,以不同的方式生成预测。
  • 我能想到的唯一一件事(hack!)是让估计器在安装后保留对模型的引用。然后您可以从估算器访问该模型并设置您想要的任何参数。这也将解决能够将无法从Params 继承的参数传递到转换器的问题,例如用于创建DataFrameSparkSession。见stackoverflow.com/questions/48643152/…

标签: apache-spark pyspark apache-spark-ml


【解决方案1】:

PipelineModel 上没有 getStages() 方法,但同一个类确实有一个名为 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)

【讨论】:

  • TypeError: 'Param' 对象不支持索引
猜你喜欢
  • 2018-12-27
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2019-03-03
  • 2017-11-25
  • 2017-03-20
相关资源
最近更新 更多