2017-01-21 84 views
2

此問題與this one類似。在pyspark進行TrainValidationSplit後,我想打印出最好的模型參數。我找不到一塊其他用戶使用來回答這個問題,因爲我的工作jupyter,並從終端日誌自敗文字...代碼如何在pyspark管道中打印最佳模型參數

部分是:

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); 

謝謝提前。

回答

4

它確實遵循了在@ 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 :您可以修補模型以獲得與上述相同的特定參數。

1

更簡單(1線),只是參考模型的JVM對象

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

在這裏,你把你的bestModel交叉驗證後,把這種模式的JVM對象並使用提取MAXDEPTH參數getMaxDepth() - 來自JVM對象的方法。

所有原始JVM獲得參數列表可以在這裏找到 https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/RandomForestClassificationModel.html

此外,您還可以瀏覽其他獲取參數的其他車型,並提取它們涉及任何模型的原始JVM對象

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

希望它有幫助。