본문 바로가기
Data/Data Analysis

추천시스템04. 잠재요인 협업필터링(latent factor collaborative filtering) 구현

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

잠재요인 협업 필터링 (latent factor collaborative filtering)

행렬분해(Matrix Factorization)를 기반으로 사용한다.

 

user-item 행렬 데이터를 이용해 잠재요인을 찾아낸다. 

즉 user-item 행렬을 user-잠재요인, item-잠재요인 행렬로 분해는 것이다.

그래서 전체 사용자-아이템(행렬 R)에서 나온 값을 기반으로 잠재요인이 값을 매길 수 있게 된다.

그리고 이 값을 이용해서 사용자가 평가하지 않은 콘텐츠의 점수를 예측하는 것이다.  

 

잠재요인 필터링은 저장공간을 훨씬 줄일 수 있다.

금까지 구현해본 추천시스템 방식중에서 가장 많이 사용된다. 


목적 : 잠재요인 협업필터링으로 사용자가 본 영화와 유사한 영화를 추천해준다 

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

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

1. 데이터준비

 

2. 데이전처리

필요없는 컬럼삭제

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

그럼 어떤유저가 어떤 영화에 평점을 얼마 줬는지 알수 있는 데이터프레임까지 완성된 상태

 

피봇테이블 생성

지금 각 컬럼들이 user,영화,평점 이렇게 되어 있는데 이걸 usr가 index, 컬럼이 영화, data가 평점으로 바꿔준다.

이런식으로 변형하는 작업이 필요하다

피봇테이블의 NaN처리

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

사실 여기까진 아이템기반 협업필터링과 다를게 없다...!

 

3. 잠재요인 기반 협업필터링

여기에선 잠재요인을 '특정영화'로 지정한다. 그래서 특정영화와 비슷한 영화를 추천해주는 것이다. 

 

피봇테이블 전치

우선 user-movie로 되어 있는 피봇테이블을 movie-user로 전치시킨다. 행과 열이 바뀌게 된다.

SVD(특이값 분해)

SVD(Singular Value Decomposition) : M X N 크기의 데이터 행렬A를 아래처럼 분해한다. 

python scikit learn에 있는 TruncatdSVD를 사용한다. 
>> TruncatdSVD 참고

임의로 특이값(latent)를 12로 잡았다.

그리고 fit_transform으로 변환하게 되면 전체 영화데이터가 12개의 어떤 요소의 값을 가지게 된다. 

 

피어슨 상관관계수 값

그리고 이렇게 나온 matrix값들의 피어슨 상관계수를 구해본다.

 

>> 피어슨 상관계수 및 시각화 참고

seaborn의 heatmap으로 상관계수끼리의 관계도 시각화 할 수 있다.

9064 전체 데이터로 그래프를 그리려고 하니까 계속 메모리에러가 나서, 200개로 짤랐다! 어차피 경향만 보는거니까

이런 heatmap 그래프를 통해 상관계수끼리 관계를 볼 수 있다.

대각선은 자기자신과의 관계인데 가장 상관관계가 높을테니까 흰색이 된 것이다! 

이제 이 상관계수를 이용해서 특정영화와 관련하여 상관계수가 높은 영화를 뽑아주면 된다. 

 

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

이제 이 상관계수와 user-item 행렬을 가지고 영화추천 기능을 구현하는 사용자 함수를 생성한다.

만약 사용자가 어떤 영화를 보았을때(매개변수로 영화이름 입력), 상관계수가 값이 0.9 이상인 영화를 추천해준다.

실제로 아이언맨(2010) 를 보았다고 했을때, 이와 유사한 영화에 대한 결과를 보면 캡틴아메리카, 배트맨 등이 보인다! 


하지만 이 방식은 개인 맞춤형 추천 방식이 아니다! 

단지 특정 영화와 비슷한 영화를 알려주는것에 불과하다. 

 

출처 

https://lsjsj92.tistory.com/569

반응형