본문 바로가기

추천 시스템 | Recommender System

추천 시스템 04. User-based Collaborative Filtering 유저 기반 협업 필터링

안녕하세요, 수달이입니다. 벌써 추천 시스템에 관한 세 번째 포스팅이네요! (👏👏 )  

 

가장 고전적인 방법인 인구통계학적 필터링부터 시작하여, 선형대수를 활용(벡터의 내적)하여 조금 더 개인화된 추천을 제공해주는 컨텐츠 기반 필터링까지. 점점 추천 방법들이 고도화되고 있다는 것이 느껴지시나요? 오늘부터는, 우리의 머신러닝 지식을 한 단계 더 높여줄, 다소 복잡할 수 있지만 실제 산업에서 널리 쓰이고 있는 협업 필터링 Collaborative Filtering에 대해서 공부해보겠습니다. 

 

너와 나의 콜라보

협업 필터링의 핵심 아이디어는 "나와 취향이 비슷한 사람들의 의견을 참고한다"는 것입니다. 너와 나의 취향이 "콜라보(협업)"하여 새로운 추천을 제시하는 것이죠. 음악 추천을 예로 들자면, 플레이리스트에 수록된 곡들이 평소 나와 비슷했던 친구에게 추천받는 것이 훨씬 성공 확률이 높은 것과 같은 이치이죠. 

 

이렇게 간단한 논리에 기반하고 있는 방법론이지만, 너무나 많은 사랑을 받은 탓인지 그 안에서도 다양한 세부 알고리즘이 연구되었습니다. 앞으로 네 개의 포스팅에 나누어서 각 세부 접근법을 소개드릴 텐데요. 그 첫 번째로, 이번 글에서는 유저 기반 협업 필터링 User-based Collaborative Filtering에 대해 이야기해보도록 하겠습니다. 그리고 설명의 편의를 위해, 우리가 최종적으로 추천 아이템 리스트를 제공하는 대상, 즉 '타겟 유저'는 '수달이'라고 가정하겠습니다. 

 

유저 기반 협업 필터링 (User-based Collaborative Filtering)

이름에서 알 수 있듯, 이 알고리즘의 주인공은 '유저'입니다. 그리고 우리는 이 '유저'를 단순히 이름으로 표현하는 대신, n차원의 벡터로 표현하여 더 많은 정보를 함축하도록 만들어줄 겁니다. 지난번 컨텐츠 기반 필터링에서는 아이템의 feature를 활용하여 유저를 n차원의 벡터로 표현했었는데요. (아직 안 읽으신 분들을 위해, 여기서 feature는 아이템에 대한 정보를 의미합니다. 영화를 예로 들면, 장르/감독/국가 등을 영화의 feature라고 할 수 있습니다. 😊) 이번에는 유저가 아이템에 대해 남긴 평점(또는 아이템 구매 기록)으로 벡터를 구성해보겠습니다. 아래 그림의 수달이 벡터처럼요.

 

STEP 1. 비슷한 유저 찾기

다음 단계는 수달이와 비슷한 유저들을 찾는 것입니다. 아이템 구매 기록을 활용하여 수달이를 n차원의 벡터로 표현했듯이, 타 유저들도 동일한 방식으로 표현해줍니다. 그러면 지난 시간에 공부했던 것처럼 벡터의 내적을 활용하여 어떤 유저가 수달이와 비슷한지 파악할 수 있습니다. 사실, 유사성(similarity)을 파악하는 방법에는 벡터의 내적 말고도 여러 방법이 있는데요. 특히, 유저 기반 협업 필터링의 경우에는 피어슨 상관계수(Pearson Correlation Coefficient)가 자주 활용된다고 합니다. 

 

상관계수를 직접 손으로 계산할 일은 거의 없기 때문에, 복잡한 계산은 기계에게 맡기고, 우리는 공식 대신 그래프와 함께 상관계수가 의미하는 바를 이해해보도록 하겠습니다. 우선, 세 명의 유저가 각 영화에 대해 아래의 테이블과 같이 평점(5점 만점)을 주었다고 가정합니다. 

 

 

평점 테이블을 보면 우리는 수달이와 보노보노는 취향이 비슷하고, 수달이와 해달이는 좀 다른 편이라는 것을 느낌적으로 알 수 있습니다. 이제 이 느낌적인 느낌을 평점 그래프로 정확하게 파악해볼까요? 

 

 

우선 왼쪽의 수달이-보노보노 커플의 그래프를 보면, 점들 사이로 우상향 하는 직선을 그릴 수 있습니다. 오른쪽의 수달이-해달이 커플의 그래프는 우하향 하는 선을 그을 수 있겠네요. 우상향 하는 직선은 양(+)의 상관계수, 우하향 하는 직선은 음(-)의 상관계수에 해당합니다. 여기서 주의할 것은, 직선의 기울기와 상관계수를 동일시하면 안 된다는 점입니다. 예를 들어, 직선의 기울기가 같아도 아래의 그림처럼 상관계수가 다를 수 있습니다.

 

출처: Laerd Statistics

 

즉, 상관계수가 양수인지 음수인지는 직선의 기울기로 파악할 수 있지만, 상관계수의 절댓값은 직선의 기울기가 아니라 직선을 중심으로 점들이 얼마나 밀집 또는 분산되어 있는지를 파악해야 합니다. 직선을 중심으로 점이 밀집되어있을수록 서로 관계가 끈끈한 것이고 (위 그림의 왼쪽) 이는 높은 상관계수로 나타나는 것이죠. 

 

자, 그럼 비슷한 유저를 찾는데 상관계수를 활용해볼까요? 앞의 예제에서 보았듯이, 취향이 비슷한 수달이-보노보노는 양의 상관계수를 가지고 있고, 취향이 다른 수달이-해달이 커플은 음의 상관계수를 가지고 있습니다. 유추하자면, 비슷한 유저일수록 상관계수가 높게 나타나고, 따라서 상관계수에 대한 내림차순으로 줄을 세우면 타겟 유저와 가장 비슷한 k명의 유저를 찾아낼 수 있습니다. 

STEP 2. 타겟 유저의 평점 예측하기

이제 수달이와 비슷한 유저를 찾았으니, 그들을 활용해보도록 하겠습니다. 수달이와 가장 비슷한 세 명의 유저인 A, B, C가 영화 '비긴 어게인', '킹스맨', '반지의 제왕'에 아래의 왼쪽 테이블처럼 평점을 주었다고 가정해봅시다. 이 영화들은 수달이가 아직 보지 않은 영화인데, A, B, C가 남긴 평점으로 수달이의 예상해볼 수 있을까요? 우리가 가장 쉽게 써먹을 수 있는 방법은 이들 평점의 평균을 내는 것일 겁니다.

 

 

조금 더 섬세하게 예측을 하고 싶다면, 수달이와 A, B, C가 각각 얼마나 비슷한지를 (ex. 피어슨 상관계수) 가중치로 활용하여 가중평균을 계산할 수도 있습니다. 이렇게 평균 또는 가중평균을 활용하면 수달이가 보지 않은 모든 영화에 대해 수달이의 예상 평점을 채워 넣을 수 있습니다.

STEP 3. 예상 평점이 높은 아이템 추천하기

예상하셨겠지만, 마지막 단계는 간단합니다. 2단계에서 구해 놓은 예상 평점을 내림차순으로 줄을 세워 상위권에 랭크된 영화들을 수달이에게 추천 아이템으로 제시합니다.

장점 그리고 단점

이름만 들으면 무시무시해 보였는데, 생각보다 간단하지 않나요? 그렇습니다. 유저 기반 협업 필터링의 장점은 구현하기 쉽다는 겁니다. 그리고 산업에 대한 전문적 지식이 필요했던 컨텐츠 기반 필터링에 비해, 유저 기반 협업 필터링은 산업에 대한 깊은 이해가 없어도 구매 기록 또는 평점 기록만 있다면 손쉽게 적용할 수 있습니다. 어떤 산업인지 크게 구애받지 않는 셈이죠. 

 

하지만 분명히 한계도 존재합니다. 우선, 대부분의 사람들은 리뷰를 잘 남기지 않습니다. 즉, 유저 기반 협업 필터링에 필요한 인풋인 평점 데이터는 굉장히 희소합니다. 평점 데이터 대신 구매 기록을 사용할 수 있지만, 엄밀히 말하자면 구매 기록이 유저의 선호도를 직접적으로 반영하지 않기 때문에 차선책일 뿐입니다. 

 

또한 확장성면에서도 한계가 있습니다. 타겟 유저와 비슷한 유저를 더 많이 찾으면 찾을수록, 우리의 추천 결과는 더욱 정교해지겠지만 그만큼 계산비용이 많이 들게 됩니다. 특히, 아마존과 넷플릭스 같은 거대한 공룡 업체는 수백만명의 고객들을 보유하고 있는데, 한 명의 타겟 유저를 위해서 수백 번의 상관계수 연산을 한다는 것은 굉장히 비효율적일 수 있습니다. 

 

마지막으로, '콜드 스타트 cold start'라는 유명한(?) 문제점이 있습니다. 콜드 스타트란, 어떤 대상에 대해 아무런 정보도 주어지지 않은 상황에서 추천 결과를 제공해야 되는 경우를 의미하는데요. 구체적으로 예를 들자면 신규 가입자가 생긴 상황이 이에 해당합니다. 이 유저는 이제 막 가입했기 때문에, 우리는 이 분에 대해 아무런 평점 또는 구매 기록을 가지고 있지 않습니다. 결과적으로, 앞서 설명한 방식으로 유저를 n차원의 벡터로 표현할 수가 없고 따라서 비슷한 유저도 찾을 수 없습니다. 뿐만 아니라, 새로운 아이템이 생긴 경우에도 콜드 스타트 문제를 겪게 됩니다. 아이템에 대한 타 유저의 평가 결과가 있어야 그 데이터를 활용하여 타겟 유저의 평점을 예측할 수 있는데, 그 정보가 전혀 존재하지 않으니 추천 결과에 포함될 수가 없습니다. 새로운 아이템임에도 불구하고 고객에게 노출되지 못하는 것이죠.

 

다음 포스팅: 초기 아마존의 성공 비결? 아이템 기반 협업 필터링

오늘 살펴본 유저 기반 협업 필터링과 떼놓을 수 없는 관계에 있는 알고리즘이 있습니다. 바로 아이템 기반 협업 필터링인데요. 유저 기반 협업 필터링에서 우리가 유저를 n개의 아이템으로 구성된 벡터로 치환했다면, 아이템 기반 협업 필터링은 아이템을 n명의 유저로 구성된 벡터로 표현합니다. 이 알고리즘은 특히 아마존이 사업 초기에 사용하여 톡톡한 효과를 본 알고리즘이기도 합니다. 아마존이 실제로 쓴 알고리즘이라니, 더 궁금해지시지 않나요? 그럼 그 궁금증을 고대로 가지고! 다음 포스팅에서 뵙도록 하겠습니다.

 

Happy Machine Learning! ت

 

 

 

 

유저 기반 협업 필터링 User-based Collaborative Filtering
1/ 유저를 n개의 아이템으로 구성된 벡터로 표현
2/ 피어슨 상관계수를 활용하여 타겟 유저와 가장 유사한 k명의 유저를 파악
3/ k명의 유저가 각 아이템에 준 평점을 평균하여 타겟 유저의 평점을 예측하고, 예측 평점이 높은 순으로 추천