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

How to print best model params in pyspark pipeline

此题与相似。我想在 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);

提前致谢。

它确实遵循@user6910411 给出的关于 的答案中描述的相同推理。

您需要修补 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: 您可以按照上述相同的方式修补模型以获取特定参数。

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

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

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

可以在此处找到所有原始 JVM get-parameters 的列表 https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/RandomForestClassificationModel.html

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

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

希望对您有所帮助。