使用 CrossValidator 和 ParamGridBuilder 找到最佳管道模型

Find the best pipeline model using CrossValidator and ParamGridBuilder

我有一个可接受的模型,但我想通过使用 CrossValidator 和 ParamGridBuilder 在 Spark ML Pipeline 中调整其参数来改进它。

作为估算员,我将放置现有管道。 在 ParamMaps 中我不知道该放什么,我不明白。 作为 Evaluator,我将使用之前创建的 RegressionEvaluator。

我打算做 5 次折叠,在树中列出 10 个不同的深度值。

我怎样才能 select 并显示最低 RMSE 的最佳模型?

实际示例:

    from pyspark.ml import Pipeline
    from pyspark.ml.regression import DecisionTreeRegressor
    from pyspark.ml.feature import VectorIndexer
    from pyspark.ml.evaluation import RegressionEvaluator

    dt = DecisionTreeRegressor()
    dt.setPredictionCol("Predicted_PE")
    dt.setMaxBins(100)
    dt.setFeaturesCol("features")
    dt.setLabelCol("PE")
    dt.setMaxDepth(8)

    pipeline = Pipeline(stages=[vectorizer, dt])
    model = pipeline.fit(trainingSetDF)
    regEval = RegressionEvaluator(predictionCol = "Predicted_XX", labelCol = "XX", metricName = "rmse")
    rmse = regEval.evaluate(predictions)

    print("Root Mean Squared Error: %.2f" % rmse)
    (1) Spark Jobs 
    (2) Root Mean Squared Error: 3.60

需要:

    from pyspark.ml.tuning import CrossValidator, ParamGridBuilder

    dt2 = DecisionTreeRegressor()
    dt2.setPredictionCol("Predicted_PE")
    dt2.setMaxBins(100)
    dt2.setFeaturesCol("features")
    dt2.setLabelCol("PE")
    dt2.setMaxDepth(10)

    pipeline2 = Pipeline(stages=[vectorizer, dt2])
    model2 = pipeline2.fit(trainingSetDF)
    regEval2 = RegressionEvaluator(predictionCol = "Predicted_PE", labelCol = "PE", metricName = "rmse")

    paramGrid = ParamGridBuilder().build() # ??????
    crossval = CrossValidator(estimator = pipeline2, estimatorParamMaps = paramGrid, evaluator=regEval2, numFolds = 5) # ?????

    rmse2 = regEval2.evaluate(predictions)

    #bestPipeline = ????
    #bestLRModel = ????
    #bestParams = ????

    print("Root Mean Squared Error: %.2f" % rmse2)
    (1) Spark Jobs 
    (2) Root Mean Squared Error: 3.60     # the same ¿?

您需要使用 crossval 对象上的训练数据调用 .fit() 来创建 cv 模型。这将进行交叉验证。然后你从中得到最好的模型(根据你的评估指标)。例如

cvModel = crossval.fit(trainingData) myBestModel = cvModel.bestModel