如何在 pyspark 管道中打印最佳模型参数

Posted

技术标签:

【中文标题】如何在 pyspark 管道中打印最佳模型参数【英文标题】:How to print best model params in pyspark pipeline 【发布时间】:2017-01-21 16:11:26 【问题描述】:

这个问题类似于this one。在 pyspark 中执行 TrainValidationSplit 后,我​​想打印最佳模型参数。我找不到其他用户用来回答问题的文本,因为我正在使用 jupyter 并且日志从终端消失...

部分代码为:

pca = PCA(inputCol = 'features')
dt = DecisionTreeRegressor(featuresCol=pca.getOutputCol(), 
                           labelCol="energy")
pipe = Pipeline(stages=[pca,dt])

paramgrid = ParamGridBuilder().addGrid(pca.k, range(1,50,2)).addGrid(dt.maxDepth, range(1,10,1)).build()

tvs = TrainValidationSplit(estimator = pipe, evaluator = RegressionEvaluator(
labelCol="energy", predictionCol="prediction", metricName="mae"), estimatorParamMaps = paramgrid, trainRatio = 0.66)

model = tvs.fit(wind_tr_va);

提前致谢。

【问题讨论】:

【参考方案1】:

它确实遵循@user6910411 给出的关于How to get the maxDepth from a Spark RandomForestRegressionModel 的答案中描述的相同推理。

您需要修补TrainValidationSplitModelPCAModelDecisionTreeRegressionModel,如下所示:

TrainValidationSplitModel.bestModel = (
    lambda self: self._java_obj.bestModel
)

PCAModel.getK = (
    lambda self: self._java_obj.getK()
)

DecisionTreeRegressionModel.getMaxDepth = (
    lambda self: self._java_obj.getMaxDepth()
)

现在您可以使用它来获取最佳模型并提取kmaxDepth

bestModel = model.bestModel

bestModelK = bestModel.stages[0].getK()
bestModelMaxDepth = bestModel.stages[1].getMaxDepth()

PS:您可以通过与上述相同的方式修补模型以获取特定参数。

【讨论】:

【参考方案2】:

更简单(1 行),只需引用模型的 JVM 对象

    cvModel.bestModel.stages[-1]._java_obj.getMaxDepth()

这里你在交叉验证后获取你的 bestModel,调用这个模型的 JVM 对象并使用 getMaxDepth() 方法从 JVM 对象中提取 maxDepth 参数。

所有原始 JVM 获取参数的列表可以在这里找到 https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/RandomForestClassificationModel.html

此外,您可以浏览其他模型的其他 get-parameters 并参考任何模型的原始 JVM 对象提取它们

    <yourModel>.stages[<yourModelStage>]._java_obj.<getParameter>()

希望对你有帮助。

【讨论】:

以上是关于如何在 pyspark 管道中打印最佳模型参数的主要内容,如果未能解决你的问题,请参考以下文章

通过 pyspark.ml.tuning.TrainValidationSplit 调整后如何获得最佳参数?

pyspark - 如何交叉验证几种 ML 算法

PySpark 将模型预测与未转换的数据对齐:最佳实践

如何从 CrossValidatorModel 中提取最佳参数

如何将 sklearn 管道转换为 pyspark 管道?

Pyspark交叉验证后如何获得最佳超参数值?