DanialDaeHyunNam / danthetech-comments

Repository for comments by utterance
0 stars 0 forks source link

DataScience/evaluation-metrics-for-recommendation-system #3

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

추천시스템 평가 방법 Mean Average Precision(MAP) 이란? | DanTheTech

About 이번 블로그에서는 주로 정보를 순서를 지정하여(Ranked) 반환하는 경우에 사용하는 평가방법인 을 소개하고자 한다. 은 예를들어 구글과 같은 검색엔진에서 검색결과가 검색의도와 관련도가 높은 순으로 잘 나열되어있는지를 평가하는 방법이다.

https://danthetech.netlify.app/DataScience/evaluation-metrics-for-recommendation-system

bonobon0410 commented 3 years ago

안녕하세요, 글 너무 잘 읽었습니다.

  1. 하단부의

또 한가지 중요한 점은 앞에 곱해지는 값인 1/m은 변하지 않는 값이므로 설사 뒷쪽에 추천하는 모든 값이 틀리더라도 AP값은 변하지 않는다는 것. 즉, 추천을 더 많이 한다하여 AP는 절대 내려가지 않는다는 의미이며, (우리가 노력해야하는 부분은 제대로된 추천을 최대한 앞에 하는 것이라는 것이다.)

이 부분에 대한 제 이해가 조금 부족한 것 같습니다. 마지막의 괄호 부분은 이해했으나, 앞 부분을 이해하지 못했습니다.

또 한가지 중요한 점은 앞에 곱해지는 값인 1/m은 변하지 않는 값이므로 설사 뒷쪽에 추천하는 모든 값이 틀리더라도 AP값은 변하지 않는다는 것.

[1,0,0]에 비해 [1,0,1], [1,1,0], [1,1,1]의 AP 값은 높을 것이라고 생각했습니다.

즉, 추천을 더 많이 한다하여 AP는 절대 내려가지 않는다는 의미이며,

이 경우는 m이 변하는 상황을 생각해보면, [1,0,0]에 비해 [1,0,0,0], [1,0,0,0,0] 등의 AP 값이 더 낮을 것이라고 생각했습니다. 따라서, 추천을 더 많이 하는 경우 AP는 내려갈 수 있지 않을까요?

  1. AP를 구하는 방법을 PR curve의 곡선 아래 면적으로 알고 있었습니다. 제가 해당 방법으로 구했을 떄는 글의 방법으로 구했을 때 구해주신 AP 값인 0.38가 나오지 않았습니다. 우하향하는 모양이 아닌 우상향하는 PR curve가 그려졌는데, 이 방법으로 구할 때 0.38이 어떻게 계산되는지 궁금합니다.

감사합니다. 어지러운 현 상황에서 건강하시길 바랍니다.

DanialDaeHyunNam commented 3 years ago

안녕하세요! 죄송하게도 답글이 너무 늦었습니다.

  1. 지적해주신 부분이 맞습니다. 내려가지 않는다가 맞습니다! 감사합니다. :pray:

또한, 남겨주신 댓글을 보고 다시 찾아보고 고민을 해봤는데 m은 변하는 값이 맞습니다. 그나마 변하지 않는 값은 K라고 할 수 있습니다. 우리가 N개를 추천하지만 N > K인 경우에 Top K까지만 보고 평가를 하겠다고 결정하는 것이어서 그렇습니다.

어쨌든 그러한 이유로 해당 문구는 제거했습니다.

  1. 우상향은 맞는데 위에서 제시한 공식대로 계산하면 값이 0.38이 쉽게 구해지긴 합니다만 혹시 어떻게 접근하셨나요?
recoms = [0, 1, 1, 0, 1]
# m = 3
k = 3
num_actual_engagement = 3 
precs = []
recalls = []
recoms_to_be_evaluated = recoms[:k]

for indx, rec in enumerate(recoms_to_be_evaluated):
    precs.append(sum(recoms[:indx+1])/(indx+1))
    recalls.append(sum(recoms[:indx+1])/num_actual_engagement)

print(precs)
print(recalls)
print(
    'average precision at k',
    (1/num_actual_engagement * np.array(precs)).sum(),
)

# output: 
[0.0, 0.5, 0.6666666666666666]
[0.0, 0.3333333333333333, 0.6666666666666666]
average precision at k 0.38888888888888884

도움이 되었을까요?

부족한 블로그 읽어주셔서 감사합니다! :+1:

odk-chuky commented 3 years ago

Recommendations Precision @k (k=3) AP@k (k=3) [1, 0, 0] [1/1, 1/2, 1/3] (1/3)(1) = 0.33 [0, 1, 0] [0, 1/2, 1/3] (1/3)[(1/2) + (1/3)]= 0.28 [0, 0, 1] [0, 0, 1/3] (1/3)(1/3) = 0.11

안녕하세요, 위의 부분에서 두 번째 [0, 1, 0] 에 대한 AP@k 계산 부분이 참고자료에 달린 원문과 다른 것 같습니다. 추천한 세 개의 아이템 중 하나에 대해서만 interaction 이 있었으니 AP@k 의 계산식이 (1/3)*(1/2) = 0.15 가 되는 게 아닐까 합니다. 원문에도 그렇게 되어있는 것 같습니다.

HeainLee commented 1 year ago

AP에 대한 예시가 잘못된거 같습니다. 모두 1/3로 나눈 것이 아니고 관련성있는 아이템 갯수로만 나누는 겁니다. 혹시 이 블로그를 보시는 분이 계시면, 그 글을 유의해서 읽으시길 바랍니다.

yonghyeokrhee commented 7 months ago

잘읽었습니다