본문 바로가기
Data/Data Analysis

추천시스템03. 아이템 기반 협업 필터링 (collaborative filtering) 구현

by 카프리썬 2021. 8. 27.
728x90

 협업 필터링(collaborative filtering)  

사용자와 item간의 rating을 이용해서 사용자끼리 '유사도'를 찾는 방식.

특정 사용자와 유사한 사용자들이 남긴 평점, 상품구매 이력 등 행동양식 기반으로 '예측'해서 '추천'해준다. 

그래서 item을 얼마나 좋아할 것인지 수치적으로 예측한다. 

 

협업필터링의 2가지 유형

  • 최근접 이웃기반 필터링 (nearest neighbor collaborative filtering)
  • 잠재요인 기반 필터링 (latent factor collaborative filtering)

 

2.1 최근접 이웃기반 필터링 (nearest neighbor collaborative filtering)

사용자-아이템 행렬에서 사용자가 아직 평가하지 않은 아이템을 예측하는 것이 목표

 

  • 사용자 기반 협업 필터링 : 비슷한 고객들이 ~한 item을 소비했다.
  • 아이템 기반 협업 필터링 : ~한 item을 소비한 고객들은 다음과 같은 상품도 구매했다.  

사용자기반, 아이템기반 

사용자기반 협업필터링

colums은 user, row는 item 행렬을 가지고 있다. (user-item).

user1과 user2는 itemA,itemB,itemC까지 평점이 비슷하기 때문에 user1과 user2는 비슷하다고 판단
 

아이템기반 협업필터링

colums은 item , row는 user 행렬을 가지고 있다. (item-user)
itemA와 itemB는 비슷한 평점분포를 가지고 있기 때문에 itemA와 itemB는 비슷하다고 판단.

그래서 결국 user4에게 ItemA를 추천해준다. 

 

일반적으로 정확도, 사용빈도는 사용자기반 협업필터링 < 아이템기반 협업필터링

 

그래서 이번엔 아이템기반 협업필터링을 적용해볼 것이다.

 


데이터셋  : https://www.kaggle.com/sengzhaotoo/movielens-small

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

목적 : 아이템기반 협업필터링으로 사용자에게 유사한 영화를 추천해준다 

 

1. 데이터준비

2. 데이터전처리

필요없는 컬럼 삭제

movie 데이터와 평점데이터를 merge해서 하나로 합침 

피봇테이블 생성 

아이템 기반 협업 핕터링을 적용하기 위해서 사용자-영화에 따른 평점 점수가 데이터로 들어가야한다.

 

사용자-영화는 아래와 같이 두가지경우가 있을수 있다.

movie_usr_rating  : 영화-사용자 피봇테이블 (index : 영화, column : 사용자)

usr_movie_rating : 사용자-영화 피봇테이블 (index : 사용자, column : 영화)

그런데 우리는 아이템기반 협업 필터링이기니까,

인덱스가 영화인 movie_usr_rating  : 영화-사용자 피봇테이블 (index : 영화, column : 사용자) 을 사용한다. 

 

피봇테이블의 NaN처리

NaN은 아직 평점을 매기지 않은 것으로 볼 수 있는데, fillna를 사용해서 NaN 0으로 처리한다.

 

3. 아이템기반 협업 필터링 

유사도값 추출 (코사인유사도)

유사한 아이템끼리 추천을 해주는 방식, 즉 평점이 비슷한 아이템(영화)를 추천해주는 것이다.

현재 평점이 data로 들어가있으니까, 이 상태에서 코사인 유사도값을 이용해 유사도를 계산한다.

유사도값을 가진 데이터프레임 생성

그럼 각 아이템(영화)끼리 서로 유사한 정보의 값을 가지게 된다. 

그럼 서로 유사도가 가까운 영화일수록 1에 가깝고, 자기자신과 같은 영화이면 유사도값은 1이 된다(대각선은 자기자신)

 

4. 영화추천 사용자 함수 생성

이제 이 데이터프레임을 가지고, 영화추천 기능을 구현하는 사용자 함수를 생성한다.

만약 사용자가 어떤 영화를 보았을때(매개변수로 영화이름 입력), 그 영화와 비슷한 영화를 추천해주는 것이다.

실제로 toy story(1995)를 보았다고 했을때, 이와 유사한 영화에 대한 결과이다.

 

 

참고

https://lsjsj92.tistory.com/568

 

반응형