일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Neural Collaborative Filtering
- Recommender System
- 부스트캠프 AI Tech
- 백준
- Tacotron2
- Negative Sampling
- Noise Contrastive Estimation
- FastSpeech
- RecSys
- FastSpeech2
- Skip-gram
- matrix factorization
- wavenet
- TTS
- Tacotron
- word2vec
- BOJ
- CF
- Dilated convolution
- SGNS
- Ai
- NEG
- CV
- ANNOY
- ALS
- 추천시스템
- Collaborative Filtering
- Implicit feedback
- 논문리뷰
- Item2Vec
- Today
- Total
devmoon
인기도 기반 추천 (조회 / 평점) 본문
추천 시스템을 만든다고 했을 때 바로 떠오르는 아이디어 중 하나는 분명 "가장 인기 있는 아이템을 사용자에게 추천한다" 일 것이다. 통계적으로 많은 사람들이 좋아했고 구매했기 때문에 잠재적으로 다른 사용자도 해당 아이템을 선호할 가능성이 높기 때문이다. 이번 글에서는 이런 인기도 기반 추천 시스템에 대해서 알아보고자 한다
인기도 기반의 추천시스템은 현업에서 주로 데이터가 부족하거나, 또는 서비스를 시작한 지 얼마 되지 않았을 때 사용한다. 데이터를 부족하기 때문에 추천 모델을 구축하는데 어려움이 있고, 서비스를 시작하지 않은 것도 마찬가지로 데이터가 부족한 현상으로 이어지게 된다.
인기도 기반 추천을 하기 위해서는 각 아이템들을 특정 점수를 기준으로 정렬할 필요가 있다. 인기도의 기준을 어떻게 정할지 경정해야 하는데, 다음 2가지를 생각해 볼 수 있다.
- 조회수가 높은 아이템 (Most Popular)
- 평점이 높은 아이템 (Highly Rated)
Most Popular
조회수를 기준으로 한 추천모델을 적용하기에는 "뉴스"라는 매체가 가장 적합하다. 뉴스는 최근에 화제가 되는 소식들을 빠르고 정확하게 전달하는 것이 중요하다. 그렇기 때문에 사람들이 많이 보는 관심사 뉴스가 다른 대중들에게도 분명 관심 있는 화제가 될 것이다.
각 뉴스 기사들에게 점수를 매길 수 있다면 단순하게는 뉴스의 조회수를 기준으로 정렬할 수 있겠지만, 기사마다 좋아요 수와 싫어요 수가 있으며 시간이 오래되면 해당 뉴스는 최근의 화제거리가 되지 않기 때문에 추천 순위에서 밀려나야 한다. 이 유의사항을 고려한 수식을 추상화해서 적어보면 다음과 같다.
\begin{aligned}
\text{score} &= f(\text{popularity}, \text{age})\\
&= (\text{upvote} - \text{downvote}) - \text{time elapsed}\\
&= \text{page view} - \text{time elapsed}
\end{aligned}
하지만 위의 수식에서도 문제가 있다. 좋아요의 수가 지난 시간 대비 너무 높아서 오래된 기사임에도 불구하고 계속 상위권에 노출이 될 수 있다. 이문제를 해결하기 위해 해외 뉴스사인 Hacker News에서는 수식을 다음과 같이 새로 정의하였다.
$$ \text{score} = \frac{\text{pageviews} - 1}{(\text{age} + 2)^{\text{gravity}=1.8}} $$
기존과 마찬가지로 좋아요와 조회가 많은 기사를 추천하되, 시간이 오래된 기사일수록 그 점수를 빠르게 감소시켜서 추천목록에 뜨지 않도록 하였다. 빠르게 감소시킬 수 있는 것은 분자의 증가속도보다 분모의 증가속도를 크게 한 덕분이다. 다른 예시로 미국의 인터넷 커뮤니티인 Reddit의 게시글 추천 계산 공식이 있다.
$$ \text{score}=\log_{10}(\text{ups} - \text{downs})+\frac{\text{sign(ups-downs)}\cdot \text{seconds}}{45000} $$
Reddit 인기도 추천 공식의 특징으로는 좋아요 수에 $\log$ 연산을 취해 초반의 좋아요 수에 대해서는 큰 가산점을 주지만, 이후에 아무리 좋아요 수가 많아져도 큰 가산점으로 이루어지지 않도록 제한을 걸었다. 뒤에서는 절대 시간을 사용하여 최근에 올라온 게시물일수록 더 큰 가산점을 주도록 하였는데, 앞에서 오래된 게시물에 대해 감점을 하는 것과는 반대되는 방법이다.
Highly Rated
평점을 기준으로 한 인기도 기반 추천에도 주의할 점이 여러 가지 있다. 우리가 평소에 맛집을 찾거나 볼 영화를 검색할 때, 음식점이나 영화의 평점이나 후기를 보게 되는데 단순히 그 평점 자체만을 보지 않고 몇 개의 평점이 쌓였는지도 함께 보게 된다. 5.0 점 만점 중에 5.0점이며 그 개수가 1개인 가게와 4.8 점인데 그 개수가 2000 개인 가게 중에서 어떤 곳을 가게 될지 생각해보면 더 잘 와닿는다.
$$ \text{score} = f(\text{rating}, \text{# of ratings}) $$
유명한 게임 제공 사이트 중 하나인 Steam에서는 평점 정보를 기준으로 추천을 할 때 위의 기본 공식에 수정을 하여 다음과 같이 사용한다.
$$ \text{avg rating}=\frac{\text{number of positive reviews}}{\text{number of reviews}} $$
$$ \text{score} = \text{avg rating} - (\text{avg rating}-0.5)\cdot 2^{-\log(\text{number of reviews})} $$
평균 평점을 사용하여 점수를 계산하지만, 남겨진 평점의 수의 개수에 따라 점수의 보정을 진행하였다. 리뷰의 개수가 적을 때에는 아래의 수식을 사용하여 0.5 점을 중간값으로 점수를 내리거나 올려주었다. 당연히, 리뷰의 개수가 아주 많은 경우에는 평균 평점과 값이 유사해지게 된다. 여기서 만약, 5점 만점인 데이터에 대해서는 1점 ~ 5점 사이의 중앙값인 3점을 0.5점 대신 사용하여 수식을 고치는 것이 가능하다. 이 방법 이외에도, 전체 데이터의 평점에 대한 평균값을 기준으로 점수 보정을 해도 된다.
$$ \text{score} = \text{avg rating} - (\text{avg rating}-3.0)\cdot 2^{-\log(\text{number of reviews})} $$
'AI > 추천 시스템' 카테고리의 다른 글
Content Based Recommendation / TF-IDF (0) | 2022.11.02 |
---|---|
연관 규칙 탐색 알고리즘 (2) | 2022.10.24 |
연관 규칙 분석 / support, confidence, lift (0) | 2022.10.22 |
추천시스템의 평가 지표와 Offline/Online Test 방법 (0) | 2022.10.20 |
추천시스템 도입과 기초 (2) | 2022.10.18 |