ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추천시스템 평가지표 | Offline Metric with Code
    Recommendation System 2023. 11. 8. 14:27

     

     

    목차

       

       

      목표1. 기존의 평가지표들을 추천시스템에 어떻게 적용하고 해석하는지 ?
      목표2. 추천시스템에서 사용되는 평가지표는 무엇인지 ?

      1. Basic Classification Metrics : Rank-less recommendation

       

      Example, k=3으로 가정
      USER TRUE PREDICT
      1 A B C D E (5) A C D E H (5)
      2 E F G H I (5) B D E F G (5)
      3 B D F G H (5) A E A C D F G H (8)

       

      Accuracy

      •  
      • 전체 set에서 긍정이라고 예측했는데 실제 긍정이었던 것(TP) + 부정이라고 예측했는데 실제 부정이었던 것(TN)의 비율
      • 추천시스템의 목표는 긍정(click, buy) 예측이며, true와 pred의 길이가 다르기 때문에 해석에 유의해야 할듯
      • Accuracy = (TP + FN)/ (TP + TN + FP + FN)

       

      Precision@k

      • 정밀도. 긍정이라고 예측한 것 중, 실제 긍정인 것
      • 추천시스템에서는 추천 결과가 최대한 밀도 있게 좋은 아이템으로 구성되는 것이 목적
      • Precision = TP / (TP+FP)
      • 예시
        • USER1 precision = 1 = 3/3
        • USER2 precision = 0.3 = 1/3
        • USER3 precision = 0 = 0/3
      y_pred = y_pred[:k] #예측한 아이템 중 topK만 평가함
      precision_ak_k = len(set(y_true) & set(y_pred)) / k

       

      Recall@k

      • 재현율. 실제 긍정인 것 중, 긍정이라고 예측한 것
      • 유저가 좋다고 하는(했던) 아이템을 최대한 놓치지 않는 것. (다만 추천시스템은 offline metric이 실제 online test의 성능과 직결되지 않으므로 과거의 것을 최대한 놓치지 않는것에 대한 중요성이 낮음. 다양성도 고려해야 하며, 유저의 취향은 변화하며  기 때문에 reacll보다는 precision을 더 많이 쓸 것 같음)
      • Recall = TP / (TP+FN)
      • 예시
        • USER1 recall = 0.6 = 3/5
        • USER2 recall = 0.2 = 1/5
        • USER3 recall = 0 = 0/5
      y_pred = y_pred[:k] #예측한 아이템 중 topK만 평가함
      recall_ak_k = len(set(y_true) & set(y_pred)) / len(y_true)

       

      F1-score@k

      • Precision과 Recall의 조화평균
      • F1 = 2*(Precision*Recall) / (Precision + Recall)

       

      AUC

      • TP rate와 (1-TN) rate의 비율을 그래프로 그려 면적을 구한 값. threshold에 따른 변화를 기준으로 분류 모델의 성능을 측정함
      • AUC = Area Under the ROC Curve

       

      Hit@k

      • pred@k 중, true가 1개라도 있으면 1, 아니면 0
      • 예시
        • USER1 Hit = 0.8
        • USER2 Hit = 0.6
        • USER3 Hit = 0.62

       

      공통

      • 앞선 예시는 유저별 점수였고, 최종적으로 모든 유저를 고려한 모델의 score는 유저별 점수를 평균하면 됨
      • k로 갯수를 조정했다고는 하지만, 맞춘 순서를 고려한 것은 아니므로  true와 pred의 갯수와 순서에 따라 해석을 조심해야 함
      • 최종적으로 추천할 k가 적다면 순서를 고려하지 않는 방법을 써도 괜찮을 듯함. 

      2. Rank-aware recommendation metrics

      • 순서에 따른 가중치를 주는 metric. (주로)스크롤이 많을 경우 = 추천@k가 많을 경우 사용에 적합

       

      MRR(Mean Reciprocal Rank)

      • pred 중 처음으로 맞춘 아이템이 가장 상위에 위치해야 할 때 사용.
      • Fresh한 item보다 Relevance가 높은 item을 추천하고 싶을 때 좋은 평가 기준이 되지만, 나머지 부분에 대해서는 평가하지 않음
      • K가 하나뿐이거나, 가장 상위의 item rank에 집중할 때 유용한 평가 방법
      Example, k=3으로 가정
      USER TRUE PREDICT
      1 A B C D E (5) A C D E H (5)
      2 E F G H I (5) B D E F G (5)
      3 B D F G H (5) A E A C D F G H (8)
      • MRR
        • Rank : 처음으로 나온 아이템의 순서
          • USER1 rank = 1 , USER2 rank = 3, USER3 rank = 0
        • Reciprocal Rank : score는 높을수록 좋으나, rank값은 낮을수록 좋은 상태이니 역수 취하기
          • USER1 reciprocal rank = 1 , USER2 reciprocal rank = 1/3 , USER3 reciprocal rank = 0
        • MRR : 전체 유저에 대해
          • (1+1/3+0) / 3 = 0.444
      # 예측 된 아이템 중 상위 k개만
      recall_ak_k = y_pred[:k]
      mrr_ak_k = 0
      for i, p in enumerate(y_pred):
          if p in y_true:
              mrr_ak_k = 1 / (i+1)
              break
      
      # 이후 user별 평균을 구하면 모델에 대한 mrr

       

      MAP(Mean Average Precision)

      • precision@k 의 k를 점점 늘려가면서, 긍정이라고 예측했을 때 실제 긍정일 경우 Precision을 구하고 평균
      • pred 내에서 위치(순서)를 고려함. 그러나 binary classification에만 쓸 수 있음. regression X
      Example, k=3으로 가정
      USER TRUE PREDICT
      1 A B C D E (5) A C D E H (5)
      2 E F G H I (5) B D E F G (5)
      3 B D F G H (5) A E A C D F G H (8)
      • MAP
        • Average Precision
          • USER1, (1/1(k=1이므로) + 2/2(k=2) + 3/3) / 3 = 1
          • USER2, (k=1, 2일때 아무것도 맞추지 못함, 1/3) / 3 = 0.111111
          • USER3, (k=1,2,3일 때 아무것도 맞추지 못함) = 0
        • MAP : 전체 유저에 대해
          • (1 + 0.1111 + 0) / 3 = 0.37
      # 예측 된 아이템 중 상위 k개만
      y_pred = y_pred[:k]
      
      score = 0.0
      num_hits = 0
      for i ,p in enumerate(y_pred):
          if p in y_true:
              num_hits += 1
              score += num_hits / (i+1)
      map_at_k = score / min(len(y_true), k)
      
      # 이후 user별 평균을 구하면 모델에 대한 map

       

      NDCG(Normalized Discounted Cumulative Gain)

      • 추천 순서 뿐만 아니라, 실제 좋아한 아이템에 대한 유저의 선호도(relevance)가 존재할 때 선호도를 score에 반영
      • MRR과 MAP가 binary하게 선호도를 본 것과 달리, continuous한 값으로 선호를 표현할 수 있음
      • 정규화된 값이기 때문에 유저마다 추천된 K가 다르더라도 비교할 수 있음
      • relevance를 정의할 수 있는 데이터가 필요함
      Example, k=5으로 가정
      USER TRUE PREDICT
      1 A B C D E (5) A C D E H (5)
      2 E F G H I (5) B D E F G (5)
      3 B D F G H (5) A E C D F G H (7)
      • rel_i : TRUE에 대한 유저의 선호도(relevant). (아래처럼 있다고 가정해보자). 선호도를 binary하게 볼 수도 있음
        • USER1 rel_i = [3,5,4,2,3]
        • USER2 rel_i = [4,3,2,5,4]
        • USER3 rel_i = [5,2,3,4,3]
      • CG(Cumulative Gain) : 예측한 긍정 중 실제 긍정한 아이템의 선호도(rel_i) 총합
        • USER1 CG = 3(A) + 4(C) + 2(D) + 3(E) = 12
        • USER2 CG = 4(E) + 3(F) + 2(G) = 9
        • USER3 CG = 2(D) + 3(F) = 5
      • DCG(Discounted \ CG) : CG를 log_2(k+1) 로 나눈 값. 위치 반영을 위함. 순서가 앞에 올수록 분모가 작아져서 크게 반영함.
        • USER1 DCG = 3/log2 + 4/log3 + 2/log4 + 3/log5 = 7.82
        • USER2 DCG = 4/log2 + 3/log3 + 2/log4 = 6.89
        • USER3 DCG = 2/log2 + 3/log3 = X
      • IDCG : DCG가 가장 높게 나올 경우의 이상적인 DCG값. CG를 내림차순 정렬하여 계산하는 것임. 예측한 긍정이 이 순서대로 나왔다면 베스트였을 텐데 ~ 느낌
        • USER1 IDCG = 4/log2 + 3/log3 + 3/log4 + 2/log5 = 8.25
        • USER2 IDCG = 4/log2 + 3/log3 + 2/log4 = 6.89
        • USER3 IDCG = 3/log2 + 2/log3 = Y
      • nDCG(DCG/IDCG) : 산출된 DCG를 가장 이상적인 DCG값인 IDCG로 normalize해준 값. k값이 커질수록(추천을 많이 할수록) DCG값 자체는 커지기 때문에 normalize해주는 것.
        • USER1 nDCG = 7.82/8.25 = 0.95
        • USER2 nDCG = 6.89/6.89 = 1
        • USER3 nDCG = X / Y
      # 예측 된 아이템 중 상위 k개만
      y_pred = y_pred[:k]
      
      # DCG at k, 선호도를 모두 1, 0으로 봤을 때
      dcg = sum([int(p in y_true) / np.log2(i+2) for i, p in enumerate(y_pred)])
      # IDCG at k
      idcg = sum([1 / np.log2(i+2) for i in range(min(len(y_true), k))])
      # nDCG at k
      nDCG_at_k = dcg / idcg

       

       


      3. Additional metrics

       

      Coverage

      • history에 있는 total unique items / user에게 뿌려지는 total unique items
      • coverage가 높을수록 다양한 item이 추천된다.
      • training과 testing set을 분리하지 않아도 계산할 수 있다.

       

      Gini index

      • 원래는 소득 불평등인데, 아이템이 추천된 횟수의 불평등을 나타낼 수 있음.
      • 0~1 사이
      • low gini index -> high diversity

       

      Entropy of the probability distribution

      • I : 전체 아이템
      • p(i) : 추천 모델이 i를 추천할 확률.
      • low entropy -> high diversity

       

      Average reward at K

      • 앞선 metric이 relevance한 item을 목표로 한다면, 해당 metric은 추가적인 목적을 위해 최적화하는데 사용됨. k = 25, reward는 목적에 따라 interaction 데이터 중 시청시간, revenue 등으로 지정
      • 추천 후 사용자의 행동을 기반으로 다시 평가하기 때문에 사후 평가의 역할을 함
      • 0~1 사이의 값을 가지며, 값이 클수록 평균적으로 user rewards가 많다고 해석
      • 예시
        • k = 3, rewards = revenue일 경우, item(revenue)로 표시
        • recommendations of user i = [A,B,C,D,E,F,G,H,I,J]
        • user i’s interaction with recommendation = [A(10), B(5), C(15), D(1), E(8)]
        • rewards per user = (15+10+8) / (19+5+15+1+8)
        • average rewards = average of rewards per user

      댓글

    Designed by Tistory.