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)
我想知道 regParam 和 elasticNetParam 的最佳价值。在 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交叉验证后如何获得最佳超参数值?的主要内容,如果未能解决你的问题,请参考以下文章
通过 pyspark.ml.tuning.TrainValidationSplit 调整后如何获得最佳参数?