8 minute read

추천 시스템에 관하여, 해결하고자 하는 문제가 무엇인지를 살펴보자. 추천 시스템 혹은 모델을 어떻게 평가하는지, ‘인기도 기반 추천’을 예제로 알아보고
Offline test와 Online A/B Test를 알아보자.

추천 시스템 1

추천 시스템에서 사용하는 정보

  1. 유저 관련 정보
    • 유저 프로파일링 - 추천 대상 유저에 관련된 정보를 구축하여 개별 유저 혹은 유저 그룹별로 추천함
    • 식별자 - 유저ID, 디바이스 ID, 브라우저 쿠키
    • 데모 그래픽 정보 - 성별, 연령, 지역, 관심사 (직접 받는지만 추정을 사용하기도함)
    • 유저 행동 정보 - 페이지 방문 기록, 아이템 평가, 구매 등의 피드백 기록
  2. 아이템 관련 정보
    • 추천 아이템의 종류
    • 포탈 : 뉴스, 블로그, 엡툰 등 컨텐츠 추천
    • 광고/커머스 : 광고 소재, 상품 추천
    • 미디어 : 영화, 음악, 동영상 추천 - 아이템 프로파일링
    • 아이템 ID(가장 중요)
    • 아이템의 고유 정보
      • 영화 : 영화 장르, 출연 배우 및 감독, 영화 소개글, 개봉년도
      • 상품 : 상품 카테고리, 브랜드, 출시일, 상품 이미지
      • 음악 : 아티스트, 작곡가, 장르, 음악 신호 그 자체
  3. 유저 - 아이템 상호작용 정보
    • 유저와 아이템의 상호작용 데이터 - 유저가 오프라인 혹은 온라인에서 아이템과 상호작용 할 때 로그로 남음. 추천 시스템을 학습하는 데이터의 Feedback이 됨
    • Explicit Feedback - 유저에게 직접 아이템에 대한 만족도를 물어본 경우(평점)
    • Implicit Feedback - 유저가 아이템을 클릭하거나 구매한 경우(상품 구매)

추천 시스템의 목적

특정 유저에게 적합한 아이템을 추천한다 / 특정 아이템에게 적합한 유저를 추천한다.
유저 - 아이템 상호 작용을 평가할 score 값이 필요 -> 추천을 위한 스코어는 어떻게?

추천 문제: 랭킹 또는 예측

  • 랭킹 : 유저에게 적합한 아이템 Top K개를 추천하는 문제
    • Top K개를 선택하는데 스코어가 필요하지만, 유저(X)가 아이템(Y)에 가지는 정확한 선호도를 구할 필요는 없음
    • -> 평가지표 Precision@K, Recall@K, MAP@K, nDCG@K
  • 예측 : 유저가 아이템을 가질 선호도를 정확하게 예측(평점 or 클릭/구매 확률)
    • 유저 - 아이템 행렬을 채우는 문제
    • -> 평가지표 MAE, RMSE, AUC

추천 시스템의 평가 지표

개요

  • 비즈니스 / 서비스 관점
    • 추천 시스템 적용으로 매출, PV의 증가
    • 유저의 CTR(노출대비 클릭수)의 상승
  • 품질 관점
    • 연관성 : 추천된 아이템이 유저에게 얼마나 관련있는가?
    • 다양성 : 다양한 아이템에 추천되는가?
    • 새로움 : 얼마나 새로운 아이템이 추천되고 있는가?
    • 참신함 : 유저가 기대하지 못한 뜻밖의 아이템이 추천되는가?

Offline Test

  • 새로운 추천 모델을 검증하기 위해 가장 우선적으로 수행되는 단계
    • 유저로부터 수집한 데이터를 train/valid/test로 나누어 모델의 성능을 객관적인 지표로 평가.
    • 보통 offline test에서 좋은 성능을 보여야 online서빙에 투입되지만 실제 서비스에서는 사양한 양상을 보인다.
  • 성능 지표
    • 랭킹 문제 : Precision@K, Recall@K, MAP@K, NDCG@K, Hit rate
    • 예측 문제 : RMSE, MAE

Precision/Recall @K

  • Precision@K
    • 우리가 추천한 K개 아이템 가운데 실제 유저가 관심있는 아이템의 비율
  • Recall@K
    • 유저가 관심있는 전체 아이템 가운데 우리가 추천한 아이템의 비율
  • 예시)
    • 추천한 아이템 개수 5
    • 추천한 아이템 중 유저가 관심있는 아이템 2
    • 유저가 관심있는 아이템 3
    • -> Precision@K = 2/5, Recall@K -> 2/3

MAP@K(Mean Average Precision)

  • AP@K
    • Precision@1 부터 Precison@K 까지의 평균값
    • 관련 아이템을 더 높은 순위에 추천할수록 점수가 상승한다.
    • \[AP@K = \frac{1}{m}\sum_{i=1}^{K}Precision@i\]
  • MAP@K
    • 모든 유저에 대한 Average Precision 값의 평균
    • \[MAP@K = \frac{1}{|U|}\sum_{u=1}^{|U|}(AP@K)_u\]

NDCG(Normalized Discounted Cumulative Gain, 가장많이 쓰임)

  • 검색에서 등장했지만 추천 시스템에서 가장 많이 사용되는 지표 중 하나.
  • Precision@K, MAP@K와 마찬가지로 TOP K 리스트를 만들고 유저가 선호하는 아이템을 비교하여 값을 구함
  • MAP@K와 마찬가지로 추천의 순서에 가중치를 많이두어 성능을 평가하며 1에 가까울수록 좋음
  • MAP과 달리, 이진값이 아닌 수치로도 사용할 수 있기 때문, 유저에게 얼마나 더 관련 있는 아이템을 상위로 노출시키는지 알 수 있음.
  • NDCG Formula
    • Cumulative Gain - 상위 K개의 아이템에 대하여 관련도를 합한 것, 순서에 따라 Discount하지 않고 동일하게 더한 값
      • \[CG_K = \sum_{i=1}^{K}rel_i\]
    • Discounted Cumulative Gain - 순서에 따라 cumulative Gain을 Discount함
      • \[DCG_K = \sum_{i=1}^{K}\frac{rel_i}{\log_{2}(i+1)}\]
    • Ideal DCG - 이상적인 추천이 발생했을 때 DCG값, 가능한 DCG값중 가장 크다.
      • \[IDCG = \sum_{i=1}^{K}\frac{rel_i^{opt}}{\log_{2}(i+1)}\]
    • Normalized DCG - 추천 결과에 따라 구해진 DCG를 IDCG로 나눈 값.
      • \[NDCG = \frac{DCG}{IDCG}\]
  • NDCG 예제 NDCG by boostcamp

Online A/B Test

Offline Test에서 검증된 가설이나 모델을 이용해 실제 추천 결과를 서빙하는 단계

  • 추천 시스템 변경 전후의 성능을 비교하는 것이 아니라, 동시에 대조군(A)과 실험군(B)의 성능을 평가. 대조군과 실험군의 환경을 최대한 동일
  • 실제 서비스를 통해 얻어지는 결과를 통해 최종 의사결정이 이루어짐

인기도 기반 추천

  • 말 그대로 가장 인기있는 아이템을 추천함
  • 정보가 많이 없는 서비스 런칭 초반에 많이 사용된다.
  • 인기도의 척도 - 조회수, 평균 평점, 리뷰 개수, 좋아요/싫어요 수 등등

어떻게 스코어를 만들어야 할까?

  • 조회수가 가장 많은 아이템을 추천(Most Popular) -> 뉴스 추천
  • 평균 평점이 가장 높은 아이템을 추천(Highly Rated) -> 맛집 추천
  • 뉴스의 가장 중요한 속성은 최신
    • score = (upvote - downvote) - time_elasped = pageviews - time_elasped
    • 10 pageviews, 6 hours ago -> 10 - 6/4 = 8.5
    • 25 pageviews, 24 hours ago -> 26 -24/4 = 21
    • 단순히 pageview만 고려하는 것이 아니라 시간도 고려한다.
    • -> pageview가 더 빠르게 늘어나면 1~2년이 지나도 같은 글이 Top Rank에 보일 것이다. -> 뉴스인데??
  • Hacker News Formula
    • \[score = \frac{pageviews - 1}{(age+2)^{gravity}}\]
    • 시간이 지날수록 age가 점점 증가하여 score가 작아진다.
    • 시간에 따라 줄어드는 score를 조정하기 위해 gravity라는 상수를 사용.
  • Reddit Formula
    • \[score = \log_{10}(ups - downs) + \frac{sign(ups - downs)*seconds}{45000}\]
    • 첫번째 term은 popularity, 두번째 term은 글이 포스팅이 게시된 절대 시간.
    • log를 이용해 첫번째 vote에 대해서 가장 높은 가치를 부여하고, vote가 늘어날 수록 score의 증가 폭이 작아진다.

Highly Rated

  • Steam Rating Formula
    • \[avgRating = \frac{numberOfPostiveReviews}{numberOfReviews}\]
    • \[score = avgRating - (avgRating - 0.5) * 2^{-\log(number of reviews)}\]
    • rating은 평균값을 사용하되, 전체 review 개수에 따라 rating을 보정
    • review의 개수가 아주 많은 경우 score는 평균 rating과 거의 유사해진다.
  • Movie Rating
    • \[avgRating = \frac{sum(rating)}{numberOfReviews}\]
    • \[score = avgRating - (avgRating - 3.0) * 2^{-\log(number of reviews)}\]
    • 영화 평점은 positive, negative가 아닌 1.0부터 5.0의 rating을 사용한다.
    • 여기서는 중간 값인 3.0을 사용
    • 마찬가지로 전체 review 개수가 많아질수록 score는 평균 rating에 가까워짐.

Comments