추천 시스템의 평가 지표
추천 시스템의 평가 지표
에 대해 정리해 보겠습니당!
적용한 추천 시스템이나 모델의 성능 평가는 아래에 관점
으로 진행합니당
비즈니스 / 서비스 관점
추천 시스템 적용으로 인한 매출
, PV
의 증가
새로운 추천 아이템으로 인한 유저의 CTR
상승
PV? CTR?
PVPage View
: 사람들이 홈페이지 및 사이트에 몇번의 페이지를 둘러봤는지에 대한 수치이며, 10명이 방문
하여 10개씩의 페이지
를 둘러봤다면 PV
는 100
이 됩니당(feat. SNS).
CTRClick Through Rate
: 쉽게 말해서 클릭류
! 광고가 노출되었을 때 얼마나 클릭을 했느냐라는 수치를 나타냅니당. 일반적인 공식은 클릭수 노출수 ∗ 100 \frac{클릭 수}{노출 수} * 100 노 출 수 클 릭 수 ∗ 1 0 0 의 공식으로 구합니당
(ex. 광고 100번 노출
되었을 때 10번의 클릭
이 일어났다면 CTR
은 10%
).
품질 관점
연관성Relevance
: 추천된 아이템이 유저에게 관련이 있는가?
다양성Diversity
: 추천된 Top-K 아이템에 얼마나 다양한 아이템에 추천되는가?
새로움Novelty
: 얼마나 새로운 아이템이 추천되고 있는가?
참신함Serendipity
: 유저가 기대하지 못한 뜻밖의 아이템이 추천되는가?
평가 과정
평가 지표
를 파악했으니 이제 어떤 단계를 거치며 평가
를 진행하는지 알아보겠습니당.
Offline Test
새로운 추천 모델을 검증하기 위해 가장 먼저 필요한 단계
유저로부터 이미 수집한 데이터를 Train
/Valid
/Test
로 나누어 모델의 성능을 객관적인 지표로 평가
보통 Offline Test에서 좋은 성능을 보여야 Online 서빙에 투입되지만, 실제 서비스 상황에선 다양한 양상을 보임Serving Bias
성능 지표
Precsion@K, Recalll@K, MAP, NDCG
, Hit Rate
, RMSE, MAE → \to → 논문
이나 A/B Test
에선 강조된 지표를 자주 사용합니당
Online A/B Test
Offline Test
에서 검증된 가설이나 모델을 이용해 실제 추천 결과를 서빙하는 단계
추천 시스템 변경 전후의 성능을 비교하는건이 아닌, 동시에 대조군 A
과 실험군 B
의 성능을 평가함 → \to → 단, 대조군
과 실험군
의 환경은 동일해야 함
실제 서비스를 통해 얻어지는 결과를 통해 최종 의사결정이 이뤄짐
대부분 현업에서 의사결정을 위해 사용하는 최종 지표는 모델 성능(RMSE
, NDCG
등)이 아닌 매출
, CTR
등의 비즈니스 / 서비스 지표 컴퓨터만 믿고 우기지 말라는거겠죠?
ML Engineer 직군 자격요건에서 자주 언급되던 분할-실행 테스트A/B Test
입니당.
제가 이해한 것을 간략하게 말씀드리면 대조군A
과 조금 다른 설정을 한 실험군B
두고 유입되는 고객을 임의로 배치하고 CTR
를 비교하여 광고 연결률의 유의미한 차이를 테스트하는 것이라고 합니당.
2011년 기준 구글 갓글 에서 7,000가지가 넘는 분할-실행 테스트A/B Test
를 수행한다고 하니 그만큼 효과가 입증된 성능 평가 방법이라고 할 수 있겠져.
참고 : https://statkclee.github.io/statistics/stat-ab-testing.html
성능 지표
다음은 성능 지표
에 대해 자세히 알아봅니당.
Presion/Recall
이진 분류Binary Classification
의 Metric으로 사용되는 지표
입니당.
Precision = True Positive True Positive + False Positive \text{Precision} = \frac{ \text{True Positive} }{\text{True Positive} + \text{False Positive}} Precision = True Positive + False Positive True Positive → \to → True라고 '예측'한 것들 가운데 실제 True인 비율
Recall = True Positive True Positive + False Negative \text{Recall} = \frac{ \text{True Positive} }{\text{True Positive} + \text{False Negative}} Recall = True Positive + False Negative True Positive → \to → 전체 True 가운데 True라고 '예측'한 비율
Precision/Recall@K
Precision@K : 우리가 추천한 K개 아이템 가운데 실제 유저가 관심있는 아이템의 비율
Recall@K : 유저가 관심있는 전체 아이템 가운데 우리가 추천한 아이템의 비율
Example)
우리가 추천한 아이템 개수 : K = 5
추천한 아이템 중 유저가 관심있는 아이템 개수 : 2
유저가 관심있는 아이템의 전체 개수 : 3
→ \to → Precision@5 = 2 5 \frac{2}{5} 5 2 , Recall@5 = 2 3 \frac{2}{3} 3 2
Mean Average Precsion(MAP)@K
Average Precsion
A P @ K = 1 m ∑ i = 1 K P r e c i s i o n @ i AP@K = \frac{1}{m}\sum_{i=1}^{K}Precision@i A P @ K = m 1 ∑ i = 1 K P r e c i s i o n @ i
Precision@1
부터 Precision@K
까지의 평균값
을 의미
Precision@K
와 다르게 연관성 있는relevant
한 아이템을 더 높은 순위에 추천할 경우 점수가 상승
MAP
M A P @ K = 1 ∣ U ∣ ∑ u = 1 ∣ U ∣ ( A P @ K ) u MAP@K = \frac{1}{\lvert U \rvert}\sum_{u=1}^{\lvert U \rvert}(AP@K)_{u} M A P @ K = ∣ U ∣ 1 ∑ u = 1 ∣ U ∣ ( A P @ K ) u
모든 유저에 대한 Average Precision
값의 평균 → \to → 추천 시스템의 성능
Normailzed Discounted Cumulaitve Gain(NDCG)
추천 시스템에 가장 많이 사용되는 지표 중 하나, 원래는 검색Information Retrieval
에서 등장한 지표
Precision@K
, MAP@K
와 마찬가지로 Top K 추천 리스트를 만들고 유저가 선호하는 아이템을 비교하여 값을 구합니다.
MAP@K
처럼 NDCG
는 추천의 순서에 가중치를 더 많이 두어 성능을 평가하며 1에 가까울 수록 좋습니다.
MAP
는 관련 여부를 binary(0/1)로 평가하지만, NDCG
는 관련도 값을 사용할 수 있기 때문에, 유저에게 더 관련 있는 아이템을 상위로 노출시키는지 알 수 있습니다.
Cumulative Gain
C G K = ∑ i = 1 K r e l i CG_{K} = \sum_{i=1}^{K} rel_{i} C G K = ∑ i = 1 K r e l i
상위 p개 아이템에 대하여 관련도를 합한 것
순서에 따라 Discount하지 않고 동일하게 더한 값
Discounted Culative Gain
D C G K = ∑ i = 1 K r e l i l o g 2 ( i + 1 ) DCG_{K}=\sum_{i=1}^{K}\frac{rel_{i}}{log_{2}(i+1)} D C G K = ∑ i = 1 K l o g 2 ( i + 1 ) r e l i
순서에 따라 log 값으로 나눠 Cumulative Gain을 Discount
Ideal DCG
I D C G = ∑ i = 1 K r e l i o p t l o g 2 ( i + 1 ) IDCG = \sum_{i=1}^{K}\frac{rel_{i}^{opt}}{log_{2}(i+1)} I D C G = ∑ i = 1 K l o g 2 ( i + 1 ) r e l i o p t
이상적인 추천이 일어났을 때의 DCG 값
가능한 DCG 값 중에 제일 큶
Normalized DCG
N D C G = D C G I D C G NDCG = \frac{DCG}{IDCG} N D C G = I D C G D C G
추천 결과에 따라 구해진 DCG
를 IDCG
로 나눈 값 → \to → 최대 값은 1이다.
Example)
NDCG@5
Ideal Order: [C(3), A(3), B(2), E(2), D(1)]
Relevance의 내림차순으로 정렬하여 추천하는 것이 이상적입니다.
Recommend Order: [E, A, C, D, B]
D C G @ 5 = 2 l o g 2 ( 1 + 1 ) + 3 l o g 2 ( 2 + 1 ) + 3 l o g 2 ( 3 + 1 ) + 1 l o g 2 ( 4 + 1 ) + 2 l o g 2 ( 5 + 1 ) = 6.64 I D C G @ 5 = 3 l o g 2 ( 1 + 1 ) + 3 l o g 2 ( 2 + 1 ) + 2 l o g 2 ( 3 + 1 ) + 2 l o g 2 ( 4 + 1 ) + 1 l o g 2 ( 5 + 1 ) = 7.14 N D C G @ 5 = D C G I D C G = 6.64 7.14 = 0.93 DCG@5 = \frac{2}{log_{2}(1+1)} + \frac{3}{log_{2}(2+1)} + \frac{3}{log_{2}(3+1)} + \frac{1}{log_{2}(4+1)} + \frac{2}{log_{2}(5+1)} = 6.64 \\ IDCG@5 = \frac{3}{log_{2}(1+1)} + \frac{3}{log_{2}(2+1)} + \frac{2}{log_{2} (3+1)} + \frac{2}{log_{2}(4+1)} + \frac{1}{log_{2}(5+1)} = 7.14 \\ NDCG@5 = \frac{DCG}{IDCG} = \frac{6.64}{7.14} = 0.93 D C G @ 5 = l o g 2 ( 1 + 1 ) 2 + l o g 2 ( 2 + 1 ) 3 + l o g 2 ( 3 + 1 ) 3 + l o g 2 ( 4 + 1 ) 1 + l o g 2 ( 5 + 1 ) 2 = 6 . 6 4 I D C G @ 5 = l o g 2 ( 1 + 1 ) 3 + l o g 2 ( 2 + 1 ) 3 + l o g 2 ( 3 + 1 ) 2 + l o g 2 ( 4 + 1 ) 2 + l o g 2 ( 5 + 1 ) 1 = 7 . 1 4 N D C G @ 5 = I D C G D C G = 7 . 1 4 6 . 6 4 = 0 . 9 3
Hit Rate @K
Hit Rate = no. of hit user no. of user \text{Hit Rate}=\frac{\text{no. of hit user}}{\text{no. of user}} Hit Rate = no. of user no. of hit user
특정 유저의 선호하거나 클릭했던 모든 Item을 가져옵니다.
모든 Item
가운데 하나만 의도적으로 제거한다. → \to → Leave-One-Out Cross-Validation
남은 Item
들을 가지고 추천 모델을 학습한 뒤, Top K 추천 리스트를 추출
K개의 추천 리스트 가운데 아까 제거한 Item
이 있다면 hit, 아니면 hit가 아니다.
평점 예측 방법(Cost Function)
데이터feature
와 실제 결과 데이터 값을 비교해서 오차Error
의 정도를 표시하는 함수를 손실 함수Cost fuctions
이라고 합니당.
Machine Learning
에 필수적인 함수로 추천 시스템에선 아래의 과정을 거쳐 데이터feature
를 수집하고, 이걸로 예측 값을 구해 실측 값을 비교하는 손실 함수Cost function
을 통해 오차Error
가 적은 환경을 찾아 모델을 완성시킵니당.
과정
유저가 아이템에 대해 Explicit / Implicit한 Feedback을 남긴다.
Training Data를 통해 학습한 모델을 바탕으로 Test Data에 있는 Feedback 값을 얼마나 정확하게 예측하는지를 지표로 삼는다.
실측값과 예측값의 차이를 하나의 성능 지표로 표현Cost Function
MAEMean Absolute Error
RMSERoot Mean Square Error
Error
가 낮을 수록 추천 알고리즘의 성능이 좋다고 평가
그러나 성능이 좋다고 해서 꼭 좋은 추천을 하는 것은 아니다.
Mean Absolute Error(MAE) & Root Mean Square Error(RMSE)
M A E = 1 ∣ R ^ ∣ ∑ r ^ u i ∈ R ^ ∣ r u i − r ^ u i ∣ MAE = \frac{1}{\lvert \hat{R} \rvert} \sum_{\hat{r}_{ui} \in \hat{R}} \lvert r_{ui} - \hat{r}_{ui} \rvert M A E = ∣ R ^ ∣ 1 ∑ r ^ u i ∈ R ^ ∣ r u i − r ^ u i ∣ , R M S E = 1 ∣ R ^ ∣ ∑ r ^ u i ∈ R ^ ( r u i − r ^ u i ) 2 RMSE =\sqrt{\frac{1}{\lvert \hat{R} \rvert} \sum_{\hat{r}_{ui} \in \hat{R}} (r_{ui} - \hat{r}_{ui})^{2}} R M S E = ∣ R ^ ∣ 1 ∑ r ^ u i ∈ R ^ ( r u i − r ^ u i ) 2
RMSE
가 MAE
보다는 outlier
나 bad prediction
에 취약합니다.
RMSE
는 절대값이 없기 때문에 수학적으로 간편 → \to → 대부분의 Machine Learning
모델은 RMSE
를 손실함수cost function
로 사용
Example)
M A E = ( 2 + 3 + 1 + 0 ) 4 = 1.5 MAE = \frac{(2 + 3 + 1 + 0)}{4} = 1.5 M A E = 4 ( 2 + 3 + 1 + 0 ) = 1 . 5
R M S E = 4 + 9 + 1 + 0 4 = 1.87 RMSE = \sqrt{\frac{4 + 9 + 1 + 0}{4}} = 1.87 R M S E = 4 4 + 9 + 1 + 0 = 1 . 8 7
※ RMSE
는 MAE
보다 항상 큽니다.
Github : https://github.com/pray92/recommendation_system