추천 시스템을 평가하는 전반적인 지표는 아래의 포스트에서 확인할 수 있다.
https://glanceyes.tistory.com/entry/추천-시스템-추천-시스템과-평가-지표
Top-K Ranking 추천시스템을 평가하는 지표
평점 예측 문제
평점 예측(Rating Prediction) 문제는 real-value로 이루어진 explicit feedback을 예측하는 태스크에 주로 사용되는데, explicit feedback은 영화의 별점과 같이 사용자의 선호에 대한 명시적인 정보를 제공한다.
사용자가 예측한 평점을 잘 맞추는지 아닌지만 평가하면 되므로 RMSE를 최적화하는 것 외의 크게 추천 시스템을 평가할 만한 대표적인 지표가 존재하지는 않는다.
Top-K Ranking 문제
가장 높은 K개의 ranking을 구하는 문제는 0과 1의 value로 이루어진 implicit feedback을 예측하는 태스크에서 주로 사용된다.
클릭, 구매 등의 implicit feedback은 사용자의 선호에 관한 암시적인 정보만을 제공한다.
Regression 또는 Classification 두 가지로 모두 풀 수 있는데, 각자의 방법으로 ranking을 수행한 후 Recall@K 또는 NDCG@K와 같은 Top-K metric을 활용해서 평가를 수행한다.
Top-K ranking 태스트에서는 $f(u, i)$의 예측이 rating prediction과 유사하게 이루어지지만, 여기서는 사용자에 대한 compatibility score를 계산하고 이를 ranking하여 추천 결과를 생성한다.
$$ rec(u) = \underset{i \in I \setminus I_u}{\arg \max} f(u,i) $$
주로 평가할 때는 상위 K개의 추천 중 몇 개가 유효한지를 구하는데, 대표적인 metric으로 Recall@K를 사용한다.
이는 상위 K개의 추천 결과 중 관련 있는 개수를 의미한다.
$$ \text{Recall@}K = \frac{1}{|U|} \sum_{u \in U} \frac{\{ i \in I_u | rank_u(i) \le K \}}{ |I_u| } $$
def precision_at_k(actual, predicted, k):
act_set = set(atcual)
pred_set = set(predicted[:k])
result = len(act_set & pred_set)
prec = result / float(k)
# normalized_prec = result / float(min(len(act_set), k)) 정규화해줄 때 필요한 부분
return prec
여기서 $rank_u(i)$는 사용자 $u$를 위한 추천 결과에서 아이템 $i$가 랭크된 위치를 뜻한다.
Precision@K에서는 Recall@K와는 다르게 분모 부분이 $K$로 변경된 것을 알 수 있다.
$$ \text{Precision@}K = \frac{1}{|U|} \sum_{u \in U} \frac{\{ i \in I_u | rank_u(i) \le K \}}{ |I_u| } $$
def recall_at_k(actual, predicted, k):
act_set = set(atcual)
pred_set = set(predicted[:k])
result = len(act_set & pred_set)
recall = result / float(len(act_set))
return recall
이외에도 Mean rciprocal Rank(MPR), NDCG@K 등 보다 직접적으로 순위를 고려하는 metric들이 존재한다.
$$ MPR = \frac{1}{|U|} \sum_{u \in U } \frac{1}{rank_u(i_u)} $$
$$ \text{DCG@}K = \sum_{i \in \{ i | rank_u(i) \le K\}} \frac{y_{u,i}}{\log_2(rank_u(i) + 1)} $$
여기서 $y_{u,i}$는 아이템의 클릭 여부 등 binary label이 되거나 연관성 score가 될 수 있다.
출처
1. 네이버 커넥트재단 부스트캠프 AI Tech RecSys Track