본문 바로가기

갈아먹는 추천 알고리즘 [2] Collaborative Filtering

지난 글

갈아먹는 추천 알고리즘 [1] 추천 알고리즘의 종류


들어가며


지난 글에서는 대표적인 추천 알고리즘인 Contents Based Filtering과 Collaborative Filtering을 소개하였습니다.

이번 글에서는 Collaborative Filtering에 초점을 맞추어 어떤 데이터 셋을 다루는지,

실제 추천을 진행하기 위해서 어떠한 기법들을 사용하는 지를 다뤄보겠습니다.



Basic Concept


앞서서 Collaborative Filtering은 사용자들이 남긴 평점 데이터 셋을 사용한다고 하였습니다.

이는 아래와 같이 하나의 X축이 사용자, Y축이 아이템인 행렬로 표기가 가능합니다.


사용자들의 평점 행렬


위의 그림을 보면 각기 다른 사용자 4명이 5편의 영화에 대해서 1 ~ 5점 사이의 평점을 남긴 것을 볼 수 있습니다.

하지만 현실에서는 위의 그림처럼 모든 사용자들이 모든 아이템에 대하여 평가를 남겨주는 경우가 드뭅니다.

현실에서의 평점 행렬


사용자가 아직 평점을 남기지 않은 아이템에 대해서는 ? 로 남아있는 것을 볼 수 있습니다.

Collaborative Filtering 이란 이렇게 주어진 평점 데이터 만으로 

아직 평점을 남기지 않은 아이템들에 대한 평점을 예측하는 기법입니다.

그리고 예측 평점이 높은 아이템을 추천해주는 방식입니다 .


이 때, 평점 데이터는 다시 그 성격에 따라서 Explicit Dataset과 Implicit Dataset 으로 구분됩니다.

그리고 각각에 따라서 평점 행렬의 ? 를 예측하는 수식이 달라집니다.



Explicit Dataset

선호와 비선호를 명확하게

구분해준 데이터 셋


Explicit dataset이란 사용자가 아이템에 대하여 선호와 비선호를 명확하게 구분해준 데이터 셋을 말합니다.

영화 평점 처럼 해당 영화가 좋을 시에는 5점, 별로인 경우에는 1점을 매겨주는 것이 좋은 사례입니다.

이 경우, 사용자가 어떠한 아이템을 좋아하고, 싫어하는 지를 알 수 있습니다.


여자 친구를 맛집에 데려간 상황에 비유해보도록 하겠습니다.

여자 친구는 호불호가 명확해서 어떤 메뉴가 좋고 어떤 메뉴가 싫은지 확실하게 표시해줍니다.

때문에 다음번 맛집을 조사할 때는 이전에 싫어한 메뉴는 피하고, 좋아한 메뉴와 유사한 메뉴를 선택하면 됩니다.


하지만 현실이 늘 그렇듯 호락호락하지 않습니다.

호불호가 명확한 사람이 있는 반면, 너무 착해서 싫은 소리 한 마디 못하는 사람도 있습니다.

이러한 사람이 남겨주는 데이터를 Implicit Dataset이라 합니다.



Implicit Dataset

선호와 비선호의 구분 없이

행동의 빈도수만 기록한 데이터 셋


Implicit Dataset호불호 구분 없이 사용자가 아이템을 얼마나 소비하였는지를 기록한 데이터 셋입니다.

쇼핑몰의 클릭 로그가 좋은 사례입니다.

사용자는 관심이 가는 상품을 쇼핑몰 상에서 클릭하게 됩니다.

여러번 클릭한 상품은 확실히 선호하는 상품으로 간주할 수 있습니다.


하지만 관심이 없는 상품은 관심이 없다고 표시하여 주지 않습니다.

또한 클릭을 하지 않았다고 하여 그 아이템을 선호하지 않는다고 볼 수 없습니다.

단지 보지 못해서 클릭을 안 했을 수도 있고, 선호하지 않아서 클릭을 안 했을 수도 있습니다.


여자친구의 비유로 돌아가보겠습니다.

이번 여자 친구(?)는 호불호를 표시 안해줄 뿐더러 음식에 대한 선입견이 있습니다.

어떤게 좋다 싫다 말 없이 자기 입맛에 맞는 음식만 잘 먹습니다.


다음 번 맛집을 찾아야 할 때 우리는 고민에 빠집니다.

여자친구가 먹지 않았던 음식들 중에 좋아하는 음식이 있지 않을까? 아니면 싫어해서 안먹었던 것일까?

애매합니다. 하지만 우리의 현실은 이러한 Implicit Dataset들이 훨씬 많습니다.



두 데이터 셋의 차이점

사용자의 평점 행렬


앞서 보았던 현실에서의 평점 행렬 그림으로 돌아가보겠습니다.

우리의 목표는 ? 안에 어떠한 숫자가 들어갈 지 예측하는 것이었습니다.


Explicit Dataset에서 우리는 주어진 평점 만으로 사용자의 선호 / 비선호를 알 수 있었습니다.

이 경우 ? 에 해당하는 데이터들을 제외한 평점 데이터 만으로 사용자의 선호도를 학습한 다음, 추측을 합니다.


반면에 Implicit Dataset은 어떠할까요? 우리는 사용자가 어떤 아이템을 선호하는 지는 알지만,

어떤 아이템을 비 선호하는지 알지 못합니다.

저 ? 안에는 사용자가 좋아하는 아이템이 있을 수도, 없을 수도 있습니다.

때문에 ? 에 해당하는 영역 역시 데이터로 포함하여 사용자의 선호도를 학습합니다.


지금까지 Collaborative Filtering의 개념적인 측면들을 다루어 보았습니다.

그렇다면 Explicit Data와 Implicit Data가 주어졌을 때 구체적을 추천을 어떻게 구현할 수 있을까요?

대표적인 방법으로 Neighborhood modelLatent Factor model이 있습니다.



Neighborhood model


먼저 Neighborhood model은 주어진 평점 데이터를 가지고 서로 비슷한 유저 혹은 아이템을 찾습니다.

이 때 유사도는 주로 Pearson 상관계수를 통해 구합니다.




피어슨 상관계수 [1]


피어슨 상관계수는 쉽게 말하면 양으로 변할 때 함께 양으로 변하고, 음으로 변할 때 함께 음으로 변하는 정도를 나타냅니다.

1인 경우에는 X가 증가하면 Y도 증가하고, X가 감소하면 Y도 감소하는 음의 선형 관계가 나타납니다.

-1 이면 그 반대인 음의 선형 관계가 나타납니다. 

그림으로 나타내면 아래와 같습니다.


피어슨 상관 계수에 따른 데이터 분포 [1]


평점 데이터를 기반으로 유저 간의 상관도를 계산한다고 해보겠습니다.

1에 가까울 수록 서로 유사한 아이템에 높은 선호도를 매긴다고 볼 수 있습니다.

이를 통해서 유사한 사용자가 좋아한 아이템을 추천해 줄 수 있습니다.

이를 User-oriented Neighborhood model이라 합니다. 


아이템 간의 상관관계 역시 분석할 수 있습니다. 그리고 가장 유사도가 높은 K개의 아이템을 묶어줄 수 있습니다.

특정 사용자가 아직 평점을 남기지 않은 아이템을 추천해야할 경우,

이 K개의 가까운 이웃들에게 사용자가 남긴 평점을 가지고 해당 아이템에 내릴 평점을 예측할 수 있습니다.

이를 Item-oriented Neighborhood라 합니다.




Item-oriented neighborhood 공식

사용된 표기


이러한 Neighborhood 기법은 평점 데이터를 가지고 양의 선형 관계 혹은 음의 선형 관계를 계산합니다.
이는 평점 자체에 선호와 비선호가 구분되어 있는 Explicit Dataset에 적합합니다.
한편 유저의 비선호도가 반영되지 않은 Implicit Dataset은 Latent Factor model이 더 적합합니다.



Latent Factor Model


Latent Factor model이란 관찰된 데이터와 잠재되어 있는 데이터를 연결시키는 기법입니다.

우리의 상황에 적용하면 주어진 평점 데이터로 아직 알지 못하는 사용자와 아이템의 특성을 찾아내는 것입니다.

우리가 잘 알고 있는 딥 러닝 역시 이러한 Latent Factor Model의 일종입니다.


현재 우리에게 주어진 데이터는 사용자의 평점을 나타내는 커다란 행렬입니다.

그리고 사용자와 아이템, 두 Latent Factor를 알아내고자 합니다.

이 경우 커다란 평점 행렬을 사용자와 아이템 Latent Factor로 분해하고,

이를 각각 학습시키는 Matrix Factorization 기법이 적합합니다.


Implicit Dataset이 주어질 경우, Latent Factor Model이 Neighborhood model 보다 뛰어난 성능을 보입니다. [2]

하지만 도대체 평점 행렬을 쪼갠다? 잠재된 요소들을 학습시킨다? 뭔 개소리지!!! 

하더라도 걱정하지 않으셔도 됩니다 :)

다음 글에서는 아직 마법처럼 들리는 Matrix Factorization을 조목조목 뜯어보겠습니다.


궁금하신 점이 있거나, 사실과 다른 내용이 있을 경우 댓글, 혹은 이메일을 남겨주세요.

감사합니다 :)



Reference

[1] SPSS, pearson-correlation-coefficient, https://www.spss-tutorials.com/pearson-correlation-coefficient/

[2] Y, Hu et al, Colloabrative Filtering for Implicit Dataset, IEEE 2008

[3] Wikipedia, Latent Factor Model, https://en.wikipedia.org/wiki/Latent_variable_model