세로형
Recent Posts
Recent Comments
Link
04-25 01:17
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

파이썬으로 추천 시스템(recommendation system) 구현해보기 - collaborative filtering 본문

추천시스템

파이썬으로 추천 시스템(recommendation system) 구현해보기 - collaborative filtering

이수진의 블로그 2020. 1. 19. 19:07

포스팅 개요

해당 글에 대한 코드는 아래 github 링크에 전부 올려두었습니다.

 

lsjsj92/recommender_system_with_Python

recommender system tutorial with Python. Contribute to lsjsj92/recommender_system_with_Python development by creating an account on GitHub.

github.com

이번 포스팅은 파이썬(Python)으로 추천 시스템(recommendation system)을 개발해보는 포스팅입니다.

개발이라고 썼지만, 추천 시스템 개발이라기 보다는 공부하는 것이기 때문에 '구현'이라는 표현이 더 좋을 것 같습니다.

지난 포스팅에서는 추천 시스템 종류 중 콘텐츠 기반 필터링(content based filtering)을 파이썬(Python)으로 구현해봤습니다. 

https://lsjsj92.tistory.com/565

 

파이썬과 함께 추천 시스템(recommendation system) 이해하기 기본편 - content based filtering

포스팅 개요 이번 포스팅은 파이썬(Python)을 활용해서 추천 시스템(recommendation system) 중 콘텐츠 기반 필터링(content based filtering)을 이해하고 만들어보는 포스팅입니다. 지난 포스팅에서 추천 시스템..

lsjsj92.tistory.com

 

이번 포스팅은 이전 포스팅에 이어서 파이썬으로 추천 시스템 구현해보기 2탄으로 진행하겠습니다.

그리고 추천 시스템 종류 중 협업 필터링(Collaborative Filtering)을 파이썬으로 구현해보겠습니다.

해당 자료는 아래에서 참고했습니다.

캐글의 Movielens 데이터를 이용해서 사용해보려고 합니다.

https://www.kaggle.com/sengzhaotoo/movielens-small 이 데이터입니다.

여기서의 커널은 아래 리스트를 참고했습니다.


포스팅 본문

 

협업 필터링 요약

추천 시스템에서 협업 필터링(Collaborative Filtering)은 아직까지도 자주 사용한다고 알려진 방법입니다.

협업 필터링(Collaborative Filtering)에서는 크게 2가지 종류가 있습니다. 

  • 아이템 기반 협업 필터링(item based Collaborative Filtering)
  • 행렬 분해 기반 협업 필터링(Matrix Factorization Collaborative Filtering)

한 가지 더 있기는 합니다. 사용자 기반 협업 필터링(User based Collaborative Filtering)인데요. 이것은 성능이 썩 좋지 않기 때문에 이 방법은 굳이 소개하지 않겠습니다.

제 블로그에 추천 시스템 협업 필터링(Collaborative Filtering)과 관련한 선행 글이 있습니다. 혹시 궁금하시다면 아래 링크를 첨부할태니 꼭 한 번 읽어보시기 바랍니다.

https://lsjsj92.tistory.com/563

 

추천 시스템(Recommendation system)이란? - content based filtering, collaborative filtering

포스팅 개요 이번 포스팅은 추천 시스템(recommedation system)에 대해서 알아봅니다. 또한, 추천 시스템에는 컨텐츠 기반 필터링(content based filtering)과 협력 필터링(collaborative filtering)이 있는데요...

lsjsj92.tistory.com

https://lsjsj92.tistory.com/564

 

추천 시스템(recommendation system) - 협업 필터링(collaborative filtering)

포스팅 개요 이번 포스팅은 추천 시스템(recommendation system) 기본 2탄입니다. 지난 포스팅에서 추천 시스템이 왜 중요한지, 어떤 종류가 있는지 간략하게 살펴보았습니다. (https://lsjsj92.tistory.com/563)..

lsjsj92.tistory.com

 

이 협업 필터링은 사용자 행동 양식(User behavior)을 기반으로 해주는 것이 특징입니다.

이 중 아이템 기반 협업 필터링을 파이썬으로 구현해보겠습니다.

 

파이썬 코드 구현

자! 이제 파이썬(Python)으로 추천 시스템을 구현해보죠.

데이터는 개요에서 말씀드린 kaggle에 있는 Movielens 데이터를 사용할 것입니다.

movielens 데이터는 2개가 나뉘어져 있습니다.

  • user가 movie에 평가를 매긴 데이터 : ratings.csv
  • 영화 정보 데이터 : movies.csv

 

반응형

각 데이터는 ratings.csv와 movies.csv 2개로 나뉘어져 있습니다.

ratings.csv 파일에는 사용자가 영화에 평점을 매긴 데이터가 들어있고, 영화 정보는 movies.csv에 들어있습니다.

 

자! 그럼 이제 데이터 전처리를 조금 해야합니다.

불필요한 컬럼은 drop하고 movieId가 공통으로 column에 들어가니 movieId를 기준으로 pd.merge를 진행하겠습니다.

그러면 나뉘어져있던 2개의 데이터가 하나로 합쳐지게 됩니다.

 

 

이렇게요!

이렇게 하면 사용자별 영화 평점을 매긴 데이터가 들어가는데 title 정보와 장르 정보가 함께 들어가게 됩니다.

자! 이제 아이템 기반 협업 필터링(item based collaborative filtering)을 수행하려면 pivot table을 만들어야 합니다.

즉, 사용자 - 영화에 따른 평점 점수가 데이터로 들어가야하죠.

이를 위해서 pivot_table을 사용하고 아래와 같이 데이터를 분포시키겠습니다.

  • data : 영화 평점 rating
  • index : 영화 title
  • columns : userId

 

저는 여기서 index를 사용자 아이디로 해보고, 영화 title로도 해봤는데요.

우리는 지금 아이템 기반 협업 필터링을 할 예정이니, index를 movie title로 두겠습니다. 그러면 당연히 column 정보는 user 아이디이겠죠?

이제 NaN의 값을 가진 데이터에 fillna(0, inplace = True)을 통해 null 값을 채워줍니다.

pandas에서는 fillna를 지원해주기 때문에 null 값을 쉽게 채울 수 있습니다.

 

 

이렇게요! 

그러면 영화-사용자 정보에 따른 평점 정보가 안에 들어가게 됩니다.

평점을 매기지 않았으면 0, 매겼으면 1~5점의 값을 가지게 되죠.

 

아이템 기반 협업 필터링 추천 시스템 같은 경우에는 유사한 아이템끼리 추천을 해줍니다.

여기서는 유사한 아이템이라고 하면 평점이 비슷한 아이템이 될 수 있겠습니다.

그러면 현재 평점이 data로 들어가 있는 상태이니까, 이 상태에서 코사인 유사도(cosine similarity)를 구하면 됩니다!

 

300x250

이렇게 말이죠! cosine_simlarity는 scikit learn에서 제공해줍니다.

그러면 각 아이템 별로 서로서로 유사한 정보의 값을 가지게 됩니다.

 

 

 

그것을 pandas datafrmae으로 만들면 위와 같이 됩니다. 자신과 일치하는 값은 유사도 1이 나오게 됩니다. 

그리고 유사도가 가까울 수록 1에 가까운 값을 나타내게 됩니다.

그러면, 어떤 영화를 시청했을 때(사용자가 어느 영화를 보았을 때) 그 영화가 마음에 들었다면 그것과 비슷한 영화를 추천할 수 있겠죠?

그 기능을 만들면됩니다.

 

 

이렇게요! 함수를 하나 만들어서 title을 받습니다. 이미 cosine 유사도로 item에 대한 유사도를 구했습니다.

그러면 그 title에 해당하는 곳에서 sort_values(ascending=False)로 내림차순으로 만들고 앞에 있는 5개 정도만 가지고 오면 되겠죠!

위 예제에서는 만약 사용자가 Godfather, The (1972)를 보았다고 가정하고 좋은 평점을 매겼으면, 이 갓파더와 유사한 영화를 추천할 수 있는 목록을 보여줍니다.

추천 목록

  • godfather: Part 2 the (1974)
  • goodfellas
  • American Beauty
  • Star Wars 등

여기까지 파이썬으로 구현해보는 추천 시스템(recommend system)의 아이템 기반 협업 필터링(item based collaborative filtering)이었습니다.

다음 포스팅에서는 

Collaborative Filtering 추천 시스템 중 행렬 분해(Matirx Factorization)을 기반으로 하는 추천 시스템을 파이썬으로 구현해봅니다.

반응형
그리드형
Comments