【问题标题】:RankingMetrics in Spark (Scala)Spark (Scala) 中的 RankingMetrics
【发布时间】:2016-06-22 18:29:01
【问题描述】:

我正在尝试使用 spark RankingMetrics.meanAveragePrecision。 但是,它似乎没有按预期工作。

val t2 = (Array(0,0,0,0,1), Array(1,1,1,1,1))
val r = sc.parallelize(Seq(t2))
val rm = new RankingMetrics[Int](r)
rm.meanAveragePrecision //  Double = 0.2
rm.precisionAt(5) //  Double = 0.2

t2 是一个元组,其中左侧数组表示真实值,右侧数组表示预测值(1 - 相关文档,0- 不相关)

如果我们计算 t2 的平均精度,我们会得到: (0/1 + 0/2 + 0/3 + 0/4 + 1/5)/5 = 1/25 但是 RankingMetric 返回 0.2 的 MeanAveragePrecision 应该是 1/25。

谢谢。

【问题讨论】:

    标签: scala apache-spark machine-learning evaluation


    【解决方案1】:

    我认为问题在于您的输入数据。由于您的预测/实际数据包含相关性分数,如果您想使用 0/1 分数进行评估,我认为您应该查看binary classification metrics 而不是排名指标。

    RankingMetrics 期望的是两个排名项目的列表/数组,因此如果您将分数替换为文档 ID,它应该可以按预期工作。这是 PySpark 中的一个示例,其中有两个列表仅匹配第 5 项:

    from pyspark.mllib.evaluation import RankingMetrics
    
    rdd = sc.parallelize([(['a','b','c','d','z'], ['e','f','g','h','z'])])
    metrics = RankingMetrics(rdd)
    
    for i in range(1, 6):
        print i, metrics.precisionAt(i) 
    print 'meanAveragePrecision', metrics.meanAveragePrecision
    print 'Mean precisionAt', sum([0, 0, 0, 0, 0.2]) / 5
    

    生产者:

    1 0.0
    2 0.0
    3 0.0
    4 0.0
    5 0.2
    meanAveragePrecision 0.04
    Mean precisionAt 0.04
    

    【讨论】:

      【解决方案2】:

      RankingMetrics 函数的工作原理基本上是每行有两个列表,

      1. 第一个列表是推荐的项目在这里订购很重要
      2. 第二个列表是相关项目

      例如在 PySpark 中(但对于 Scala 或 Java 应该是等效的),

      recs_rdd = sc.parallelize([
        (
          ['item1', 'item2', 'item3'],  # Recommendations in order
          ['item3', 'item2']  # Relevant items - Unordered
        ),
        (
          ['item3', 'item1', 'item2'],  # Recommendations in order
          ['item3', 'item2']  # Relevant items - Unordered
        ),
      ])
      
      from pyspark.mllib.evaluation import RankingMetrics
      rankingMetrics = RankingMetrics(recs_rdd)
      print("MAP: ", rankingMetrics.meanAveragePrecision)
      

      这会打印出0.7083333333333333 的MAP 值,计算公式为

      (
        (1/2 + 2/3) / 2
        + (1/1 + 2/3) / 2
      ) / 2
      

      等于 0.708333

      1. 第 1 行为(1/2 + 2/3) / 2
        1. 1/2:位置 2 或更少的 1 项相关
        2. 2/3:位置 3 或更少的 2 个项目是相关的
        3. 2 : 第 1 行有 2 个相关项
      2. 第 2 行为(1/1 + 2/3) / 2
        1. 1/1:位置 1 或更少的 1 项是相关的
        2. 2/3:位置 3 或更少的 2 个项目是相关的
        3. 2:第 2 行有 2 个相关项
      3. 还有 / 2,因为有 2 行

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 2016-01-25
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多