如何在 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 的答案中描述的相同推理。
您需要修补TrainValidationSplitModel
、PCAModel
和DecisionTreeRegressionModel
,如下所示:
TrainValidationSplitModel.bestModel = (
lambda self: self._java_obj.bestModel
)
PCAModel.getK = (
lambda self: self._java_obj.getK()
)
DecisionTreeRegressionModel.getMaxDepth = (
lambda self: self._java_obj.getMaxDepth()
)
现在您可以使用它来获取最佳模型并提取k
和maxDepth
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 调整后如何获得最佳参数?