R을 사용한 추천 알고리즘 만들기 1/3

Netflix Prize와 추천 알고리즘

Netflix Prize를 알고 계신가요?

이 대회는 미국의 온라인 DVD 대여 및 비디오 스트리밍 서비스 회사인 Netflix 사에서 주최한 대회인데요, 사용자의 컨텐츠에 대한 사용자의 평점을 얼마나 정확하게 예측하는 모델을 개발하느냐를 두고 세계 각국의 Data scientist들이 경쟁을 한 것으로 유명하죠.

netflix소스: www.dumpaday.com

예측 모델의 정확성을 높이는 이 대회에 Netflix는 100만 달러의 상금을 걸었습니다. 사용자의 평점을 정확하게 예측하는 것이 왜 중요할 까요?  사용자에게 보다 정교한 추천을 하기 위해서 입니다.

Netflix의 추천 시스템은 Viewership의 75%를 차지할 정도로 그들의 비즈니스에서 중요한 부분입니다. 시스템에서 추천해 준 영화를 믿고 시청했는데 생각보다 재미가 없다면 추천 자체에 대한 신빙성도 떨어지고, Viewership에도 타격을 받겠죠.

비단 Netflix 뿐만이 아니라 Amazon(판매의 35%가 추천에서 발생), Google News(38%이상의 page view가 추천에서 발생) 등 많은 거대 IT기업에서 이미 추천 알고리즘은 비즈니스의 중요한 부분이 되어가고 있습니다.

추천 알고리즘의 원리를 알아보자

그렇다면 추천 알고리즘은 어떻게 만들어 지는 것일까요?

A라는 친구에게 영화를 추천해 준다고 가정해 봅시다. A가 재미있게 본 영화는 엑스맨 시리즈, 미션 임파서블 시리즈, 올드보이, 신세계, 엽기적인 그녀라고 하네요.

이 친구에게 어떤 방법으로 영화를 추천해 주면 좋을까요?

1. 비슷한 스타일의 영화 추천해 주기 (Contents based recommendation)

가장 생각하기 쉬운 방법으로는 비슷한 장르의 영화끼리 추천하는 것이겠죠? 예를 들어 아래와 같은 로직으로 추천하는 것입니다.

엑스맨 시리즈 -> 떼지어 나오는 히어로물 -> 어벤저스 시리즈
미션 임파서블 시리즈 -> 잘생긴 스파이물 -> 본 아이덴티티 시리즈

이렇게 추천하고자 하는 대상의 내용을 기준으로 추천하는 방법이 Content-based 추천 방법입니다. 이 알고리즘에서 필요한 것은 대상의 내용을 잘 정리해 놓은 설명서 혹은 Tag가 되겠지요.

이 방식의 장점은 다른 사용자의 정보나 평가 내역 없이 손쉽게 추천할 수 있는 점, 새로 출시된 컨텐츠에 대해서도 추천할 수 있다는 점이 있습니다.

반면 단점은 추천하는 항목이 비슷한 장르에 머무르게 되는 한계가 있습니다.

2. 취향이 비슷한 친구가 좋아하는 영화 추천해 주기 (User based collaborative filtering)

이 방법은 친구와 취향이 유사한 다른 친구가 좋아하는 영화를 추천해 주는 방법입니다.

예를 들어 친구 A와 B가 모두 “올드보이”, “엽기적인 그녀”라는 영화에 5점을 입력하였다면, 이 둘 사이의 거리는 0입니다. 반면 C라는 친구가 “올드보이”에 2점을 입력하였다면 둘 사이의 거리는 층가하게 되겠죠. A는 C와는 다르고 B와는 유사한 취향을 가지고 있으므로 A에게 B가 좋아하는 다른 영화인 “쿵푸팬더”를 추천해 주는 방식입니다.

이렇게 사용자 간의 유사도를 활용하여 추천하는 방법이 User based 추천 방법입니다.

로직을 좀더 자세히 살펴볼까요?

아래는 6명의 사용자가 8개의 아이템에 대해 평가한 매트릭스 입니다. 이때 사용자 x와 가장 유사한 사용자를 알아내려면 어떻게 해야 할까요?

사용자 간의 거리를 측정해서 가장 가까운 3명의 사용자들을 찾아내면, 아래 노란색으로 표시된 사용자들이 필터링 됩니다.

(협업 필터링에서 사용자 간의 거리 측정은 주로 Pearson correlation coefficientCosine similarity를 사용해서 이루어 집니다만, 복잡한 관계로 여기서는 다루지 않겠습니다. )

user based collaborative filtering
예시: user based collaborative filtering

사용자 X가 기존에 평가하지 않은 아이템에 대해 얼마나 평점을 줄지를 예측하기 위해서는, 사용자 X와 유사한 사용자 1, 3, 4의 평점을 평균해서 계산하게 됩니다.

이런 방식으로 사용자 X가 평가하지 않은 아이템 중 최고 예상 순위 N개도 뽑아 낼 수 있는 것이죠.  위 표를 보니 아이템 2, 1번을 사용자 X에게 추천해 주면 좋은 반응을 보일 것 같네요.  예상 평점이 낮은 7, 5번은 추천하기 힘들겠죠.

여기까지가 User-based collaborative filtering의 기본 개념입니다. 실제로 사용되는 추천 시스템에서는 표준화된 점수를 사용합니다. 사용자 간 평점을 주는 정도가 다르기 때문에 (누구는 전체적으로 짜게 준다던지, 누구는 전체적으로 후하게 준다던지…) 사용자의 평점을 Z-score 등을 사용해서 표준화 하는 것이죠.

User-based 방식의 단점은 아무래도 메모리가 많이 소요된 다는 점입니다. 위의 매트릭스는 매우 간소화 된 것인데 만약 모든 유저가 row로 모든 item이 column 으로 들어간다면 처리해야 할 데이터 셋과 계산량이 매우 크겠죠.

3. 사람들이 비슷하게 좋아하는 영화를 추천해 주기 (Item-BASED COLLABORATIVE FILTERING)

“올드보이”를 좋아하는 친구 B, C, D, E 모두 “내부자들”을 좋아한다고 가정해 봅시다. 그렇다면 “올드보이”와 “내부자들”의 거리는 매우 가깝다고 할 수 있습니다. 따라서 “올드보이”를 좋아하는 친구 A에게도 “내부자들”을 추천해 줍니다.

이렇게 User-based collaborative filtering과 유사하게 유사도를 기준으로 아이템 간의 거리를 측정한 후 비슷한 아이템을 추천하는 방식을 Item-based collaborative filtering 이라고 합니다.

이 방식은 오늘날 가장 광범위하게 사용되는 추천 방식입니다. 넷플릭스, 아마존도 아이템 기반의 알고리즘을 사용하고 있습니다. 사용자 대비 아이템 수가 적기 때문에 메모리 부담도 상대적으로 적은 편이죠.

item based collaborative filtering
예시: item based collaborative filtering

로직을 좀 더 구체적으로 살펴보자면 우선 아이템 간의 거리를 담고 있는 Item by item 매트릭스를 만듭니다. 거리 측정은 아까 말씀 드린 Pearson correlation coefficient와 Cosine similarity이나 평점 간 correlation 등의 방법을 사용합니다.

이제 사용자 X가 평점을 매긴 아이템 1, 5, 8번이 있습니다.  이 사용자 x에게 추천해 주기 위한 아이템을 찾아내기 위해서 사용자 x가 평가하지 않은 아이템(2,3,4,6,7)들을 평가합니다.  이 부분은 User-based collaborative filtering과 유사합니다.

 

 

다음 포스팅에서는 R의 package 인 Recommenderlab을 사용해서 Collaborative filtering 방법으로 추천 알고리즘을 만드는 과정을 자세히 살펴보도록 하겠습니다.

 

 

참고자료

1) 김민환, Recommendation system – 협업 필터링을 중심으로

2) Wikipedia, Recommender system

3) Michael Hahsler, Recommenderlab: A Framework for Developing and Testing Recommendation Algorithms

4) Kthdaisy , 추천 시스템 분석 – 어떻게 아마존과 넷플릭스가 당신의 취향을 예상하는가?