본문 바로가기
데이터과학

[추천시스템] 비개인화 추천 알고리즘 - 인기도 기반 추천

by sungkee 2021. 8. 30.
반응형

[추천시스템 시리즈]

2021.08.30 - [데이터과학] - [추천시스템] 비개인화 추천 알고리즘 - 인기도 기반 추천

2021.09.01 - [데이터과학] - [추천시스템] 성능 평가 방법 - Precision, Recall, NDCG, Hit Rate, MAE, RMSE

2021.09.08 - [데이터과학] - [추천 시스템] Matrix Factorization (SGD)

2021.09.28 - [데이터과학] - [추천시스템] Alternating Least Square (ALS)를 활용한 Matrix Factorization

2021.10.18 - [데이터과학] - [추천시스템] Multi-Armed Bandit

 

 

추천시스템은 보통 개인의 취향에 맞춰 상품이나 콘텐츠를 추천해주는 알고리즘을 생각할 수 있지만, 사용자 개인에 대한 정보없이 인기도나 구매 상품 간 연관성을 고려하여 추천해주는 방법도 있다. 이번 포스팅에서는 이러한 '비개인화 추천 알고리즘'에 대해 정리하였다. 먼저 인기도 기반 추천 방법을 소개한다. 다음 포스팅에서는 장바구니 분석이라 불리는 연관 규칙에 대해서 소개할 예정이다.

 

1. 인기도 기반 추천이란?

인기도 기반 추천이란, 말그대로 가장 인기있는 아이템을 추천하는 것을 의미한다. 하지만 '인기'는 추상적인 개념이라 이를 평가할 수 있는 지표가 필요하다. 우리가 인터넷에서 상품을 고르거나, 뉴스를 볼 때 어떤 것들을 고려하는가? 조회수나 좋아요/싫어요 수, 리뷰 수, 평균 평점 등을 고려할 것이다. 대표적인 예시로 네이버쇼핑에서 제공하는 랭킹순 아이템이 있다. 개인에게 맞춰서 제공되는 추천은 아니지만 인기도와 신뢰도 지수 등을 종합하여 점수가 높은 아이템을 상단에 제시해주는 기능이다.

 

[그림1] 네이버 쇼핑 랭킹순 설명 창

 

추천하려는 아이템이 어떤 것이냐에 따라서 적합한 척도가 다르다. 예를 들어, 뉴스를 추천하면 다른 사용자들도 많은 관심을 가지는 핫한 뉴스를 보고 싶어할 것이다. 이런 경우에는 평점보다는 조회수가 매우 중요하다. 반면에 맛집을 찾는다면 평점이 더 중요한 척도로 활용될 것이다.

 


 

2. 조회수 기반 추천 (Most Popular)

사용자는 뉴스를 볼 때 핫한 이슈이면서도 최근 소식을 보기를 원한다. 따라서, 조회수와 날짜를 조합한 점수를 만들면 사용자에게 최근에 작성된 따끈따끈하고 핫한 뉴스를 추천할 수 있다. 예시로, IT 뉴스 서비스 웹사이트인 'Hacker News'와 소셜 뉴스 웹사이트인 'Reddit'에서 사용하는 뉴스 추천 알고리즘을 소개한다.

 

(1) Hacker News Ranking Algorithm

 

Hacker News Website


[그림2]는 Hacker News의 점수화 알고리즘이다. 분자의 pageviews는 해당 뉴스의 조회수이다. 1을 빼는 이유는 기사 작성자의 조회수를 제거하기 위함이다. 분모의 age는 뉴스 업로드 날짜로부터 현재까지 지난 기간(Hours)를 의미한다 (2는 왜 더해주는지 나와있지 않다.) gravity는 age가 커질수록 분모를 얼마나 더 크게 증가시킬 것인지 설정하는 상수이다. Hacker News에서는 gravity 값을 1.8로 설정한다. 조회수가 높을수록 점수가 높아지지만, 시간이 지남에 따라 오래된 뉴스는 조회수가 높더라도 낮은 점수를 갖게 된다. 그리고 중력 상수가 클수록 시간의 흐름에 더 많은 영향을 받게 된다.

 

[그림2] Hacker News Ranking Algorithm

 

[그림3]의 좌측 그래프는 중력 상수는 같은데 뉴스의 조회수가 다를 때, 시간이 지남에 따라 점수가 어떻게 변하는지 보여준다. 조회수가 낮을수록 동일한 시간이 지났을 때 점수가 상대적으로 더 가파르게 하락하는 것을 볼 수 있다. [그림3]의 우측 그래프는 조회수는 같고 중력 상수가 다를 때, 점수의 변화를 보여준다. 중력 상수가 높을수록 시간이 지남에 따라 가파르게 점수가 하락한다. (링크)

 

[그림3] News Hackers Score Graphs

 

(2) Reddit Formula

Reddit Website

 

[그림4]는 Reddit의 점수화 알고리즘이다. 크게 두 가지 부분으로 나눌 수 있다. 첫번째 텀은 인기도(좋아요와 싫어요 수)를, 두번째는 인기도에 더불어 뉴스의 나이를 반영하는 부분이다. 두 가지 텀이 갖는 의미에 대해 상세히 알아보자.

 

[그림4] Reddit News Ranking Algorithm


[1] 첫번째 텀

첫번째 텀은 로그 함수를 사용했다는 점을 주목하자. [그림5]의 그래프에 따르면 x값이 증가함에 따라 y값의 증가 기울기가 점점 완만해지는 것을 알 수 있다. 즉, 이미 충분히 인기도가 높은 뉴스에 대해서는 증가분을 점수에 크게 반영하지 않겠다는 뜻이다. 여기서 인기도는 추천과 비추천 수 차이의 절대값이다. 이는 추천이 많으면서 비논쟁적인 글이 상위에 있도록 만든다.

 

[그림5] 로그 함수 그래프



[2] 두번째 텀

Hacker News Ranking Algorithm이 은 포스팅한지 오래될수록 점수를 낮게 만드는 Age Decaying의 방법을 택했다면, Reddit은 최근의 뉴스일수록 더 높은 점수를 갖도록 한다. 우선 여기서 Seconds란 Reddit의 첫 오픈 일자부터 뉴스 포스팅 일자 사이의 시간(초 단위)을 의미한다. 따라서, 포스팅 일자가 최근일수록 더 높은 값을 가진다. 분모의 45000(초)는 12시간 30분과 같다. Reddit 첫 오픈 일자부터 12시간 30분이 지날때마다 1점씩 추가된다.


 

3. 평점 기반 추천 (Highly Rated)

앞에서 소개한 두 알고리즘은 빈도수를 기반으로 랭킹했다면, 이번에 소개할 내용은 연속적인 값(평점)을 활용한다. 평점은 점수를 세분화하여 다양한 아이템 간의 비교를 용이하게 한다는 점에서 좋은 지표이지만, 평가받은 빈도를 고려하지 못한다는 단점이 존재한다. 각각 5번과 500번의 평가를 받은 두 아이템의 평점이 같은 5점일 때, 우리는 두 개의 5점을 다르게 받아들일 것이다. 충분히 많은 수의 평가를 받은 아이템에 더 신뢰가 갈 것이다. 이처럼 평점뿐만 아니라 신뢰성을 함께 고려하는 것이 중요하다. 예시로, 게임 플랫폼 'Steam'의 게임 랭킹 알고리즘을 소개한다.

 

(1) Steam Rating Formula

[그림6]을 보면 각 게임별로 '평균 긍정률(average of positive rating)'을 확인할 수 있다. 전체 리뷰 수 중에서 긍정적으로 평가(긍정이면 1, 아니면 0)한 리뷰 수를 나타낸다.

 

Steam Positive Rating


[그림6]에 따르면 게임의 순위를 매길 때 앞서 소개한 평균 긍정률을 사용한다. 이를 avg_rating이라 하자. 주목할 점은 두번째 텀에서 리뷰 수에 따라 점수를 보정한다는 것이다. 리뷰 수가 충분히 많은 경우에는 두번째 텀이 0으로 수렴하게 되면서 평균 긍정률을 거의 그대로 점수에 반영한다. (로그함수에 마이너스를 취함으로써 리뷰 수가 높아지면 0에 수렴한다.) 하지만 리뷰 수가 적은 경우에는 두번째 텀이 점수를 보정하는 역할을 한다. 평점이 0.5보다 낮은 경우, 두번째 텀이 음수가 되면서 점수를 높게 만들고, 반대로 평점이 0.5보다 높은 경우 두번째 텀이 양수가 되면서 낮게 보정해준다. 0.5는 Steam에서 사용하는 점수가 0 또는 1이라 이 둘의 가운데 값을 사용한 것이다.

 

[그림6] Steam Rating Formula

 

Steam Rating Formula를 1~5점인 영화 평점에 적용해 보면 어떨까? 기준이 되는 점수를 0.5에서 3.0으로 변경하였다. 1에서 5점 사이이므로 가운데 값인 3을 넣었으며, 전체 평점들의 평균이나 중앙값 등을 사용해도 무방하다. avg_rating의 분자를 전체 평점의 합으로 수정했다. 이와 같이 기존 랭킹 알고리즘을 내가 원하는 문제에 맞게 변형하여 사용해보면 좋을 듯하다.

 

[그림7] Movie Rating Formula




 

4. Python 코드

아래는 본 포스팅에서 소개한 세 가지 랭킹 알고리즘의 파이썬 코드이다.

1) Hacker News Ranking Algorithm

def hacker_news_score(votes, item_hour_age, gravity=1.8): 
    return (votes - 1) / pow((item_hour_age+2), gravity)

 

2) Reddit News Ranking Algorithm

import numpy as np 
from datetime import datetime, timedelta 

epoch = datetime(1970, 1, 1) 

def epoch_seconds(date): 
    ## convert datetime to seconds 
    td = date - epoch 
    return td.days*86400 + td.seconds + (float(td.microseconds)/100000) 
    
def score(ups, downs): 
    return ups - downs 
    
def reddit_score(ups, downs, date): 
    """The hot formula. Should match the equivalent function in postgres.""" 
    s = score(ups, downs) 
    order = np.log10(max(abs(s), 1)) 
    
    if s > 0: sign = 1 
    elif s < 0: sign = -1 
    else: sign = 0 
    
    seconds = epoch_seconds(date) - 1134028003 
    
    return round(order + sign * seconds / 45000, 7) 
    
print(reddit_score(1000, 200, datetime(2021, 8, 10))) 
print(reddit_score(1000, 200, datetime(2020, 8, 10)))

 

3) Steam Rating Algorithm

import numpy as np 

def GetRating(positiveVotes, negativeVotes): 
    totalVotes = positiveVotes + negativeVotes 
    average = positiveVotes/totalVotes 
    score = average - (average - 0.5 )*2**(-np.log10(totalVotes + 1)) 
    return score * 100
    
GetRating(10, 0)

 


 

References

[1] https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d

 

How Hacker News ranking algorithm works

In this post I’ll try to explain how the Hacker News ranking algorithm works and how you can reuse it in your own applications. It’s a very…

medium.com

[2] https://medium.com/jp-tech/how-are-popular-ranking-algorithms-such-as-reddit-and-hacker-news-working-724e639ed9f7

 

How are popular ranking algorithms such as Reddit and Hacker News working?

Have you ever wondered how people arrange posts on the homepage, the “hot” section of news sites such as Reddit, Hacker News…

medium.com

[3] https://repo.tistory.com/5

 

레딧의 랭킹 알고리즘은 어떻게 동작하는가

출처 : http://amix.dk/blog/post/19588 How Hacker News ranking algorithm works 의 후속 포스트이다. 반복해서 이번엔 레딧 의 기본 랭킹 알고리즘이 어떻게 동작하는지 조사할 것 이다. 레딧의 알고리즘은..

repo.tistory.com

[4] https://steamdb.info/blog/steamdb-rating/

 

Introducing Steam Database's new rating algorithm

A short write-up on how the rating algorithm was made, and why it's probably a better estimate of the score.

steamdb.info

 

반응형

댓글