【问题标题】:How to get the best hyperparameter value after crossvalidation in Pyspark?Pyspark交叉验证后如何获得最佳超参数值?
【发布时间】:2018-09-25 13:07:47
【问题描述】:

我正在对一组超参数的数据集进行交叉验证。

lr = LogisticRegression()
paramGrid = ParamGridBuilder() \
    .addGrid(lr.regParam, [0, 0.01, 0.05, 0.1, 0.5, 1]) \
    .addGrid(lr.elasticNetParam, [0.0, 0.1, 0.5, 0.8, 1]) \
    .build()
evaluator = BinaryClassificationEvaluator()
cv = CrossValidator(estimator=lr, estimatorParamMaps=grid, evaluator=evaluator)

我想知道 regParamelasticNetParam 的最佳价值。在 python 中,我们可以选择在交叉验证后获得最佳参数。 pyspark中是否有任何方法可以在交叉验证后获得最佳参数值?

For example : regParam - 0.05 
              elasticNetParam - 0.1

【问题讨论】:

    标签: pyspark apache-spark-mllib


    【解决方案1】:

    好吧,你必须先安装你的 CrossValidator:

    cv_model = cv.fit(train_data)
    

    这样做之后,您将拥有一个 best_model:

    best_model = cv_model.bestModel
    

    要提取参数,你将不得不做这个丑陋的事情:

    best_reg_param = best_model._java_obj.getRegParam()
    best_elasticnet_param = best_model._java_obj.getElasticNetParam()
    

    【讨论】:

    • 我可以使用 best_model._java_obj.getParam('ElasticNetparam') 吗?
    • @merkle 这在使用随机森林的 CV 后对我有用,但在使用 TrainValidationSplit 的 GridSearch 后不会打印最佳超参数。它只是在第二种情况下打印超参数的定义。
    【解决方案2】:

    假设您使用以下参数构建了一个逻辑回归模型。

    lr = LogisticRegression()
    paramGrid = ParamGridBuilder() \
        .addGrid(lr.regParam, [0, 0.01, 0.05, 0.1, 0.5, 1]) \
        .addGrid(lr.elasticNetParam, [0.0, 0.1, 0.5, 0.8, 1]) \
        .build()
    cv = CrossValidator(estimator=lr, estimatorParamMaps=grid, evaluator=evaluator)
    cv_model = cv.fit(train_data)
    

    您可以使用以下代码提取最佳模型参数:

    print(cv_model.getEstimatorParamMaps()[np.argmax(cv_model.avgMetrics)])
    

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2015-07-14
      • 2021-05-19
      • 2016-07-20
      • 2020-10-24
      • 2019-04-09
      • 1970-01-01
      • 2019-01-31
      • 2015-05-23
      相关资源
      最近更新 更多