콘텐츠 기반 필터링, 협업 필터링 방식으로 나뉨
협업 필터링 방식은 최근접 이웃 협업 필터링과 잠재 요인 협업 필터링으로 나뉨
사용자가 특정 아이템을 선호하는 경우, 그 아이템과 비슷한 콘텐츠를 가진 다른 아이템 추천
특정 영화에 높은 평점을 줬다면 해당 영화와 장르, 출연 배우, 감독, 영화 키워드 등의 콘텐츠와 유사한 다른 영화를 추천해주는 방식
사용자가 아이템에 매긴 평점 정보나 상품 구매 이력과 같은 사용자 행동 양식만을 기반으로 추천을 수행
사용자-아이템 평점 매트릭스와 같이 축적된 사용자 행동 데이터를 기반으로 사용자가 아직 평가하지 않은 아이템을 예측 평가하는 것
일반적으로 사용자 기반보다는 아이템 기반 협업 필터링이 정확도가 더 높음
사용자-아이템 평점 행렬 데이터만을 이용해 잠재 요인을 끄집어 내는 것
다차원 희소 행렬을 저차원 밀집 행렬인 사용자-잠재요인 행렬과 아이템-잠재요인 행렬의 전치 행렬로 분해, 분해된 두 행렬의 내적을 통해 새로운 예측 사용자-아이템 평점 행렬 데이터를 만들어 사용자가 아직 평점을 부여하지 않은 아이템에 대한 예측 평점을 생성
다차원 행렬을 저차원으로 분해하는 기법, 대표적으로 SVD, NMF 등이 있음
M개의 사용자 행과 N개의 아이템 열을 가진 평점 행렬 R은 MxN차원으로 구성
행렬 분해를 통해 사용자-K차원 잠재 요인 행렬 P(MxK차원)와 K차원 잠재 요인 - 아이템 행렬 Q,T(KxN차원)로 분해될 수 있음
(Q는 아이템-잠재요인 행렬, T는 Q의 전치 행렬인 잠재요인 - 아이템 행렬)
SVD는 NaN 값이 없는 행렬에만 적용할 수 있음
확률적 경사 하강법(SGD)나 ALS 방식을 이용하여 SVD 수행
P와 Q행렬로 계산된 예측 R 행렬 값이 실제 R 행렬 값과 가장 최소의 오류를 가질 수 있도록 반복적인 비용 함수 최적화를 통해 P와 Q 유추
ast 모듈의 literal_eval 함수를 이용하면 json 형태의 문자열을 객체로 만들 수 있음
문자열로 변환된 장르를 Count 기반으로 피처 벡터화
해당 벡터 데이터 세트를 사용하여 코사인 유사도 비교
장르 유사도가 높은 영화 중 폄점이 높은 순으로 영화 추천
장르 유사도에 따라 영화를 추천
여러 관객의 평점 평균이 일부 소수 관객만의 평점을 토대로 왜곡될 수 있기에 가중 평점이라는 방식 사용
최근접 이웃 협업 필터링은 사용자 기반, 아이템 기반으로 구분됨
아이템 기반 협업 필터링이 일반적으로 추천 정확도가 뛰어남
협업 필터링 기반 추천을 위해서는 사용자-아이템 평점 행렬 데이터 세트 필요
MovieLens 데이터 세트 사용 실습
cosine_similarity() 메소드는 행을 기준으로 서로 다른 행을 비교하여 유사도 산출
사용자의 평점 정보를 취합하여 영화에 따라 유사한 다른 영화 추천
위 예시는 모든 사용자의 평점을 기준으로 영화의 유사도를 생성(개인 취향이 아님)
개인이 아직 관람하지 않은 영화를 추천
아직 관람하지 않은 영화에 대해 아이템 유사도, 기존 관람 영화 평점 데이터를 기반으로 새로운 모든 영화의 평점 계산 후 높은 예측 평점을 가진 영화를 추천
파이썬 기반에서 사이킷런과 유사한 API와 프레임워크 제공
pip install scikit-surprise
Suprise 패키지의 Prediction 객체는 추천 예측 평점 데이터와 입력 데이터를 튜플 형태로 가지고 있음
detail 속성은 내부 처리 시 추천 예측을 할 수 없는 경우 로그용으로 데이터를 남김
was_impossible이 True이면 예측값을 생성할 수 없는 데이터
SVD++ 알고리즘의 RMSE, MAE가 가장 좋으나 상대적으로 시간이 너무 오래 걸림
영화나 상품의 평가는 각 개인의 성향에 따라 같은 아이템이더라도 평가가 달라질 수 있음
개인 성향 반영해 아이템 평가에 편항성 요소를 반영하여 평점을 부과하는 것
보편적으로 전체 평균 평점 + 사용자 편향 점수 + 아이템 편향 점수로 계산됨
cross_validate()와 GridSearchCV 클래스 제공
데이터 세트 전체를 학습 데이터로 사용하려면 DatasetAutoFolds의 build_full_trainset() 메서드 호출