추천 시스템 1 — 기본 개념과 콘텐츠 기반 추천 구현

김희규
6 min readDec 25, 2021
Photo by Alin Surdu on Unsplash

추천 시스템이란 유튜브나 넷플릭스처럼 사용자가 좋아할 컨텐츠를 추천해주는 시스템을 의미합니다. 현재 머신러닝기술이 가장 효과적으로 사용되고 있는 분야 중 하나라고도 생각합니다. MovieLens100k 데이터셋을 이용하여 영화 추천시스템을 만들면서 공부해보고 있는데 배운 내용을 시리즈로 적어보려고 합니다. 우선 이 글에서는 추천 시스템에 대한 간단한 정리와 본격적인 추천 시스템이 사용되기 이전에 사용자에게 추천하던 방식들(주간 Best 같은)을 Pandas로 간단하게 구현해보겠습니다.

데이터셋

먼저 추천시스템을 만들기 위해 사용할 데이터는 MovieLens100k 데이터셋입니다. 600명의 사용자가 9000개의 영화에 대해 평가한 100000개의 평가 데이터가 존재합니다. 더 큰 크기의 데이터도 있는데 학습이나 개발 용으로 적절한 작은 크기의 데이터셋입니다. 다운로드한 뒤 압축을 풀면 4개의 파일이 있는데, 이 중 movies.csv와 ratings.csv 두 개를 주로 사용합니다.

movies.csv

영화를 구별하는 정수 ID, 제목, 영화 장르들이 ‘|’로 묶여있습니다.

ratings.csv

영화 평가 데이터이며, 평가한 유저 정수 ID와 평가한 영화 정수 ID, 1~5 사이의 실수인 평가점수, 평가를 한 시간인 timestamp가 존재합니다. timestamp를 이용해서 데이터를 학습, 테스트 세트로 구분하고 과거의 평가를 바탕으로 이후의 평가를 예측해볼 수도 있습니다.

추천시스템이 있기 전에는?

추천 시스템이 있기 전에는 보통 아래와 같은 방식으로 컨텐츠를 사용자에게 추천했습니다.

  1. 새로 나온 영화
  2. 가장 인기있는 영화(최근 한 달 혹은 올해)
  3. 가장 평점이 좋은 영화(올해 혹은 2010년대)

이런 방법들은 구현도 어렵지 않고 아직도 많이 쓰이고 있습니다. 추천 시스템은 기존 사용자의 정보를 바탕으로 추천을 해주는데, 사용자의 데이터가 부족한 경우에는 사용자의 데이터가 확보하기 전까지는 이런 방법을 사용합니다. pandas를 이용해서 평가가 50개 이상인 영화 중에서 가장 평점이 좋은 영화를 구해보겠습니다. 전체 코드는 여기에 있습니다.

pandas를 이용하면 적은 코드로 쉽게 구현할 수 있습니다. 그러면 이제는 추천 시스템에 대해서 알아보겠습니다.

추천 시스템의 종류

추천 시스템은 크게 콘텐츠 기반 필터링(Content-Based Filtering)과 협력 필터링(Collaborative Filtering) 두 가지로 나뉩니다.

콘텐츠 기반 추천

콘텐츠 기반 추천은 기존에 사용자가 선택한 컨텐츠와 비슷한 컨텐츠를 추천하는 방법입니다. 예를 들어 사용자가 토이 스토리 1을 봤다면, 비슷한 애니메이션인 토이스토리 2, 3 같은 영화를 추천해줍니다.

협력 필터링

협력 필터링은 여러 사용자들의 데이터를 기반으로 추천해주는 방식입니다. 예를 들어 나와 비슷한 취향을 가진 유저들을 찾고 이들이 본 영화 중 내가 아직 보지 않은 영화를 찾아줄 수 있습니다. 이 부분은 다음 글에서 더 자세히 설명하도록 하겠습니다.

유튜브나 넷플릭스의 추천 시스템이 큰 효과를 보면서 협력 필터링이 많은 주목을 받는 것 같습니다. 컨텐츠 기반 추천은 비슷한 것만 계속 추천하는데 반해, 협력 필터링은 더 다양한 컨텐츠를 추천해주기 때문일 것입니다. 하지만 컨텐츠 기반 추천도 많이 사용되고 있습니다. 쇼핑몰에서 상품 정보를 볼 때 유사한 다른 상품을 함께 표시해주는걸 예로 들 수 있습니다.

콘텐츠 기반 추천 구현하기

MovieLens100k 데이터셋에는 영화의 장르 정보가 있는데, 이를 이용하여 콘텐츠 기반 추천을 구현해 보겠습니다. 영화를 하나 고르면, 동일하거나 유사한 장르 중에서 평점이 높고 인기가 많은 영화를 추천해주려고 합니다. 전체 코드는 여기에있습니다.

먼저 기존 movies.csv는 아래처럼 영화 장르가 ‘|’로 묶여있습니다.

총 28가지 영화 장르가 지정되어있는데, 이를 아래와 같은 원-핫 벡터(One-Hot Vector)로 변경해줍니다.

Scikit-Learn의 CountVectorizer를 이용하면 적은 코드로 같은 결과물을 얻을 수 있습니다.

이러면 영화의 장르 특성을 0과 1로 수치화된 벡터로 표현 가능하고, 벡터간의 거리의 차이를 계산하여 장르의 유사성을 판단할 수 있습니다. 거리를 계산하는데는 간단한 유클리디언 거리부터 코사인 유사도, 피어슨 유사도 등이 있습니다.

Scikit-Learn의 NearestNeighbors를 이용하여 유사한 장르의 영화를 100개 가져온 뒤 정렬해보겠습니다.

ratings.csv에서 평점 점보를 계산한 뒤에 추천 결과와 left join해서 붙이고, 정렬하면 유사한 장르의 영화를 평점순으로 추천할 수 있습니다.

rating이 없는 영화의 경우는 NaN으로 표시되는 걸 알 수 있습니다.

이번 글에서는 추천 시스템에 대한 간단한 설명과 장르 정보를 이용해 pandas로 콘텐츠 기반 추천을 구현해보았습니다. 장르 외에도 태그, 국가 등 다양한 정보를 추가하고 이용해서 컨텐츠 기반 추천도 가능할 것입니다.

다음 글에서는 Matrix Factorization을 이용해서 협력 필터링을 구현하는 방법에 대해서 알아보겠습니다.

참고

--

--

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.