코딩꿀팁
머신 러닝을 통한 추천 시스템 (내용 기반, 협업 필터링)
2021. 03. 19

이번 블로그에서는 추천 시스템이 무엇인지 간단하게 알아보고, 추천 시스템을 만들 수 있는 두 가지 방법에 대해서 간단히 알아보겠습니다.


추천 시스템은 유저에게 유저가 좋아하거나 구매할만할 상품을 추천해 주는 프로그램을 의미합니다. 유저 별로 아마존이나 쿠팡에서 물건들을, 넷플릭스에서 영화들을, 멜론에서 노래를 보여주는 것... 모두 추천 시스템을 사용해서 이뤄지죠.


추천 시스템이 추천하는 방법

대부분 추천 시스템은 유저의 활동(구매, 클릭, 시청 등) 데이터라는 경험을 통해 추천이란은 작업을 더 잘하게 되는 머신 러닝 프로그램입니다. 이번 포스트에서는 유저가 영화에 준 평점을 데이터를 예시로 추천 시스템이 추천을 어떻게 하는지 볼 건데요. 먼저 데이터부터 살펴봅시다.


blog image


평점 데이터는 이렇게 유저가 영화에 준 별점을 저장하고 있습니다. 각 유저는 영화에 1과 5개 사이의 별점을 줄 수 있고요. 1에 가까울수록 낮은 평점, 그리고, 5에 가까울수록 높은 평점입니다. 보시다시피 행렬(표)에는 각 유저가 영화에 몇 개의 별점을 줬는지가 저장돼있죠.


세상에는 엄청나게 많은 유저들과 영화들이 있는데요. 그렇기 때문에 모든 유저가 모든 영화에 평점을 줄 수는 없겠죠? 평점이 없는 유저-영화 쌍들에 대해서는 해당 표 원소가 빈칸으로 표시돼있습니다.


blog image


추천 시스템들은 대부분 유저와 상품(여기서는 영화)의 상호작용 데이터를 사용해서 상호작용이 없는 관계의 선호도를 예측하려고 합니다. 그리고 다양한 유저들의 활동 데이터가 많으면 많을수록 더 좋은 추천을 할 수 있는데요. 전에 말씀드린 것처럼 유저의 활동(구매, 클릭, 시청 등) 데이터라는 경험을 통해 추천이란은 작업을 더 잘하게 되는 거죠.


blog image


머신 러닝 기법을 통해서 위에 빈칸들을 다 채웠다고 할게요. 이렇게 채운 값들은 각 유저가 영화를 얼마나 좋아할지에 대한 예측 값입니다.

예측 값이 높다는 건 유저가 그 영화를 좋아할 거 같다는 말이겠죠? 위 예시에서는 유저 종훈이 영화 '반지의 제왕'에 높은 평점을 줄 것으로 예측되는데요. 이걸 근거로 '반지의 제왕'을 종훈에게 추천해 주면 됩니다.


좀 일반화하면 추천 시스템들을 유저와 상품들의 관계 데이터를 사용합니다. 유저가 상품에 어떤 선호도를 가지고 있는지를 사용해서 상호 작용이 없었던 다른 상품에 대한 선호도를 예측하죠. 그리고 예측 선호도가 높게 나오는 상품들을 유저에게 추천합니다.


내용 기반 추천

추천 시스템 알고리즘들은 크게 '내용 기반 추천'과 '협업 필터링', 이렇게 두 가지 접근법으로 나뉘는데요. 먼저 내용 기반 추천에 대해서 간단하게 알아볼게요.

이름에서 유추할 수 있듯이, 내용 기반 추천은, 상품의 '내용' 즉, 그 상품의 속성을(어떤 상품인지를) 써서 추천을 하는 방식입니다. 평점 데이터 말고 이런 데이터도 있다고 할게요.


blog image


영화가 '어떤' 영화인지를 나타내는 속성 데이터인데요. 문제를 조금 더 단순하게 생각해서 한 명의 유저에 대한 추천 시스템을 만든다고 가정할게요. 그럼 한 명의 유저의 평점 데이터를 가지고 와서 이 데이터에 추가할 수 있는데요. 유저 현승에 대한 영화 평점 데이터를 여기 추가해볼게요.


blog image


좋습니다. 이렇게 합친 다음에는 영화의 속성 데이터는 입력 변수, 그리고 유저 현승의 평점 데이터는 목표 변수로 이용해서 머신 러닝 모델을 학습시키면 됩니다. 이때는 선형 회귀, 다항 회귀, 딥 러닝 방식들 등 아무 회귀 알고리즘이나 사용하셔도 되죠.


모델을 학습하기만 하면, 현승이 평가하지 않은 다른 영화가 있으면, 그 영화의 액션, 로맨스, 코미디, 감동 속성 데이터를 써서 유저 현승이 그 영화에 어떤 평점을 줄지를 예측할 수 있습니다.


협업 필터링

두 번째 접근법은 '협업 필터링'이라는 방법입니다. 내용 기반 추천과는 달리 협업 필터링은 영화의 속성 데이터를 사용하지 않고, 다른 유저들의 데이터를 써서 추천을 합니다.

협업 필터링도 다양한 세부적인 방식들이 있는데요. 가장 기본적으로 사용하는 '유저 기반 협업 필터링'을 살펴보겠습니다.

이렇게 평점 데이터가 있다고 할게요.


blog image


유저 현승과 우재의 평점 데이터를 살펴봅시다. 두 유저는 모든 영화에 대해서 정확히 똑같은 평점을 줬는데요. 두 유저는 굉장히 비슷한 유저라고 할 수 있겠죠? 그럼 이 사실을 유저의 평점을 예측하는데 사용할 수 있을 거 같은데요.

현승은 평점을 줬지만, 우재는 주지 않은 영화 6이 있다고 할게요. 그럼 현승의 평점을 보고 우재가 줄 평점을 예측할 수 있는데요.


blog image


이렇게 5점을 예측할 수 있겠죠? 꼭 5점이 아니어도, 서로 비슷한 두 유저 현승과 우재는 평점도 비슷하게 줄 거라고 생각을 하는 건데요. 가장 비슷한 유저 한 명을 찾는 방식이 아니라, 가장 비슷한 k 명의 유저의 데이터를 사용해서 평점을 예측할 수도 있습니다.


blog image


예를 들어, 유저 현승이 줄 평점 데이터를 알고 싶으면, 이런 식으로 비슷한 유저 100명을 찾아서, 이 100명이 영화 6에 준 평점의 평균을 내서 예측하는 거죠.


이렇게 정확히 어떤 영화인지가 아니라, 다양한 유저들의 평점 데이터를 종합해서 예측을 하는 모든 방법들이 협업 필터링 기법에 포함됩니다.

더 많은 내용이 궁금하다면?
[머신 러닝] 들어 보세요!
추천글
codeit facebook pagecodeit facebook pagecodeit facebook pagecodeit facebook page
(주) 코드잇