作者:5jkd_330 | 来源:互联网 | 2022-12-10 12:21
我想使用排名指标(MAP @ k)优化PySpark管道的超级参数。我已经在文档中看到了如何使用评估(Scala)中定义的指标,但是由于尚未实现MAP @ k,因此我需要定义一个自定义的评估器类。所以我需要做类似的事情:
model = Pipeline(stages=[indexer, assembler, scaler, lg])
paramGrid_lg = ParamGridBuilder() \
.addGrid(lg.regParam, [0.001, 0.1]) \
.addGrid(lg.elasticNetParam, [0, 1]) \
.build()
crossval_lg = CrossValidator(estimator=model,
estimatorParamMaps=paramGrid_lg,
evaluator=MAPkEvaluator(),
numFolds=2)
MAPkEvaluator()
我的自定义评估师在哪里。我见过类似的问题,但没有答案。
是否有任何示例或文档可用?有谁知道是否可以在PySpark中实现它?我应该采用什么方法?
1> Amanda..:
@jarandaf在第一条评论中回答了该问题,但为清楚起见,我编写了如何使用随机指标实现基本示例:
import random
from pyspark.ml.evaluation import Evaluator
class RandomEvaluator(Evaluator):
def __init__(self, predictiOnCol="prediction", labelCol="label"):
self.predictiOnCol= predictionCol
self.labelCol = labelCol
def _evaluate(self, dataset):
"""
Returns a random number.
Implement here the true metric
"""
return random.randint(0,1)
def isLargerBetter(self):
return True
现在,以下代码应该可以工作:
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
paramGrid_lg = ParamGridBuilder() \
.addGrid(lg.regParam, [0.01, 0.1]) \
.addGrid(lg.elasticNetParam, [0, 1]) \
.build()
crossval_lg = CrossValidator(estimator=model,
estimatorParamMaps=paramGrid_lg,
evaluator= RandomEvaluator(),
numFolds=2)
cvModel = crossval_lg.fit(train_val_data_)