Shine's dev log

[python] 영화 추천 시스템 본문

기타

[python] 영화 추천 시스템

dong1 2022. 1. 23. 14:30

1. 개요

 

사용자로부터 특정 개수 (5개 정도)의 선호하는 영화를 선택받으면, 해당 사용자가 좋아할만한 영화를 추천해주는 영화 추천 시스템을 만들었다.

 

영화를 추천해주는 방법은 아래와 같이 2가지가 있다.

 

 1) 사용자가 선호하는 영화와 유사한 영화를 추천

 2) 다른 사용자들의 평가를 바탕으로 선호할만한 영화를 추천

 

코드는 아래에서 확인할 수 있다.

 

https://github.com/godeastone/movies-recommendation

 

 

 

2. Abstract

 

본 프로젝트에서는 사용자가 선호하는 영화 5개를 바탕으로 간단하게 사용자에게 볼만한 영화를 추천해주는 시스템을 제안한다. 

 

본 시스템은 크게 2가지 방식으로 영화를 추천한다.

첫번째 방식은 사용자가 선택한 영화와 자주 같이 시청된 영화들 중, 비슷한 종류의 영화들을 추천하는 방식이고, 두번째 방식은 다른 사용자들의 평가를 바탕으로 선호할 만한 영화를 추천하는 방식이다. 

 

첫번째 방식에서는 A-priority, K-means clustering 알고리즘을 사용하였고, 두번째 방식에서는 Item-based collaborative filtering 알고리즘을 사용하였다. 

 

본 프로젝트에서 제안하는 영화 추천 시스템을 사용한 결과, 사용자는 5개의 선호 영화를 바탕으로 다양한 종류의 추천 영화를 확인할 수 있었다.

 

전체 과정은 아래 그림과 같다.

 

영화 추천 시스템 전체 구조

 

Method 1 방법
Method2

 

3. Introduction

 

다양한 영화들 속에서 특정 사용자가 선호할 만한 영화를 선택하는 것은 쉬운 일이 아니다. 기존의 영화 추천 어플리케이션 (왓챠, 키노라이츠 등)을 사용할 때, 사용자가 영화 추천을 받고 싶은 경우, 우선적으로 사용자가 선호하는 여러 영화들을 입력해야 하며, 각 영화들마다 평점을 세분화하여 매겨야 한다.

 

이럴 경우 보다 세밀한 영화 추천이 가능하지만, 보다 빠르고 간편하게 추천을 받고 싶은 경우에는 부적절하다. 또한, 지금까지 봐왔던 모든 영화가 아닌, 특정 영화들을 기반으로 추천을 받고자 할 경우 위 시스템은 알맞지 않다는 문제점이 존재한다.

 

따라서 본 프로젝트에서 제안하는 영화 추천 시스템은 사용자가 단지 5개의 선호 영화를 입력하면, 사용자가 선호할 만한 영화를 추천해준다.

이를 통해 사용자는 보다 빠르고 간편하게 추천 영화 목록을 확인할 수 있게 된다.

 

영화 추천 관련 알고리즘의 경우, 특정 영화와 연관관계가 있는 영화를 추천하기 위한 A-priori 알고리즘, 단순히 영화들 간의 similarity를 기반으로 추천하는 Clustering 혹은 Content-based recommendation 방식과 해당 영화를 좋게 평가한 다른 사람들의 평가를 기반으로 추천하는 Collaborative Filtering 등이 있다.

 

본 영화 추천 시스템에서는 사용자가 선택한 영화와 관련이 있는 영화를 추천하기 위해 A-priori 알고리즘을 사용하였으며, 그 중 비슷한 종류의 영화를 추리기 위해 K-means Clustering 알고리즘을 사용하였다.

 

또한 선택한 영화를 좋게 평가한 다른 사용자들의 의견을 반영하여 보다 다양한 종류의 영화를 추천하기 위해 Item-based collaborative Filtering 알고리즘을 사용하였다.

 

A-priori 와 K-means Clustering 알고리즘을 융합하기 위해, 우선 Association rules와 A-priori 알고리즘을 통해 특정 사용자가, 입력 받은 영화를 시청했을 경우, 함께 시청할 확률이 높은 영화들을 선택한다.

이후 K-means Clustering 알고리즘을 통해 사용자가 입력한 선호 영화들의 cluster들을 결정한다.

 

앞서 A-priori 알고리즘을 통해 추천된 영화들 중, 입력한 선호 영화들의 cluster에 포함되지 않은 영화들은 제외하였다. 이를 통해 A-priori 와 K-means Clustering 알고리즘을 융합하였다.

 

Content-based recommendation 방식의 경우, 사용자가 선호하는 다양한 영화에 대한 정보가 필요하지만, 본 시스템의 경우 오직 5개의 선호 영화만 입력 받기 때문에 해당 방식은 제외하였다.

 

 

 

4. Methods

 

 4.1. Dataset

 

프로젝트에 사용된 데이터셋은 Kaggle ‘The movie Dataset’ 이다.

(www.kaggle.com/rounakbanik/the-movies-dataset)

 

해당 데이터셋은 45,000개의 영화에 대한 메타데이터를 가지고 있으며, 영화의 출연진, 연출진, 감독, 키워드, 예산, 국가 등의 정보를 담고 있다. 또한 추가적으로 270,000 명의 사용자들로부터 입력된 26,000,000 개의 영화 rating 정보도 포함하고 있다. rating 1부터 5까지 숫자로 주어진다.

 

프로젝트에서는 전체 영화에 대한 메타데이터를 나타내는 movies_metadata.csv 파일과, 일부 사용자들의 영화에 대한 rating 정보를 나타내는 ratings_small.csv 파일을 사용하였다.

 

전체적인 rating 분포를 보기 위해 matplotlib 라이브러리를 사용하여 ratings_small.csv 파일을 분석하여 그래프로 나타낸 결과, [그림 1] 같이 4.0 가장 많았고 3.0 5.0 뒤를 이었다.

가장 적은 rating 값은 0.5였고, 1.5 2.5 뒤를 이었다. pandas 라이브러리의 df.describe() 메소드를 이용하여 전체적인 통계 정보를 출력한 결과 [그림 2] 같았다.

 

[그림 1] Distribution of ratings

 

[그림 2] dataset statistics

 

ratings_small.csv 파일에는 userId, rating, movieId, timestamp 정보가 존재한다. 

프로젝트 진행을 위해 ratings_small.csv 파일의 movieId와 movies_metadata.csv 파일의 id column을 기준으로 merge 하여 사용하였다.

 

 

 4.2. A-priori Algorithm & K-means Clustering

 

A-priori 알고리즘을 적용하기 위해 pandas 라이브러리의 pivot 메소드를 활용하였다.

[그림 3]과 같이 row에는 사용자의 userId, column에는 영화들의 movieId를 배치하였고, Data frame 내부에는 각 userId와 movieId에 해당하는 ratings가 오도록 utility matrix를 생성하였다.

 

[그림 3] utility matrix

 

A-priori 알고리즘에는 rating 값보다 시청했는지 여부가 중요하기 때문에, 시청하였으면(rating이 존재하면) 1, 시청하지 않았으면 0으로 변환시켰다.

이후 mlxtent 라이브러리의 apriori메소드를 통해 frequent_itemset을 생성하였고, association_rules 메소드를 활용하여 frequent_itemset에 대하여 support, confidence, lift 등의 지표를 계산하였다.

A-priori 알고리즘을 적용시킬 때 minimum support는 0.07으로 설정하였다.

사용자가 선호하는 특정 영화를 입력 값으로 넣으면, 해당 영화와의 lift 값이 가장 큰 영화들을 순서대로 추천해준다.

 

K-means clustering을 적용하기 위해 전처리를 진행하였다.

전처리 단계에서는 투표수가 25개를 넘지 않는 영화는 부정확한 결과를 초래할 수 있으므로 제거하였으며, movies_metadata.csv 파일의 여러 column 중에서 'budget', 'popularity', 'revenue', 'runtime', 'vote_average', 'vote_count', 'title' 값만을 feature로 사용하였다.

또한 sklearn 라이브러리의 MinMaxScaler 메소드를 통해 데이터들을 normalize 해주었다.

 

본격적으로 clustering을 적용하기 위해 sklearn 라이브러리의 KMeans 메소드를 활용하였다. cluster의 개수는 [그림 4]와 같이 elbow curve와 silhouette score를 기준으로 평가한 결과를 바탕으로 5로 설정하였다.

 

[그림 4] Elbow curve & Silhouette score

 

앞서 설명했듯이 K-means clustering A-priori 알고리즘을 통해 나온 추천 영화들을 다시 한번 필터링하기 위해 사용된다.

K-means clustering 통해 사용자로부터 입력 받은 선호 영화 5개의 cluster들을 각각 구한 , A-priori 알고리즘을 거쳐 나온 추천 영화들이 해당 cluster 어느 cluster에도 속하지 않은 경우, 해당 영화는 필터링하는 방식으로 진행하였다.

 

예를 들어 사용자로부터 입력 받은 선호 영화 5개의 cluster 각각 [1, 1, 3, 4, 3] 경우, A-priori 알고리즘을 통해 도출된 추천 영화들의 cluster 구한 , [1, 3, 4] cluster 해당하지 않는 영화는 필터링하는 것이다.

 

 

 4.3. Item-based collaborative filtering

 

Collaborative Filtering 방식은 다른 사용자들의 rating을 이용하여 해당 사용자에게 추천하는 방식이다. 

본 프로그램에서는 collaborative filtering 알고리즘을 활용하기 위해 역시 pandas 라이브러리의 pivot 메소드를 활용하여 utility matrix를 생성하였다. 

 

전체 영화 수에 비해 각 사용자들이 평가한 rating 데이터의 양이 작으므로 전체적으로 utility matrix는 sparse 한 형태일 것이다. 따라서 scipy 라이브러리의 csr_matrix 메소드를 이용하여 효율적으로 나타냈다. 

 

이후 사용자들이 측정한 ratings를 바탕으로 item들 간의 cosine similarity를 이용하여 각 영화들 간의 유사도를 측정하였다. 

이제 사용자로부터 입력 받은 선호 영화가 주어지면, sklearn 라이브러리의 kneighbors 메소드를 통해 각 영화들과의 distance를 구한 뒤, 해당 영화에 비해 distance가 가장 작은, 즉 유사한 영화들을 추천해주게 된다.

 

 

 

5. Result

 

앞서 말했듯이, 본 프로젝트에서 제안하는 영화 추천 시스템은 크게 A-priori & K-means 방식과 Collaborative Filtering 방식, 두가지로 영화를 추천하게 된다. 

따라서 사용자는 자신이 선호한 영화 5개를 입력하면, 해당 영화와 비슷한 추천 목록과, 해당 영화를 좋아한 사람들의 추천목록 두가지 추천목록을 받게 된다. 

 

실제로 본 영화 추천 시스템을 통해 "Taxi Driver" "Inception" "Jumanji" "Star Trek: Generations" "Men in Black II" 의 5가지 영화를 선호 영화로 입력했을 경우 [그림 5]와 같은 추천 영화 결과를 얻을 수 있었다. 

 

A-priori & K-means 알고리즘을 통해 추천된 영화들의 경우, 입력한 영화들과 거의 비슷한 영화 장르들이 추천되었고, Item-based collaborative filtering 알고리즘을 통해 추천된 영화들의 경우, 입력한 영화들의 장르와 상관없이 여러 장르의 영화들이 추천된 것을 확인할 수 있었다.

 

[그림 5] result of movie recommend system

 

 

 

6. Conclusion

 

일반적으로 사용자 선호 영화들이 여러 개가 필요한 기존의 영화 추천 시스템과는 달리, 본 프로젝트에서 제안하는 영화 추천 시스템은 적은 수의 사용자 선호 영화를 가지고 보다 가볍고 효율적으로 영화를 추천할 수 있는 시스템을 제안하였다. 

 

추천 방식은 크게 두가지가 존재한다. 

첫번째 방식은 우선 A-priori 알고리즘을 통해 특정 영화를 선택했을 때 함께 선택될 확률이 높은 영화를 선정하고, 이후 K-means clustering을 통해 선택한 영화와 유사한 영화들만 추천되도록 필터링 하였다. 

두번째 방식은 Item-based collaborative filtering 방식을 사용하여, 사용자들의 rating 데이터를 기반으로 영화들 사이의 similarity를 계산한 뒤, 선택된 영화와 유사한 영화를 선택함으로써 추천되도록 하였다. 

 

본 시스템을 통해 사용자는 보다 간단하고 빠르게 영화를 추천할 수 있으며, 다양한 알고리즘을 사용하여, 다각도에서 추천할 수 있다. 

 

현재는 입력된 영화 5가지를 통해 추천하고 나면 추천 결과가 누적되지 않는 일회성 추천 시스템이지만, 이를 발전시켜 앞으로 추가적으로 영화를 입력하더라도 누적하여 추천해줄 수 있는 시스템을 고안할 예정이며, 웹페이지 형태로 개발을 이어나갈 계획이다.

 

 

 

7. References

 

데이터셋 - “The Movies Dataset”, Kaggle, accessed Dec 09, 2021, https://www. kaggle.com/rounakbanik/ the-movies-dataset

Apriori 알고리즘 - “Movie Recommendation With ML - Apriori Explained”, Kaggle, accessed Dec 09, 2021, https://www.kaggle.com/ankits29/movie-recommendation-with-ml-apriori-explained

K-means clustering - “K-Means Clustering”, Kaggle, accessed Dec 07, 2021, https://www.kaggle.com/sirpunch/k-means-clustering

Item-based collaborative filtering - “Movie Recommendation Engine”, Kaggle, accessed Dec 07, 2021, https:// www.kaggle.com/basel99/movie-recommendation-engine-collaborative-filter