이번 글에서는 추천시스템의 오프라인 성능 평가 방법에대해 알아보려한다.

Recsys의 평가지표는 크게 3가지로 나눌 수 있다.

  1. 평점 예측 기반 평가 지표: MAE, RMSE
  2. Ranking 기반 평가 지표: Precision/Recall@K, MAP@K, NDCG@K, Hit Rate
  3. 특성 평가 지표: Coverage, Diversity, Novelty, Churn, Serendipity, Responsiveness

평점 예측 기반

출처: 코드잇

평점 예측 기반이란 위 그림과 같이 비어있는 평점을 예측하고 이를 정닶값과 비교하여 평가하는 방법이다. 예를 들어, 영훈이는 영화 러브 액츄얼리를 보지 않았지만 이를 머신러닝을 이용하여 예측할 수 있다.

RMSE (Root Mean Squared Error)

MSE가 아닌 RMSE를 더 많이 사용하는 이유는 무엇일까? MAE는 제곱으로 인해 이상치에 대해 너무 민감하다. 또한 오차가 0과 1 사이인 경우에, MSE에서 그 오차는 본래보다 더 작게 반영된다. 이러한 단점 때문에 MSE 대신 RMSE가 더 많이 사용된다.

MAE (Mean Absolute Error)

일반적으로 MAE보다 RMSE를 더 많이 사용한다. 그 이유는 RMSE가 이상치에 대해 더 민감하게 작용하기 때문이다. 아래의 그림을 보면 더 쉽게 이해가 가능하다.

출처: https://jysden.medium.com/

오른쪽 그래프인 MAE의 경우에, 각 examples에 대한 오차는 모두 동일하게 가중되어 고려되고 있다. 반면에, 왼쪽 그래프인 RMSE는 0과 1 사이의 오차는 더 작게, 1 보다 큰 오차는 더 크게 가중되어 고려되고 있다.

그렇다면 RMSE가 무조건적으로 좋은걸까?
그렇지않다. 이상치의 영향을 적게 받으면서 모델을 만들고자 할 때는 MAE를 사용하는 것이 적절하다. MAE는 이상치에 대해 강건robust하기 때문에 이상치에 영향을 덜 받는다. 이는 이상치를 포함한 훈련 데이터에 적합하게 학습되어 unseen 데이터에 대해 낮은 성능을 보이게 하는 오버 피팅을 방지하는 데 도움이 될 수 있다. 반대로 모델 학습 시 이상치에 가중치를 부여하고자 한다면, MSE에 루트를 씌운 RMSE를 채택하는 것이 적절하다.

Ranking 기반

이 글에서는 Ranking은 사용자에게 Top N개의 상품을 추천해주는 것이라 이해하고 읽으면 충분하다.

Precision/Recall@K

Confusion Matrix의 Precision과 Recall이 맞다. @K의 의미는 Top-K개의 결과물로 Precision과 Recall의 결과물을 계산한다는 의미이다.

출처: https://sungkee-book.tistory.com/11

위의 그림에서 10개의 item 중 5개를 추천하였다.

Precision은 추천한 5개 item(A, B, C, D, E) 중 User가 좋아요를 표시한 item(A, B, C) 3개를 분자에 놓고 계산한다. Precision의 분자인 True Positive 는 3(A, B, C)이 되고, 분모인 True Positive+False Positive는 추천한 item의 개수=5(A, B, C, D, E)이 된다.

Recall도 추천한 5개 item(A, B, C, D, E) 중 User가 좋아요를 표시한 item(A, B, C) 3개를 분자에 놓고 계산한다. Recall의 분자인 True Positive 는 3(A, B, C)이 되고, 분모인 True Positive+False Nagative는 User가 좋아요를 누른 item의 개수=6(A, B, C, H, I, J)이 된다.

MAP@K

MAP는 Mean Average Presicion의 약자이다. Mean과 Average 둘 다 해석하자면 평균을 의미하는데 과연 무슨 뜻일까?

AP

AP부터 살펴보자면 한 User에 대해 추천한 Item의 Precision을 순서대로 구해 relevance와 계산하고 더해 평균을 구한 값이다. 여기서 rel(i)는 binary값이다. 이렇게 말하면 이해하기 어려우니 아래의 그림을 통해 더 쉽게 이해해보자.

출처: https://sungkee-book.tistory.com/11

Precision@i추천한 아이템 개수 K중에서 해당 인덱스까지만 고려했을 때의 Precision 값이다. 예를 들어, Precision@1은 가장 처음에 나오는 아이템을 하나만 추천했을 때의 Precision 값이다. 그림의 예시를 보면, User A는 가장 처음에 추천한 아이템 A를 좋아했으므로 Precision@1의 값은 1/1=1이고, Precision@21/2이다.

rel(i)는 relevence를 나타내는데, 해당 아이템을 사용자가 좋아했는지 여부를 나타낸다. Precision에 relevence 값을 곱해주는 이유는 정답 아이템이 추천 목록 중에서 딱 해당 순위에만 영향력을 주도록 하기 위함이다. 정답이 1개 있다고 가정했을 때 똑같이 3개의 아이템을 추천했어도, 정답을 첫 번째로 추천한 경우가 두번째, 또는 세번째에 추천한 것보다 AP 점수가 높아진다.

만약 K가 3이라면, Precision@1*rel(1) + Precision@2*rel(2) + Precision@3*rel(3) 각각을 구해서 더해야 한다. 수식의 m모든 아이템 중에서 사용자가 좋아한 아이템 수이다. 위 그림을 보면, User A와 User B 둘 다 전체 아이템 중 2개를 좋아했고, 하나가 추천 목록에 포함된다. 그러나 사용자가 좋아한 아이템의 추천 순서가 높았는지 낮았는지에 따라 AP값이 크게 차이난다. User A는 첫번째에 맞췄기 때문에 User B에 비해 점수가 훨씬 높다. 이렇듯 순서를 평가 지표에 반영한 것이 AP이다.

참고로 m>K 일 때. 즉, 실제로 유저의 취향인 제품 개수가 추천시스템이 추천해줄 제품 개수보다 클 때는 주의해야할 점이 있다. 추천시스템이 m개 만큼 추천할 수 없기 때문에 AP값이 unfair 되는 것을 막기 위해 표준화(Normalization)를 수행해주어야 한다.

MAP

MAP@K는 모든 유저에 대한 AP@K의 평균을 의미한다. U는 User 집합을, U 는 유저의 수를 나타낸다. 각 User의 AP@K값을 모두 더한 후 User 수로 나누어주면 MAP@K를 구할 수 있다.

NDCG@K

NDCG는 원래 검색 분야에서 등장한 지표이나 추천 시스템에도 많이 사용되고 있다. NDCG@K값은 1에 가까울수록 좋다. MAP는 사용자가 선호한 아이템이 추천 리스트 중 어떤 순서에 포함되었는지 여부에 대해서 1 or 0으로만 구분하지만, NDCG@K는 순서별로 가중치 값(관련도, relevance)을 다르게 적용하여 계산한다.

Relevance?

Relevance란, 사용자가 특정 아이템과 얼마나 관련이 있는지를 나타내는 값이다. Relevance값은 정해진 것이 아니고 추천의 상황에 맞게 정해야 한다. 예를 들어, 신발 추천인 경우 사용자가 해당 신발을 얼마나 클릭했는지, 혹은 클릭 여부(Binary) 등 다양한 방법으로 선정할 수 있다.

NDCG를 구하려면 CG,DCG, IDCG에 대해 알아야한다.

출처: https://sungkee-book.tistory.com/11

Cumulative Gain(CG)

CG는 추천한 아이템의 Relevance 합이다. 두 추천 모델이 순서에 관계없이 동일한 아이템 셋을 추천한 경우 두 모델의 CG는 같아진다. 즉, 순서를 고려하지 않은 값이다.

Discounted Cumulative Gain(DCG)

CG에 순서에 따른 할인(Discount) 개념을 도입한 것이 DCG이다. 추천 아이템의 순서가 뒤에 있을수록 분모가 커짐으로써 전체 DCG에 미치는 영향력이 작아진다. DCG 값이 높으려면 초반 아이템을 잘 추천해주는게 중요하다. 그러나 사용자별로 추천 아이템의 수가 다른 경우 정확한 성능 평가가 어렵다는 한계점이 존재한다. 예를 들어, 쇼핑몰에서 클릭한 신발 수가 5개인 사용자와 50개인 사용자에게 추천되는 아이템의 수는 다를 수밖에 없다. 추천 아이템의 수가 많아질수록 DCG값은 증가하기 때문에, 정확한 평가를 위해서는 Scale을 맞출 필요가 있다.

Ideal DCG(IDCG)

분모는 DCG와 같고, 분자의 rel opt는 가장 이상적인 추천 결과를 말한다. 즉, User가 선호하는 순서대로 이상적으로 추천한 경우를 의미한다. 위 NDCG 그림 예시에서 IDCG를 구하는 과정을 보면 가장 이상적인 경우는 Relevance가 높은 순서대로 A(3), D(3), B(2) 이렇게 3개를 추천해주는 것이다.

NDCG

앞서 말한 DCG의 한계점을 보완하기 위해 DCG에 IDCG를 나눠줌으로써 정규화를 적용한 것이 NDCG이다. 결론적으로, NDCG@K는 가장 이상적인 추천 조합 대비 현재 모델의 추천 리스트가 얼마나 좋은지를 나타내는 지표이다. 그리고 정규화를 함으로써 NDCG는 0~1사이의 값을 가지게 된다.

Hit Rate

Hit rate는 전체 User 중 적중한 User의 비율을 의미한다. 여기서 적중(Hit)이란 train dataset에서 1개의 item을 제외하고 학습시킨 뒤, inference 시 제외시켰던 item이 포함되면 Hit이다. 전체 사용자 수 대비 Hit한 사용자 수 비율을 구하면 Hit Rate가 된다.

ARHR(AVERAGE RECIPROCAL HIT RANK)

Hit rate는 binary로 값이 Hit면 0, 아니면 1이 되었고 rank less metric이기 때문에 사용하기에는 한계가 있다. 이를 보완하여 Hit에 ranking을 적용하기 위해 사용하는 Metric이다. rank의 역수를 Hit 수만큼 더한 후 User의 수로 나눠주면 된다.

AP

AP부터 살펴보자면 한 User에 대해 추천한 Item의 Precision을 순서대로 구해 relevance와 계산하고 더해 평균을 구한 값이다. 여기서 rel(i)는 binary값이다. 이렇게 말하면 이해하기 어려우니 아래의 그림을 통해 더 쉽게 이해해보자.

출처: https://sungkee-book.tistory.com/11

Precision@i추천한 아이템 개수 K중에서 해당 인덱스까지만 고려했을 때의 Precision 값이다. 예를 들어, Precision@1은 가장 처음에 나오는 아이템을 하나만 추천했을 때의 Precision 값이다. 그림의 예시를 보면, User A는 가장 처음에 추천한 아이템 A를 좋아했으므로 Precision@1의 값은 1/1=1이고, Precision@21/2이다.

rel(i)는 relevence를 나타내는데, 해당 아이템을 사용자가 좋아했는지 여부를 나타낸다. Precision에 relevence 값을 곱해주는 이유는 정답 아이템이 추천 목록 중에서 딱 해당 순위에만 영향력을 주도록 하기 위함이다. 정답이 1개 있다고 가정했을 때 똑같이 3개의 아이템을 추천했어도, 정답을 첫 번째로 추천한 경우가 두번째, 또는 세번째에 추천한 것보다 AP 점수가 높아진다.

만약 K가 3이라면, Precision@1*rel(1) + Precision@2*rel(2) + Precision@3*rel(3) 각각을 구해서 더해야 한다. 수식의 m모든 아이템 중에서 사용자가 좋아한 아이템 수이다. 위 그림을 보면, User A와 User B 둘 다 전체 아이템 중 2개를 좋아했고, 하나가 추천 목록에 포함된다. 그러나 사용자가 좋아한 아이템의 추천 순서가 높았는지 낮았는지에 따라 AP값이 크게 차이난다. User A는 첫번째에 맞췄기 때문에 User B에 비해 점수가 훨씬 높다. 이렇듯 순서를 평가 지표에 반영한 것이 AP이다.

참고로 m>K 일 때. 즉, 실제로 유저의 취향인 제품 개수가 추천시스템이 추천해줄 제품 개수보다 클 때는 주의해야할 점이 있다. 추천시스템이 m개 만큼 추천할 수 없기 때문에 AP값이 unfair 되는 것을 막기 위해 표준화(Normalization)를 수행해주어야 한다.

MAP

MAP@K는 모든 유저에 대한 AP@K의 평균을 의미한다. U는 User 집합을, |U|는 유저의 수를 나타낸다. 각 User의 AP@K값을 모두 더한 후 User 수로 나누어주면 MAP@K를 구할 수 있다.

NDCG@K

NDCG는 원래 검색 분야에서 등장한 지표이나 추천 시스템에도 많이 사용되고 있다. NDCG@K값은 1에 가까울수록 좋다. MAP는 사용자가 선호한 아이템이 추천 리스트 중 어떤 순서에 포함되었는지 여부에 대해서 1 or 0으로만 구분하지만, NDCG@K는 순서별로 가중치 값(관련도, relevance)을 다르게 적용하여 계산한다.

Relevance?

Relevance란, 사용자가 특정 아이템과 얼마나 관련이 있는지를 나타내는 값이다. Relevance값은 정해진 것이 아니고 추천의 상황에 맞게 정해야 한다. 예를 들어, 신발 추천인 경우 사용자가 해당 신발을 얼마나 클릭했는지, 혹은 클릭 여부(Binary) 등 다양한 방법으로 선정할 수 있다.

NDCG를 구하려면 CG,DCG, IDCG에 대해 알아야한다.

출처: https://sungkee-book.tistory.com/11

Cumulative Gain(CG)

CG는 추천한 아이템의 Relevance 합이다. 두 추천 모델이 순서에 관계없이 동일한 아이템 셋을 추천한 경우 두 모델의 CG는 같아진다. 즉, 순서를 고려하지 않은 값이다.

Discounted Cumulative Gain(DCG)

CG에 순서에 따른 할인(Discount) 개념을 도입한 것이 DCG이다. 추천 아이템의 순서가 뒤에 있을수록 분모가 커짐으로써 전체 DCG에 미치는 영향력이 작아진다. DCG 값이 높으려면 초반 아이템을 잘 추천해주는게 중요하다. 그러나 사용자별로 추천 아이템의 수가 다른 경우 정확한 성능 평가가 어렵다는 한계점이 존재한다. 예를 들어, 쇼핑몰에서 클릭한 신발 수가 5개인 사용자와 50개인 사용자에게 추천되는 아이템의 수는 다를 수밖에 없다. 추천 아이템의 수가 많아질수록 DCG값은 증가하기 때문에, 정확한 평가를 위해서는 Scale을 맞출 필요가 있다.

Ideal DCG(IDCG)

분모는 DCG와 같고, 분자의 rel opt는 가장 이상적인 추천 결과를 말한다. 즉, User가 선호하는 순서대로 이상적으로 추천한 경우를 의미한다. 위 NDCG 그림 예시에서 IDCG를 구하는 과정을 보면 가장 이상적인 경우는 Relevance가 높은 순서대로 A(3), D(3), B(2) 이렇게 3개를 추천해주는 것이다.

NDCG

앞서 말한 DCG의 한계점을 보완하기 위해 DCG에 IDCG를 나눠줌으로써 정규화를 적용한 것이 NDCG이다. 결론적으로, NDCG@K는 가장 이상적인 추천 조합 대비 현재 모델의 추천 리스트가 얼마나 좋은지를 나타내는 지표이다. 그리고 정규화를 함으로써 NDCG는 0~1사이의 값을 가지게 된다.

Hit Rate

Hit rate는 전체 User 중 적중한 User의 비율을 의미한다. 여기서 적중(Hit)이란 train dataset에서 1개의 item을 제외하고 학습시킨 뒤, inference 시 제외시켰던 item이 포함되면 Hit이다. 전체 사용자 수 대비 Hit한 사용자 수 비율을 구하면 Hit Rate가 된다.

ARHR(AVERAGE RECIPROCAL HIT RANK)

Hit rate는 binary로 값이 Hit면 0, 아니면 1이 되었고 rank less metric이기 때문에 사용하기에는 한계가 있다. 이를 보완하여 Hit에 ranking을 적용하기 위해 사용하는 Metric이다. rank의 역수를 Hit 수만큼 더한 후 User의 수로 나눠주면 된다.

References