PySpark中的自定义评估器

Ama*_*nda 3 metrics cross-validation pyspark

我想使用排名指标(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)
Run Code Online (Sandbox Code Playgroud)

MAPkEvaluator()我的自定义评估师在哪里。我见过类似的问题,但没有答案。

是否有任何示例或文档可用?有谁知道是否可以在PySpark中实现它?我应该采用什么方法?

Ama*_*nda 5

@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
Run Code Online (Sandbox Code Playgroud)

现在,以下代码应该可以工作:

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_)
Run Code Online (Sandbox Code Playgroud)