추천시스템04. 잠재요인 협업필터링(latent factor collaborative filtering) 구현
잠재요인 협업 필터링 (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) 를 보았다고 했을때, 이와 유사한 영화에 대한 결과를 보면 캡틴아메리카, 배트맨 등이 보인다!
하지만 이 방식은 개인 맞춤형 추천 방식이 아니다!
단지 특정 영화와 비슷한 영화를 알려주는것에 불과하다.
출처