추천시스템
본 포스팅은 Minnesota대학교의 Intro to Recommender Systems코세라 강좌를 정리한 내용입니다.
https://www.coursera.org/learn/collaborative-filtering?specialization=recommender-systems
서론
기본적으로 사용자-사용자 필터링은 잘 동작 한다. 하지만 데이터가 부족할때는 예측값을 만들어내기 힘들다. 큰 시스템에서 사용자가 많다 해도, 공통점을 찾을 수 없는 사용자가 있다면 추천을 만들어내기 힘들다. 또한 평점을 잘 매기지 않는 사용자들에게도 추천을 만들기 힘들다. 이런 단점을 극복하기 위해 아이템-아이템 필터링이 고안되었다.
사용자보다는 여러 사람들이 평점을 매기는 아이템에 데이터가 더 많을 수 있다.
또한 아이템-아이템 필터링은 계산이 복잡하지 않다. 사용자가 몇개의 아이템에 더 평점을 매겼다면, 복잡한 계산을 그 때마다 다시 진행해야 한다는 단점이 있지만, 계산이 덜 복잡하다면 부하가 덜 걸릴 것이다.
아이템-아이템 통찰
아이템끼리의 관계는 사용자들끼리의 관계보다 안정적이다.
물건에 대한 특성은 사람에 대한 특성보다 변하기 쉽지 않기 때문에,
비슷한 아이템끼리의 특성은 잘 변하지 않고, 점수 또한 그렇다.
그리고, 아이템끼리의 유사성을 계산하면, 그것을 통해 사용자의 선호도를 계산할 수 있다.
계산 절차
- 두개의 아이템 사이의 유사도를 계산한다.
- 평점 벡터 두개의 연관성(피어슨)을 계산한다.
- 두개의 아이템 벡터의 Cosine 유사도를 계산한다.
- 한개의 아이템에는 조건부 확률을 계산한다.
- 그 결과를 통해 사용자-아이템간의 평점을 예측한다.
- 편차가 적용된 이웃 사용자들의 평균값을 사용한다.
- 평점을 선형회귀로 예측한다.
이 외에도 아이템들을 하나하나 계산하지 않고, 상위 N개의 아이템을 바로 예측할 수도 있다. 이런 경우, 작은 이웃들이 구입한 아이템들을 모아 유사도를 계산하면, 비교적 간단하게 추천을 만들어 낼 수 있고, 범위가 많이 좁아진다.
아이템-아이템 기법의 장점
- 생각보다 잘 동작한다.
- 예측의 정확도가 높다.
- 상위 N개의 성능이 좋다.
- 효율적인 구현법이다.
- 아이템보다 사용자가 많을 때는 매우 좋다.
- 사용자의 취향처럼 많이 가변성이 아니라서, 미리 계산해 놓을 수가 있다.
- 적용분야와 확장성이 넓다.
- 쇼핑카트나 사용자 프로필에 빠르게 적용해 볼 수 있다.
한계점
- 아이템-아이템 기법은 아이템끼리의 관계가 변하지 않는다고 가정한다.
- 빠르게 변하는 책이나 노래같은 경우는 쉽지 않을 수 있다.
- 시즌의 아이템이나 단기간의 아이템은 문제가 있을 수 있다.
- 계속 추천을 하다보면, 너무 예측 가능한 추천만 나온다.
- 이 문제는 학자들의 불만이다. (정확한 근거가 나오지는 않았다.)
알고리즘
기본적 아이디어는, 아이템끼리의 유사도를 미리 계산해놓고, 사용자가 관심있는 (쇼핑카트에 있거나 이미 구입한 아이템) 아이템들과 비슷한 아이템을 추천한다.
기존의 사용자-사용자 추천은 다음과 같다:
$$S(u, i) = \frac{\sum_{v \in U} w_{uv} \hat{r}_{ui}}{\sum_{v \in U} w_{uv}}$$
아이템-아이템 추천은 다음과 같다:
(다른 사용자가 아니라 사용자가 평점을 매긴 아이템들을 본다는 점에서 다르다)
$$S(u, i) = frac{ \sum_{j \in N} w_{ij} \hat{u}_j}{\sum_{j \in N} w_{ij}}$$
N은 모든 아이템의 집합이다.
j는 N에 있는 u가 아닌 다른 아이템들이다.
$w_{ij}$는 아이템과 아이템 사이의 가중치이다.
$\hat{u}_j$ 는 아이템 j에 대한 사용자 u의 평점이다.
그렇다면 가중치 w (아이템끼리의 유사도)는 어떻게 계산할까?
이 때 우리는 아이템끼리의 유사도를 구하기 원한다.
그리고 이것은 코사인 유사도로 간단하게 구할 수 있다.
$$w_{ij}$$
$$= cos(\hat{\bar{r}}_i, \hat{\bar{r}}_j)$$
$$= \frac{\hat{\bar{r}}_i \hat{\bar{r}}_j}{||\hat{\bar{r}}_i, \hat{\bar{r}}_j|| ||\hat{\bar{r}}_j||}$$
$$= \frac{\sum_u \hat{\bar{r}}_i \hat{\bar{r}}_j}{\sqrt{\sum_u \hat{r_{ui}}^2} \sqrt{\sum_u \hat{r_{ui}}^2}}$$
이 수식은 복잡해 보일 수 있지만, 결국 두 벡터의 내적곱을 구한 뒤, 두 벡터의 길이를 곱한것이다.
그렇다면 사용자-사용자 기법에서 했던것 처럼 사용자-아이템 평점관계에서도 정규화를 해야할까?
위 수식에 정규화를 적용하면 다음과 같이 된다:
$$\frac{\sum_u (r_{ui} - \hat{\bar{r}}_i) (r_{uj} \hat{\bar{r}}_j)}{\sqrt{\sum_u (r_{ui} - \hat{\bar{r}}_i)^2} \sqrt{\sum_u (r_{uj} \hat{\bar{r}}_j)^2}} $$
마지막으로 이웃들 N은 어떻게 구할까?
아이템 i와 유사성이 있는, 상위 K개의, 사용자 u가 평점을 매긴 아이템을 고르면 된다.
사용자-사용자 기법에서, 결과값을 사용자의 평균 평점에 더해주었던 것을 기억할것이다.
아이템-아이템 기법에서도 비슷한 방법을 사용해 수식을 업데이트 했다:
$$S(u, i) = \frac{\sum_{j \in N(i;u)} w_{ij} (r_{uj} - \bar{r}_j)}{\sum_{j \in N(I;u)} |w_{ij}|} + \bar{r}_i$$
정리
위를 다시 정리하면 다음과 같다.
- 아이템간의 유사도를 구한다: 코사인 유사도
- 정규화를 한다면 평균값으로 한다.
- 없는 값은 0으로 취급한다.
- 아이템들의 점수를 구한다.
- 이 점수는 다른 아이템들의 평점으로 결정된다.
- 유사한 K개의 이웃을 구한다
- 모델을 구축한다.
- 필요하다면 모델을 수축시긴다 (필요없는 이웃들을 버린다)
'아카이브 > 추천시스템(2019)' 카테고리의 다른 글
추천시스템 16 - 사용자-사용자 협업필터링 코드예제 (0) | 2019.07.07 |
---|---|
추천시스템 15 - 단항의 아이템 추천 (0) | 2019.07.07 |
추천시스템 13 - 사용자-사용자 협업필터링 (0) | 2019.07.01 |
추천시스템 12 - 컨텐츠기반 추천 코드예제 (0) | 2019.07.01 |
추천시스템 11 - TFIDF (0) | 2019.06.30 |