추천 시스템 Basic 1
추천 시스템에 관하여, 해결하고자 하는 문제가 무엇인지를 살펴보자.
추천 시스템 혹은 모델을 어떻게 평가하는지, ‘인기도 기반 추천’을 예제로 알아보고
Offline test와 Online A/B Test를 알아보자.
추천 시스템 1
추천 시스템에서 사용하는 정보
- 유저 관련 정보
- 유저 프로파일링 - 추천 대상 유저에 관련된 정보를 구축하여 개별 유저 혹은 유저 그룹별로 추천함
- 식별자 - 유저ID, 디바이스 ID, 브라우저 쿠키
- 데모 그래픽 정보 - 성별, 연령, 지역, 관심사 (직접 받는지만 추정을 사용하기도함)
- 유저 행동 정보 - 페이지 방문 기록, 아이템 평가, 구매 등의 피드백 기록
- 아이템 관련 정보
- 추천 아이템의 종류
- 포탈 : 뉴스, 블로그, 엡툰 등 컨텐츠 추천
- 광고/커머스 : 광고 소재, 상품 추천
- 미디어 : 영화, 음악, 동영상 추천 - 아이템 프로파일링
- 아이템 ID(가장 중요)
- 아이템의 고유 정보
- 영화 : 영화 장르, 출연 배우 및 감독, 영화 소개글, 개봉년도
- 상품 : 상품 카테고리, 브랜드, 출시일, 상품 이미지
- 음악 : 아티스트, 작곡가, 장르, 음악 신호 그 자체
- 유저 - 아이템 상호작용 정보
- 유저와 아이템의 상호작용 데이터 - 유저가 오프라인 혹은 온라인에서 아이템과 상호작용 할 때 로그로 남음. 추천 시스템을 학습하는 데이터의 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}\]
- Cumulative Gain - 상위 K개의 아이템에 대하여 관련도를 합한 것, 순서에 따라 Discount하지 않고 동일하게 더한 값
- NDCG 예제 by boostcamp
Online A/B Test
Offline Test에서 검증된 가설이나 모델을 이용해 실제 추천 결과를 서빙하는 단계
- 추천 시스템 변경 전후의 성능을 비교하는 것이 아니라, 동시에 대조군(A)과 실험군(B)의 성능을 평가. 대조군과 실험군의 환경을 최대한 동일
- 실제 서비스를 통해 얻어지는 결과를 통해 최종 의사결정이 이루어짐
인기도 기반 추천
- 말 그대로 가장 인기있는 아이템을 추천함
- 정보가 많이 없는 서비스 런칭 초반에 많이 사용된다.
- 인기도의 척도 - 조회수, 평균 평점, 리뷰 개수, 좋아요/싫어요 수 등등
어떻게 스코어를 만들어야 할까?
- 조회수가 가장 많은 아이템을 추천(Most Popular) -> 뉴스 추천
- 평균 평점이 가장 높은 아이템을 추천(Highly Rated) -> 맛집 추천
Most Popular
- 뉴스의 가장 중요한 속성은 최신
- 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