Напомним, в К в Pyspark - PullRequest
       16

Напомним, в К в Pyspark

0 голосов
/ 30 октября 2018

Кто-нибудь реализовывал Recall на k для оценки рекомендательной системы, построенной с использованием Pyspark? Я реализовал Precision при k, ссылаясь на данные, приведенные здесь (используя встроенный класс RankingMetrics): Построить систему рекомендаций с помощью Spark: Implicit ALS .

class RankingEvaluator(Evaluator):

@keyword_only
def __init__(self, k=None):
    super(RankingEvaluator, self).__init__()
    self.k = Param(self, 'k', 'Top K')
    self._setDefault(k=20)
    kwargs = self._input_kwargs
    self.setParams(**kwargs)

@keyword_only
def setParams(self, k=None):
    kwargs = self._input_kwargs
    return self._set(**kwargs)

def isLargerBetter(self):
    return True

def setK(self, value):
    self._paramMap[self.k] = value
    return self

def getK(self):
    return self.getOrDefault(self.k)

def _evaluate(self, predictedDF):
    k = self.getK()

    windowSpec = Window.partitionBy('user_id').orderBy(col('prediction').desc())
    perUserPredictedItemsDF = predictedDF \
        .select('user_id', 'article_id', 'prediction', F.rank().over(windowSpec).alias('rank')) \
        .where('rank <= {0}'.format(k)) \
        .groupBy('user_id') \
        .agg(expr('collect_list(article_id) as items'))

    windowSpec = Window.partitionBy('user_id').orderBy(col('article_count').desc())
    perUserActualItemsDF = predictedDF \
        .select('user_id', 'article_id', 'article_count', F.rank().over(windowSpec).alias('rank')) \
        .where('rank <= {0}'.format(k)) \
        .groupBy('user_id') \
        .agg(expr('collect_list(article_id) as items'))

    perUserItemsRDD = perUserPredictedItemsDF.join(F.broadcast(perUserActualItemsDF), 'user_id', 'inner') \
        .rdd \
        .map(lambda row: (row[1], row[2]))

    if perUserItemsRDD.isEmpty():
        return 0.0

    rankingMetrics = RankingMetrics(perUserItemsRDD)
    precision_at_k = rankingMetrics.precisionAt(k)
    return precision_at_k

Однако я не могу найти какой-либо оценочный класс, который мог бы помочь мне с моей проблемой.

Заранее спасибо.

...