2016-06-22 2 views
1

spark RankingMetrics.meanAveragePrecision을 사용하려고합니다. 그러나 예상대로 작동하지 않는 것 같습니다.Spark (Scala)의 RankingMetrics

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 그러나 MeanAveragePrecision의 RankingMetric 값은 0.2이며 1/25이어야합니다.

감사합니다.

답변

0

문제는 입력 데이터라고 생각합니다. 예상/실제 데이터에 관련성 점수가 포함되어 있기 때문에 0/1 점수를 사용하여 평가하려는 경우 순위를 측정하는 것이 아니라 binary classification metrics을 찾아야한다고 생각합니다.

RankingMetrics는 순위가 매겨진 항목의 두 목록/배열을 대신 기대하므로, 점수를 문서 ID로 바꾸면 예상대로 작동합니다.

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 
다음 PySpark의 예제는 5 항목과 일치하는지 두 목록에있다