본문 바로가기
Data/AI

영화 추천 알고리즘: Item-based Collaborative Filtering

by Christine__ 2021. 6. 3.

 

 

영화 추천 알고리즘

추천시스템은 영화나 노래등을 추천하는데 사용되며, 주로 관심사나 이용 내역을 기반으로 추천한다.

이 글에서는 Item-based Collaborative Filtering 으로 추천시스템을 구현한다.

 

[데이터셋 출처] 

- 코드(github) : https://github.com/christine127/K-Digital-Fintech/tree/main/Algorithm

Dataset MovieLens: https://grouplens.org/datasets/movielens/100k/ 

 

[User기반이 아니라 Item 기반을 쓰는 이유]

 User-Based의 한계

- 아이템보다 user 가 많을 때 복잡도가 커진다.

-  user의 기호가 계속 변함

  멜로를 좋아하는 사람이 액션을 보기도 하고, 액션만 보던 사람이 취향이 바뀌기도 해서 예측이 어려움.

 

Item-Based의 특징

-item끼리의 연관성을 파악해서 추천

 

 

[기본원리]

 - user가 낸 평점을 토대로 item(영화) 간의 연관성 파악

 

 예시) A 이용자의 평점

500일의 섬머 : 4.7점

이터널 선샤인: 5점

분노의 질주: 2.7점

 

- 500일의 섬머를 좋아하면 이터널 선샤인을  좋아하는구나를 기계는 학습하게 됨.

- 여러 이용자들의 별점을 토대로 이터널 선샤인을 좋아하면 어떤 영화를 좋아할지 예측할 수 있음. 

- 이용자가 보고 별점을 내린 영화를 토대로 영화추천!

 

 

그럼 이제 코드를 살펴보자

 - pivot table을 사용해서 하는 부분만 설명

 

1. pivot_table만들기  

# 영화제목이 column, 유저id가 index. 평점이 value가 되도록 pivot_table을 만든다
userid_movietitle_matrix = movies_rating_df.pivot_table(index='user_id', columns='title' ,values='rating')

userid_movietitle_matrix 데이터프레임

해당 유저가 보지 않은 영화에는 평점이 없음으로 NaN값이 나온다. 

 

 

2. 영화 하나에 대한, ITEM-BASED COLLABORATIVE FILTERING

타이타닉과 다른 영화 간의 상관계수 내보기

 

 

: 전체 영화와, 타이타닉 영화의 상관관계 분석을 하면, 타이타닉을 본 사람들에게 상관계수가 높은 영화를 추천하면 된다. corrwith 함수를 이용한다.

 

각 영화를 본 사람의 수를 새 컬럼으로 titanic_corrleations에 저장

NaN은 해당 영화를 동시에 본 사람이 없다는 뜻 --> 삭제

count가 80명 이상인 데이터들 가지고 리스트 정렬

titanic과 다른 영화들 평점간의 상관계수 만들기 완성!

 

 

3. 전체 데이터셋에 대한 ITEM-BASED COLLABORATIVE FILTER 를 만들자!

#두 영화를 동시에 본 user가 80명 이상인 데이터들에 대해 상관계수matrix 생성
movie_correlations = userid_movietitle_matrix.corr(min_periods = 80)

 

이제 나의 평점 정보를 가지고, 영화를 추천해 달라고 할 것이다! 

 

내 영화 별점 정보는 My_Ratings.csv 파일에 있다. 

 

이제 영화추천 자동화 파이프라인을 만들어보자

 

단, 가중치는 상관계수 * 나의 영화 평점을 기반으로 한다.

#영화추천 파이프라인

#빈 list 생성
similar_movies_list= pd.DataFrame()

for i in np.arange(0,len(myRatings)):
  movie_title = myRatings['Movie Name'][i]
  similar_movie = movie_correlations[movie_title].dropna().sort_values(ascending=False).to_frame()
  similar_movie.columns = ['Correlation']
  similar_movie['Weight'] = similar_movie['Correlation']*myRatings['Ratings'][i]
  similar_movies_list = similar_movies_list.append(similar_movie)

similar_movies_list에는 내가 본 영화와 각 영화의 상관계수와 내가 본 영화에 상관계수를 곱한 weight가 저장된다. 

영화들이 겹치는 게 문제일 것 같아서 drop_duplicates 함수를 사용하여 중복을 제거했다.

 

 

영화추천 알고리즘 간단한 설명이 끝났다. 중복제거는 개인이 보고자 하는 것에 맞게 수정해서 써보아도 될 것 같다. 

궁금한 사항이나 잘못된 설명이 있다면 댓글에 달아주시면 감사하겠습니다:) 

 

 

'Data > AI' 카테고리의 다른 글

추천시스템 개요 - 종류와 기본적인 용어  (1) 2024.01.10