Ch.12
추천 시스템 기초 (Collaborative Filtering)
넷플릭스나 유튜브에서 '이런 콘텐츠는 어때요?'라는 추천을 받아보고 신기해했던 적이 있으신가요? 협업 필터링(Collaborative Filtering)은 나와 취향이 비슷한 사람들이 높게 평가한 항목을 나에게 추천해 주는 아주 똑똑하고 직관적인 방식입니다. 마치 점심 메뉴를 고를 때 입맛이 비슷한 친구의 추천을 믿고 가는 것과 같죠. 이 챕터에서는 빈칸이 가득한 평점 행렬을 어떻게 채워나가는지, 나와 닮은 '이웃'을 어떻게 찾는지, 그리고 실제 서비스에서는 어떤 식으로 활용되는지 초보자도 쉽게 이해할 수 있도록 단계별로 알아보겠습니다.
챕터별 머신러닝 도식화
챕터를 선택하면 아래 도식이 해당 챕터 내용으로 바뀌어요. 머신러닝 흐름을 한눈에 보세요.
사용자-아이템 평점 행렬에서 비슷한 사용자(이웃)를 찾아, 그들의 평점으로 빈 칸을 예측합니다.
평균 예측: (이웃 평점 ★5, ★4) → 예상 ★4로 추천
협업 필터링: 유사 사용자 기반으로 빈 칸 예측.
추천 시스템 기초: 협업 필터링
협업 필터링이란? (다른 사람의 지혜 빌리기) — 협업 필터링은 말 그대로 다른 사용자들의 과거 행동 데이터(평점, 클릭, 구매 내역 등)를 바탕으로 나에게 딱 맞는 항목을 골라내는 기술입니다. '나와 비슷한 취향을 가진 사람이 좋아한 것이라면, 나도 좋아할 확률이 높다'는 아주 자연스럽고 인간적인 아이디어에서 출발했습니다. 넷플릭스의 영화 추천, 아마존의 상품 추천, 스포티파이의 음악 추천 등 우리가 매일 사용하는 거의 모든 플랫폼에서 가장 핵심적으로 사용되는 원리입니다.
이웃(Neighbor)의 선택을 믿어보세요 — 영화를 고르는 상황을 상상해 볼까요? 나와 내 친구가 평소에 액션 영화 A와 B에 모두 만점을 주었다고 가정해 봅시다. 그런데 그 친구가 최근에 개봉한 스릴러 영화 C에도 만점을 주었다면 어떨까요? 나 역시 영화 C를 재미있게 볼 가능성이 매우 높겠죠. 이처럼 나와 비슷한 패턴으로 평가를 내린 사람들을 머신러닝에서는 이웃(Neighbor)이라고 부릅니다. 이 이웃들의 평점 데이터를 모아 내가 아직 보지 않은 영화에 대한 내 반응을 예측(Prediction)하는 것이 바로 협업 필터링의 마법입니다.
수학적 표현: 평점 행렬과 예측의 원리 — 수많은 사용자와 아이템 간의 관계를 표로 만든 것을 평점 행렬(Rating Matrix)이라고 합니다. 가로는 영화, 세로는 사용자로 이루어진 거대한 엑셀 표를 상상해 보세요. 우리는 세상의 모든 영화를 보지 않기 때문에 대부분의 칸은 비어있을 것입니다. 이 빈칸을 채우는 것이 우리의 목표입니다. 특정 사용자 가 아직 보지 않은 아이템 에 대해 어떤 평점을 줄지 예측하는 핵심 수식은 다음과 같습니다.
(의미: 예측 평점 = 이웃들이 준 평점을 유사도로 나눈 가중 평균)
이 수식은 전혀 복잡하지 않습니다! 는 우리가 알고 싶은 예측 평점입니다. 는 나와 비슷한 이웃들을 의미하고, 는 나와 이웃 간의 유사도(얼마나 취향이 비슷한가)를 나타냅니다. 는 이웃이 그 아이템에 준 실제 평점이죠. 즉, 나와 취향이 더 비슷한(유사도가 높은) 이웃의 의견에 더 높은 가중치를 주어 평균을 내는 '가중 평균' 방식입니다. 얼마나 비슷한지는 보통 코사인 유사도(Cosine Similarity)라는 방법으로 측정합니다.
실전에서의 한계점과 해결책 — 협업 필터링이 완벽한 것은 아닙니다. 가장 큰 문제는 콜드 스타트(Cold Start)입니다. 새로 가입한 사용자나 갓 등록된 신상품은 쌓인 데이터가 전혀 없기 때문에 추천을 해줄 이웃도, 참고할 평점도 없습니다. 또한, 너무 많은 상품에 비해 사용자들이 남긴 평점이 턱없이 부족한 희소성(Sparsity) 문제도 발생합니다. 이를 해결하기 위해 실무에서는 상품 자체의 정보(장르, 색상, 감독 등)를 분석하는 콘텐츠 기반 필터링(Content-based Filtering)을 섞어 쓰거나, 행렬의 숨은 의미를 수학적으로 찾아내는 행렬 분해(Matrix Factorization) 기법을 활용하여 단점을 보완합니다.
비즈니스 성공과 사용자 경험(UX)의 핵심 열쇠 — 현대의 플랫폼에서 '맞춤형 추천'은 선택이 아닌 필수입니다. 사용자는 수백만 개의 상품 속에서 헤매지 않고 원하는 것을 즉시 찾을 수 있어 만족도가 올라가고, 플랫폼은 자연스럽게 매출 증대와 체류 시간 연장이라는 두 마리 토끼를 잡을 수 있습니다. 특히 협업 필터링은 아이템에 대한 복잡한 설명(예: 이 영화의 장르는 무엇이고 감독은 누구인지 등)을 일일이 입력하지 않아도, 오직 사용자들의 행동 패턴만으로도 강력한 개인화(Personalization)가 가능하다는 엄청난 장점을 가집니다.
머신러닝 응용의 훌륭한 출발점 — 추천 시스템은 일반적인 머신러닝의 분류(스팸 메일인지 아닌지 맞추기)나 회귀(내일의 집값 예측하기) 문제와는 조금 다릅니다. 사람마다 정답(취향)이 모두 다르고, 거대한 행렬의 텅 빈 공간을 지능적으로 채워 넣는 퍼즐과 같기 때문입니다. 이 협업 필터링의 기본 개념과 평점 행렬의 원리를 탄탄히 다져두면, 이후에 등장하는 넷플릭스 알고리즘의 핵심 기술인 행렬 분해(Matrix Factorization)나 최신 기술인 딥러닝 기반 추천 시스템을 이해하는 데 아주 든든한 디딤돌이 될 것입니다.
두 가지 접근법: 유저 기반 vs 아이템 기반 — 협업 필터링은 누구를 기준으로 삼느냐에 따라 두 가지로 나뉩니다. 첫째, 유저 기반(User-based)은 '나와 취향이 비슷한 사람'을 찾아 그 사람이 본 것을 추천합니다. 둘째, 아이템 기반(Item-based)은 사람 대신 상품 자체의 관계에 집중합니다. 쇼핑몰에서 흔히 보는 '이 상품을 구매한 사람들이 함께 구매한 다른 상품'이 바로 이 방식입니다. 실무에서는 계산 속도가 빠르고 예측이 더 안정적이라는 이유로 주로 아이템 기반 협업 필터링이 훨씬 더 널리 쓰입니다. 둘 다 원리와 수식 구조는 매우 비슷합니다.
조금 더 정교한 예측: 사람마다 다른 기준 맞추기 — 앞서 본 가중 평균 수식에는 한 가지 맹점이 있습니다. 바로 '사람마다 점수를 주는 잣대가 다르다'는 점이죠. 어떤 사람은 웬만하면 후하게 5점을 주고, 어떤 사람은 아주 깐깐해서 최고점이 3점일 수 있습니다. 이를 보정하기 위해 각 사용자의 평균 평점()을 기준으로 점수가 얼마나 높은지, 낮은지를 계산하는 방식을 사용합니다.
(의미: 내 평균 + 이웃들이 ‘자기 평균 대비’ 얼마나 더 줬는지의 가중 평균)
이 수식은 내 평균 평점에다가, '비슷한 이웃들이 본인들의 평균 평점보다 얼마나 더 높게 혹은 낮게 평가했는지'를 가중 평균 내어 더해주는 방식입니다. 깐깐한 사람과 후한 사람의 차이를 없애주어 훨씬 더 개인의 성향을 잘 반영할 수 있습니다! 이렇게 만든 모델이 얼마나 정확한지는 주로 실제 평점과 예측 평점의 차이를 계산하는 MAE(평균 절대 오차)나 RMSE(평균 제곱근 오차) 같은 평가 지표로 확인합니다.
더 넓은 세상으로: 행렬 분해와 하이브리드 추천 — 초보 단계를 넘어 실제 기업의 대규모 서비스 환경으로 가면, 거대하고 텅 빈 평점 행렬을 두 개의 작고 꽉 찬 행렬로 쪼개는 행렬 분해(Matrix Factorization, MF) 기술을 만나게 됩니다. 이는 사용자와 아이템 사이에 숨겨진 '잠재적 특징(Latent Factor)'을 찾아내어 빈칸을 훨씬 더 정확하고 빠르게 예측합니다. 또한, 협업 필터링의 영원한 숙제인 콜드 스타트를 극복하기 위해, 콘텐츠 자체의 특성(예: 액션 장르, 주연 배우 등)을 분석하는 기술과 섞어 쓰는 하이브리드(Hybrid) 추천 시스템이 오늘날 글로벌 IT 기업들의 표준으로 자리 잡고 있습니다.
이 챕터에서는 추천 시스템의 기초인 협업 필터링을 다뤘습니다.
- 협업 필터링: 다른 사용자들의 평점·클릭·구매 등 행동 데이터를 이용해, 나와 취향이 비슷한 이웃을 찾고, 그들의 평점으로 빈 칸(미평가)을 예측하는 방식입니다.
- 평점 행렬: 행 = 사용자, 열 = 아이템. 한 칸 = "한 사용자가 한 아이템에 준 평점". 대부분 칸이 비어 있는 희소 행렬입니다.
- 예측 흐름: 유사도 계산 → 이웃 K명 선택 → 이웃 평점의 단순 평균 또는 가중 평균(유사도를 가중치로)으로 예측값 를 구합니다.
- 실무: 콜드 스타트·희소성 문제 때문에 콘텐츠 기반, 행렬 분해, 하이브리드와 함께 쓰는 경우가 많습니다.