본문 바로가기
🌿 Data Engineering/Data Analysis

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

by 카프리썬_ 2021. 8. 27.
728x90
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

 

728x90
반응형