본문 바로가기

Data Science/추천시스템과 NLP

[추천시스템] 추천 시스템의 성능은 어떻게 평가할까?

반응형

이번 포스팅에서는 추천 시스템(Recommend System)의 성능을 평가하는 여러가지 메트릭들에 대해 소개하려고 한다. 이 포스팅을 보다 깊게 이해하기 위해서 개인적으로 추천 시스템에 대한 종류와 개념을 우선적으로 숙지하는 것을 제안한다. 이전에 추천 시스템의 종류와 간단하게 Python으로 구현하는 방법에 대한 포스팅들을 게시한 적이 있다. 참고하려면 여기를 클릭하자.

 

추천 시스템을 평가하기 위한 메트릭들에 대해 소개하기에 앞서 간단하게 추천 시스템에 대한 개념을 짚고 넘어가자. 추천 시스템이란, 특정 제품들에 대한 사용자의 평가 또는 리뷰 등과 같은 데이터를 기반으로 이 사용자에게 비슷한 다른 제품을 추천해주는 것을 말한다. 

 

유튜브의 추천 알고리즘 성능은 무슨 기준으로 판단할까?

 

기존의 추천 시스템들은 머신러닝 모델처럼 하나의 label를 결과값으로 내뱉는 것이 아닌 제품들의 리스트를 평점 또는 유사도 등과 같은 특정 feature를 기준으로 내림차순으로 정렬하여 상위의 제품들을 사용자에게 추천하는 방식으로 이루어진다. 

 

그런데 예를 들어, A라는 영화를 시청한 사용자에게 평점, 리뷰 등을 기반으로 다른 영화 B,C,D 영화들을 추천해주는 추천 시스템을 만들었다고 가정하자. 그러면 이 "추천 시스템이 올바르게 사용자들의 취향 저격(?)을 해서 제대로 비슷한 제품들을 추천해주는 것인지 어떻게 시스템들 평가할까? 평가하는 기준이 뭘까?" 이제 이에 대해서 자세히 살펴보자. 목차는 다음과 같다.

 

1.  Long tail plot

2. MAP@K

3. Coverage

4. Personalization

5. Intra-list Similarity

1. Long tail plot

이 그래프는 추천 시스템을 만들고 평가하는 메트릭이라기 보다는 추천 시스템을 만들기 전에 제품들의 인기도를 관찰하는 그래프이다. User-item 간 interaction data(사용자들의 제품 클릭 수, 구매 횟수, 평가 등)에서 인기있는 패턴을 발견하기 위해 자주 사용된다. 다음 그림을 보자.

 

인기있는 제품이 얼마나 있는지 관찰해보자.

 

위 그림처럼 보통은 모든 제품들 중 극히 일부의 제품들만 높은 Interaction 값을 갖는다. 즉, 그래프의 연보라색 부분이 되겠다. 흡사 그림이 그래프의 머리쪽 부분만 차지한다고 하여 이를 head 라고 부르기도 한다.


이제 본격적으로 평가 메트릭에 대해서 살펴보자. 추천 시스템도 일반 머신러닝 모델과 동일하게 Train data에 기반하여 추천 제품들을 결과값으로 도출하고 이 추천 제품들이 Test data(실제 사용자의 취향인 제품들. 이를, relevant items라고 한다)와 얼마나 일치하는지에 따라 평가된다. 앞으로 등장할 메트릭들은 예측된 추천 제품들이 얼마나 관련성(relevancy)이 있는지, 얼마나 유용성(usefulness)이 있는지 두 개 모두를 평가하기 위한 방법들이다.

2. MAP@K

MAP란, Mean Average Precision이다. 여기서 K는 이후에 다루겠지만 "몇 개의 제품들을 고객에게 추천해줄 것인지"에서의 '몇 개' 이다. K에 대한 자세한 내용은 하단에서 다루겠다. 어쨌거나 MAP를 이해하기 위해서 우선 AP(Average Precision)에 대해서 이해해야 한다. 

2-1. AP란 무엇일까?

AP에서 P는 Precision이다. Precision...어디에선가 본 적이 있다. 바로 머신러닝 분류 문제 그 중에서도 이진(binary) 분류 문제에서 모델의 성능을 평가하기 위해 사용되는 대표적인 메트릭이다.(만약 Precision에 대해 기억이 잘 나지 않는다면 여기를 참고하자)

 

Precision은 분류 모델에서는 "모델이 True라고 예측했을 때, 실제 정답이 True인 비율" 을 뜻한다. 그렇다면 추천 시스템에서는 어떻게 적용될까?

 

이진 분류와 추천시스템에서의 용어 의미 비교

 

추천시스템에서의 Precision과 Recall의 정의

 

위 영어 표현을 한국어로 해석하게 되면 뜻이 모두 동일한 것 같고 애매모호 해진다. 필자도 이 부분에서 이해하느라 꽤나 시간이 걸렸던 기억이 난다. 그래서 한국인스럽게(?) 이해하기 위해서 간단한 예시를 들어서 설명해보려 한다.

 

예를 들어, User1 에게 추천 시스템이 추천 제품들로 금융 상품 A, B, C 3개를 추천해주었다. 그런데 User 1은 실제로 추가적으로 구매한 금융 상품들은 B, D, E, F 4개의 제품이었다. 그러면 여기서 추천 시스템이 정확히 예측한 추천 제품은 B 제품 1개이다.

 

이와 같은 상황일 때, 방금 든 예시에서 위 그림에서 사용되는 용어와 일일이 매핑시켜보자.

 

  • # of our recoomendations that are relevant : 추천 시스템이 정확히 예측한 B 제품 1개
  • # of items we recommended : 추천 시스템이 User 1에게 추천한 A,B,C 총 3개의 제품
  • # of all the possible relevant items : User 1이 실제로 추가적으로 구매한 B,D,E,F 총 4개의 제품

자, 이제 예시와 용어를 매핑시켰다. 그러면 Precision과 Recall을 계산해보자.

 

  • Precision = (추천 시스템이 정확이 예측한 B 제품 1개) / (추천 시스템이 User 1에게 추천한 총 3개의 제품) = 1 / 3
  • Recall = (추천 시스템이 정확히 예측한 B 제품 1개) / (User 1이 실제로 구매한 B,D,E,F 총 4개의 제품) = 1 / 4

그런데, 이렇게 Precision과 Recall을 계산하는 것으로만 끝이나면 문제가 있다. 바로 추천한 제품들 간의 순위(rank)를 고려하지 않았다는 점이다. 그래서 추천 제품들을 우선순위로 정렬 했을 때 상위 'K' 개수만 추천하라고 하는 Precision&Recall at cutoff 'K'를 사용한다. 

 

이름이 거창해보이지만 K가 붙었다고 해서 Precision, Recall을 계산하는 방식은 달라진 것이 없다. 단지 Precision, Recall을 계산할 때 '몇 개'의 제품들 중에서 Precision, Recall을 계산할 것인지 일종의 '범위'를 지정해준 것이다.

 

Precision&Recall at cutoff 'K'

 

자, 이제 추천 시스템에서 Precision을 어떻게 계산하는지 이해했을 것이다. 그러면 이 Precision을 평균하는 AP(Average Precision)에 대해서 알아보자. AP 구하는 공식인 수학적 수식을 살펴보자.(수식을 보고 겁먹지 말자! 천천히 하나씩 뜯어보자!)

 

AP 공식

 

우선, 공식의 미지수(m, N, k, rel(k), P(k) 같은 것들)에 대한 정의부터 해보자. 

 

  • N : 전체 제품 개수가 예를 들어 2N개 있을 때, 몇 개의 제품을 사용자에게 추천해줄지, N값이 곧 cuttoff 'K'의 'K'가 된다고 보면 된다.
  • m : 실제로 유저의 취향에 맞는 제품들 개수(즉, 추천 시스템에서 일종의 '정답'이 되겠다)
  • k : N개 중 k번째로 추천된 제품
  • P(k) : k번째 추천 제품의 Precision 값
  • rel(k) : binary값으로, k번째 추천된 제품이 실제 유저의 취향 제품과 동일하면 1, 아니면 0

이제 위 수식을 적용한 예시를 살펴보자. 하단의 예시는 N=3, m=3일 때 이다.

 

AP 공식 계산해보자.

 

위 예시의 첫 번째 행만 예시를 들어서 직접 계산해보자. 추천 시스템 결과 [0, 0, 1]이 나왔다. 참고로 리스트 요소가 오른쪽으로 갈수록 하위 순위로 추천된 제품이다. 그렇다면 [0, 0, 1]을 해석해본다면 첫 번째와 두 번째 제품에 대한 추천 예측은 실제 정답과 틀렸고(0), 세 번째 제품에 대한 추천 예측은 실제 정답과 일치(1)했다. 이 결과값을 Precision으로 계산하게 된다면 다음과 같아 진다.

 

Precision@k=3 : [ 0/1 , 0/2, 1/3 ] 

첫 번째 제품을 추천했을 때의 Precision을 살펴보자. 첫 번째 제품을 추천했을 때는 1개의 제품만 추천한 상태이고 이 추천한 제품이 정답과 다르게 나왔다. 따라서 0/1이 되는 것이다. 두 번째 제품을 추천했을 때는 2개의 제품만 추천한 상태이고 이 추천한 제품 2개 모두 정답과 다르게 나왔다. 따라서 0/2가 되는 것이다. 마지막 세 번째 제품을 추천했을 때는 3개의 제품을 추천한 상태이고 이 추천한 제품 3개 중 1개만 정답과 일치하기 때문에 1/3이 되게 된다. 따라서 이를 AP공식에 넣게 되면 다음과 같아진다.

 

AP@k=3 : (1/3)*{ (0/1)*0 + (0/2)*0 + (1/3)*1 } = 1/9 = 0.11

위와 같은 방법으로 개인적으로 두 번째, 세 번째 추천 결과를 AP공식에 넣어보면 위와 동일한 결과가 나오게 된다.

 

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

 

m > N일때 경우엔 표준화 작업을 수행해준다.

 

그렇다면 AP 값이 높다는 것은 추천 시스템의 성능을 어떻다고 판단하는 걸까? 바로 추천성능이 정확하다는 것을 의미한다. 

 

이번엔 색다른 예시를 살펴보자. 추천 시스템이 정확히 예측한 제품 개수는 동일하지만 예측한 제품들이 추천 시스템에서 추천한 결과값의 어느 순위에 위치하는지에 따라 AP 값이 달라지는 것을 볼 수 있는 예시이다.

 

제품 순위에 따라 AP값이 달라진다.

 

위 문제도 동일한 공식을 적용해서 AP값을 계산해본다. 오른쪽의 AP값을 보게 되면 추천 결과값 리스트 자료구조에서 정확히 예측한 제품이 왼쪽에 있는 제품일수록 즉, 추천결과 상위에 rank되어 있는 제품을 정확히 예측할 수록 AP 값이 올라가는 것을 볼 수 있다.

 

이제 AP에 대한 설명은 모두 끝냈다. AP는 하나의 유저에 대한 추천 성능 척도이다. 그래서 이를 모든 유저에게 적용해 평균을 낸 값이 바로 MAP이다. 즉, '평균의 평균' 이다. MAP의 공식을 살펴보고 MAP에 대한 내용을 마치자. 단순히 모든 유저의 명수를 나타내는 U값이 추가된 수식일 뿐이다.

 

MAP 공식

3. Coverage

Coverage란, 추천 시스템이 Train 데이터로 학습한 결과, Train 데이터에 기반해 도출된 Ranked list에 있는 추천 제품들이 Test 데이터에서도 추천 제품인 퍼센티지를 의미한다. 

4. Personalization

추천 시스템이 동일한 제품을 다른 유저들에게 똑같이 추천하는지 아니면 다르게 추천하는지 평가하기 위한 지표이다. 즉 사용자들의 추천 제품 리스트들 간의 Dissimilarity를 구한다. Dissimilarity는 1에서 Cosine similarity를 뺀 값이다. Personalization을 계산하는 단계는 다음과 같다.

 

먼저, 행이 user, 열이 item인 행렬을 만들고 그 제품을 추천했으면 1, 아니면 0으로 binary 형태로 만들어 준다.

 

User-item 행렬

 

위 행렬에서 행 벡터들 간 즉, 유저들(0,1,2)간의 코사인 유사도를 구해준다. 

 

User들 간의 코사인 유사도 행렬

 

위 유사도 행렬에서 Upper-triangle 부분(대각 행렬 값을 기준으로 위 또는 아래 부분)의 평균값을 구해준다. 그리고 이를 1에서 빼주어 Personalization 값을 구해준다.

 

Personalization = 1 - 유저들의 평균 코사인 유사도

 

Personalization값이 높으면 유저들 간의 추천제품들이 서로 다름을 의미한다. 결국 추천 시스템 모델이 각 유저에게 개인화된 경험을 제공하고 있다는 것을 의미하는 셈이다.

5. Intra-list Similarity

모든 추천 제품들 간의 평균 코사인 유사도를 의미한다. 

 

한 유저에 대해 제품과 제품 특징간의 여부 matrix

 

위 데이터프레임은 한 유저에 대해서 추천된 제품들인 movieId가 3, 7, 5, 9가 행이고 각 제품들의 특징(영화로 치면 장르, 배우 등장 여부, 만든 국가 등)을 binary 값으로 나타낸 것이다. 우선 Intra-list similarity를 계산하기 위해서 위와 같은 행렬(또는 데이터프레임)을 모든 유저에 대해서 각각 만들어 주자.

 

그리고 위 행렬에서 행 벡터 즉, 제품들 간의 코사인 유사도 행렬을 만들어 준다. 그리고 유사도 행렬의 값을 평균값을 내게 된다. 바로 이 '평균값'이 Intra-list Similarity가 된다. 이 동작을 모든 유저들에게 각각 수행해주고 모든 유저에 대한 평균 유사도 값을 계산한다.

 

결과값은 하나의 스칼라 값이 나오게 되는데, 이 값이 높다면 추천 시스템이 각 유저에게 매우 비슷한 성격의 제품들을 추천 해주고 있다는 것이며 결국 추천 시스템의 성능이 좋다는 것을 의미한다.

 

여기까지 추천 시스템을 평가하기 위한 몇 가지 메트릭에 대해서 알아보았다. 번외로 레퍼런스에서 추가적으로 강조하는 내용이 있어 덧붙이려고 한다.


# Train 데이터를 적절히 사용하는 방법

학습 데이터를 경우에 따라 적절히 사용하면 추천 시스템의 좋은 성능을 이끌어 낼 수 있다. 만약 사용자들이 그들 스스로 자신들에게 추천해줄 만한 제품들을 쉽게 찾을 수 있는 경우, 예를 들어 어벤져스 1을 본 사용자가 어벤져스 2, 3을 추천 제품으로서 스스로 찾아볼 수 있는 가능성이 매우 높은 이러한 경우, 학습 데이터에서 매우 인기있는 제품들을 제거하는 것이 도움이 될 수 있다.

 

또 다른 방법으로는 사용자의 등급(예를 들어, VIP고객, 골드 고객, 실버 등 등급제로 나뉘어진 고객들의 value)에 따라 제품 평점을 scaling하는 것이 좋다. 이러한 방법은 추천 시스템이 VIP고객과 같은 충성 고객들이 자주 찾는 제품들을 추천하도록 하게 해준다.

 

# Reference

towardsdatascience.com/evaluation-metrics-for-recommender-systems-df56c6611093

 

Evaluation Metrics for Recommender Systems

Recommender systems are growing progressively more popular in online retail. Take a look at some metrics used to evaluate these models.

towardsdatascience.com

sdsawtelle.github.io/blog/output/mean-average-precision-MAP-for-recommender-systems.html

 

Mean Average Precision (MAP) For Recommender Systems

 

sdsawtelle.github.io

 

반응형