Skip to main content Link Menu Expand (external link) Document Search Copy Copied

TITLE : [토크ON세미나] 추천시스템 분석 입문하기 5강 - 평가함수 (Accuracy, MAP, NDCG) | T아카데미

YOUTUBE LINK : https://youtu.be/m4SNL-ZUTaA PRESENTER : SKplanet Tacademy DURATION : 00:11:22 PUBLISHED : 2021-01-25

Table of contents

  1. TITLE : [토크ON세미나] 추천시스템 분석 입문하기 5강 - 평가함수 (Accuracy, MAP, NDCG) | T아카데미
  2. FULL SCRIPT

FULL SCRIPT

평가함수 이제 세번째 챕터로 넘어가서 추천 시스템에서 어떤 평가함수가 있는지를 살펴볼게요.

일단 평가함수를 다양하게 알아야 할 필요가 있습니다.

왜냐하면 평가함수 같은 경우에 내가 얼마나 모델이 잘 추천하고 있는지 그런 거에 대해서 결과를 알려주는 함수이고 도메인이나 목적에 따라서 맞게 다른 평가함수를 잘 도입해야 추천이 잘 되고 있는지를 알 수가 있죠.

그래서 한번 아래 같은 예시를 들어볼게요.

예를 들어서 내가 추천해준 영화를 고객이 봤냐.

그리고 두번째 예시는 내가 추천해준 영화를 고객이 높은 점수로 피드백을 줬냐.

두가지 예시가 있을 수가 있겠죠.

근데 두가지는 분명히 다른 게 1번의 경우 추천을 통해서 그러니까 구매를 하면 성공으로 보지만 실제 고객의 만족도는 되게 낮을 수가 있어요.

예를 들어서 기사 추천이나 유튜브 클릭 같은 게 그렇죠.

추천해준 거 되게 많아가지고 이건 공짜잖아요.

그래서 단순히 클릭 통해서 보는 것까지는 성공으로 갈 수가 있는데 실제 만약에 기사 내용이 마음에 안 들어서 바로 나간다든지 유튜브 초반에 내용 봤는데 재미없어서 나간다든지 그래서 이 추천에 대해서 반응이 안 좋을 수도 있는데 그 반응을 1번 매트리트 같은 경우는 놓친다라는 게 문제죠.

그래서 실제 다음 같은 경우 추천 사례를 다음이나 유튜브 추천 사례를 보면 이 부분에 대해서 실제 클릭으로 이어지는지를 보는 게 아니라 얼마만큼 체류 시간을 가지고 있는지 체류 시간을 매트리트로 본다고 합니다.

그래서 이거는 상황에 맞게 해주는 게 좋고 근데 사실 이렇게 체류 시간을 아는 것도 기업 DB라든지 그런 어떤 데이터 DB단에서 그런 거 조금 환경이 갖춰져야 가능한 거기 때문에 회사 상황이라든지 그리고 내 도메인의 상황에 맞춰서 잘 선정해 줘서 사용하면 될 것 같습니다.

그럼 이제 대표적인 평가함수들 한 3, 4가지 볼 텐데 첫 번째로 볼 수 있는 게 어크러쉬 정확도입니다.

정확도 여러분 다들 아시다시피 내가 추천해준 거를 봤냐 보지 않았냐 추천해준 영화를 많이 볼수록 정확도는 상승하겠죠.

근데 이게 추천하지 않은 영화의 수가 되게 많잖아요.

사실 아이템이 되게 많고 그래서 이때는 원래 어크러쉬 같은 경우 추천해준 거에 대해서 정확도도 계산하고 추천하지 않은 것도 얼마나 맞췄는지에 대해서 정확도 계산하는데 저 같은 경우는 이게 추천하지 않은 건 너무 많아서 추천해준 영화만을 기준으로 얼만큼 맞았는지를 정확도로 계산을 했습니다.

근데 이런 어크러쉬 같은 평가 지표에 또 다른 단점이 하나 있는데 저희가 보통 추천을 한 번에 한 개씩 두 개씩 이렇게 하는 게 아니라 뭐 아까 봤던 예시 같은 것도 그렇고 6개, 10개, 20개 이렇게 막 추천을 해주거든요.

그래가지고 이런 추천 20개를 해줬을 때 20개의 추천들 간에도 사실 어느 정도 순위가 있어요.

예를 들어서 먼저 추천해준 게 더 좋게, 그래서 먼저 추천해준 게 더 좋고, 그리고 나중에 추천해준 게 더 나쁘고 약간 그런 순위가 있는데 그런 순위를 이제 반영해준 평가 지표가 MAP랑 그 다음에 나오는 NDCG라는 평가 지표가 있습니다.

그래서 MAP부터 평가 지표를 보면 얘는 Precision이라는 결과를 가지고 이 Precision의 Average를 계산하는 건데 예를 들어서 한 번 추천을 001과 001 그리고 여기서 0이 의미하는 게 추천을 해줬는데 보지 않은 경우 1은 추천을 했는데 본 경우를 생각해 볼게요.

그리고 이 두 가지 예시에 대해서도 한 번 두 가지를 각각 두 가지 추천했는데 아 세 가지 추천했는데 두 개는 성공적으로 본 거고 얘도 세 가지 추천했는데 두 가지는 성공적으로 본 거죠.

근데 이 두 가지 봤을 때 이게 이 앞에 나올수록 내가 먼저 추천해준 게 맞았다는 의미거든요.

근데 Accuracy 기준으로는 세 개 추천했는데 두 개만 맞았으니까 정확도는 66.6으로 두 개가 동일하잖아요.

근데 사실 누가 봐도 아래 게 훨씬 좋아요.

왜냐하면 먼저 추천해준 게 먼저 맞았으니까 얘는 먼저 제일 이거는 무조건 보겠거니 하고 첫 번째로 추천해준 걸 안 보고 그 다음 걸 본 거여서 아래 것보다 좋은데 이런 추천의 순서를 반영해주지 못하니까 그런 거를 지금 보완해 준 게 MAP인데 계산 과정은 되게 간단합니다.

각각의 순서에 따라서 Precision을 먼저 계산합니다.

Precision은 실제 정답에서 얼마만큼 실제 예측해서 맞았는지를 의미하고요.

얘는 한 개의 정답에서 예측해서 틀렸으니까 0을 가지고 얘는 한 개의 정답에서 예측해서 맞았으니까 1을 가지고 이 두 번째 같은 경우는 이렇게 두 가지 경우 두 가지 추천해서 정답해서 한 가지를 맞췄으니까 1분의 1 얘는 두 가지 상황에서 두 가지를 다 맞췄으니까 2분의 2 얘는 다시 보면 세 가지 상황에서 두 가지만 맞춘 거니까 3분의 2 얘는 세 가지 상황에서 두 가지만 맞춘 거잖아요.

여기서는 두 개 추천해서 두 개 다 맞은 거고 여기서는 세 개 추천해서 두 개 맞은 경우니까 3분의 2가 돼서 이 첫 번째 이렇게 오는 순서에 따라서 분모값이 다르게 되면서 가중치가 달리 받게 되고 그렇기 때문에 얘를 평균 냈을 때 Average Precision이 0.38과 0.89로 많이 달라지게 되는 게 MAP 추천 함수의 근본적인 아이디어라고 생각하시면 됩니다.

이 골뱅이 3은 세 개의 추천 상품에 대해서 평균을 냈다고 생각하시면 돼요.

근데 이제 AP잖아요.

이 앞에 M이 붙는데 M이 무엇이냐면 M은 사용자 4명이니까 4명에 대해서 평균을 내주겠다 이 의미예요.

그래서 지금 AP 골뱅이 3 잘못 설명했는데 이 세 개가 아마 사용자 3에 대해서 평균 낸 거일 거예요.

그래서 MAP 골뱅이 4가 뭐냐면 AP가 결과가 총 4가지가 있잖아요.

첫 번째 사용자 추천에 대한 결과, 두 번째, 세 번째, 네 번째에 대한 결과가 있으니까 이 네 개의 AP 값에 대해서 사용자에 평균을 낸 게 MAP 골뱅이 4가 되는 것이죠.

그러니까 정리하면 Precision을 평균 낸 게 AP고 AP를 사용자에 대해서 평균을 낸 게 MAP라고 보시면 됩니다.

근데 이 MAP를 좀 더 보완한 게 NDCG인데 NDCG 같은 경우도 순서에 따라서 중요도를 만들어주려고 만든 평가 함수예요.

근데 조금 차이점이 뭐냐면 얘는 원래 추천 엔진이 아니라 검색 엔진에서 많이 활용됐던 거고 그리고 사용자마다 추천해주는 상품의 개수가 다를 수가 있거든요.

그런 개수를 사용자마다 다를 때도 어떤 식으로 잘 정교화를 취해줄 수 있는지 그거를 맞춰주기 위한 평가 함수가 NDCG라고 보시면 됩니다.

NDCG를 계산하기 위해서 먼저 CG와 DCG, 그리고 Normalize Term을 이해할 필요가 있습니다.

그래서 CG 같은 경우는 Cumulative Gain이라고 얼마만큼의 추천해줬을 때 값이 맞았는지 그 순서 맞은 거를 순서를 더해주는 건데 여기 영어 설명 보시면 계산이 된다 어떻게 포지티브와 네거티브 피드백 우리가 추천해줬을 때 순서가 어떻게 반영이 되는지 보신다고 생각하시면 됩니다.

그래서 3 같은 경우는 중요한 거를 먼저 추천해줬을 때 맞은 경우 2 같은 경우는 내가 두 번째로 중요할 것 같아서 추천했는데 얘가 첫 번째로 나와서 조금 덜 그게 된 경우 그래서 두 경우도 아까처럼 사실 CG B가 A보다 평점 높게 내린 게 앞에 와서 앞에서 맞아가지고 더 중요한데 A와 B가 지금 CG만 더하면 결과 값이 다르잖아요.

그래서 똑같이 얘를 아까 IDF나 이런 거 했던 것처럼 어떤 식으로 잘 그런 거 정규화 같은 과정을 취해줄 필요가 있는데 여기서는 앞에서 맞을수록 그 분목 값이 더 작아지는 것을 통해서 조금 그런 순서의 중요성을 반영해 줄 수가 있습니다.

그래서 분모의 값을 보면 첫 번째로 맞은 경우에 대해서는 로그 2에 2로 나눠주고 마지막에 맞은 거는 로그 2에 6으로 나눠줌으로써 초반에 맞은 걸수록 더 가중치 값을 많이 받도록 하는 게 DCG라는 평가 매트리고 생각하시면 되고요.

이제 이 DCG가 사람들의 추천 권장해주는 수에 따라서 결과가 다르기 때문에 그랬다에서 상한과 한이 적절히 필요하고 예를 들어서 모든 추천 점수를 평균해 줘가지고 노멀라이즈를 수행해 줬는데 그거를 NDCG라고 생각하시면 됩니다.

NDCG 문제는 되게 간단한데 아까 봤던 23312가 제가 추천해 준 순서잖아요?

근데 이거는 이상적으로는 33211로 높은 피드백 받은 게 앞에 오면 올수록 더 좋은 거니까 이런 이상적인 순서와 내 추천 순서를 가지고 똑같이 DCG를 계산하는데 DCG는 내가 추천해 준 순서에 따라서 얼마큼 DCG 값을 가지는지 IDCG는 이상적인 순서에서는 얼마만큼의 값을 가지는지를 계산하고 둘을 단순하게 나눠줌으로써 계산한다고 생각하시면 됩니다.

그래서 이 값이 높으면 높을수록 좋은 평가 지표가 되겠죠.