Pyspark交叉验证后如何获得最佳超参数值?

Posted

技术标签:

【中文标题】Pyspark交叉验证后如何获得最佳超参数值?【英文标题】:How to get the best hyperparameter value after crossvalidation in 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

【问题讨论】:

【参考方案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)])

【讨论】:

以上是关于Pyspark交叉验证后如何获得最佳超参数值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn 嵌套交叉验证获得最佳参数

如何使用交叉验证获得最佳系数向量

通过 pyspark.ml.tuning.TrainValidationSplit 调整后如何获得最佳参数?

如何从 PySpark 中的 spark.ml 中提取模型超参数?

机器学习之交叉验证和网格搜索

交叉验证后如何获取支持向量数