협업 필터링은 1) Model based, 2) Memory based로 나뉘게 됩니다. Memory based 알고리즘은 사용자-아이템 행렬을 생성하여 유사도를 측정하는 것입니다. 사용자 간 유사도를 측정하면 사용자 기반(User-based) 협업 필터링, 아이템 간 유사도를 측정하면 아이템 기반(Item-based) 협업 필터링이라고 합니다.
반면, Model based 알고리즘은 Memory based를 기본으로 하되 군집화, 분류, 예측 단계에서 머신러닝이나 데이터마이닝 기법을 활용하는 것입니다. 평점을 예로 든다면 사용자가 이미 부여한 평점 기록을 학습하여 아직 평점을 부여하지 않은 아이템에 줄 평점을 예측하는 방식입니다. 이때 기본적으로 사용되는 방법인 Matrix Factorization은 사용자와 아이템 간에 존재하는 잠재 요인(Latent Factor)을 통해 평점을 예측하는 것입니다. 일단 아래에서 자세히 살펴봅시다.
잠재 요인을 구하는 대표적인 방법으로는 사용자-아이템 행렬을 3개의 행렬로 분해하는 SVD(Singular Value Decomposition)이 있습니다. 이를 변형한 버전으로는 SVD++ 등이 있죠. SVD++에 대해선 아직 공부를 하지 않아 잘 모르지만 잠재 요인을 더 잘 찾는다고 하네요.
사용자-아이템 행렬(User-Item Matrix) 형식은 기본적으로 아래와 같습니다(평점 5점 만점 기준). 인덱스에는 유저가, 컬럼에는 아이템, 셀에는 유저의 평점이 담깁니다. 꼭 평점이 아니더라도 클릭 수, 조회 수 등 정형화된 데이터가 될 수 있습니다.
아이템 1 | 아이템 2 | 아이템 3 | 아이템 4 | 아이템 5 | |
유저 1 | 5 | ? | ? | 2 | ? |
유저 2 | 4 | ? | 3 | 1 | ? |
유저 3 | ? | 1 | 2 | ? | ? |
유저 4 | ? | 4 | 2 | ? | 1 |
유저 5 | 1 | 2 | 3 | ? | ? |
SVD는 원본 행렬을 3개 행렬로 분해하는 것이라고 했습니다. 수학 공식으로 표현하면 아래와 같습니다. eigenvalue와 eigenvector의 의미는 장철원님 블로그를 통해 쉽게 이해할 수 있었습니다.
$ A = UDV^T$
$U$: left singular vectors
$D$: diagonal of singular values
$V$: right singular vectors
$U$와 $V$는 모두 직교(orthogonal)행렬이다. $D$는 unique한 존재이며, 대각 행렬의 원소는 0보다 크거나 같은 eigenvalue를 의미한다. 아래에서 설명하는 잠재 요인에 해당하는 부분이 $D$의 컬럼 차원이 된다.
(참고) eigenvalue 및 eigenvector란?
def.
eigenvalue: $\lambda \in \mathrm{R}$
eigenvector: $Ax=\lambda x$ where $x \in \mathrm{R^n}$ 단, x는 0벡터가 아님
선형변환은 특정 벡터를 확대하거나, 축소하거나, 회전시키는 등을 의미한다. $Ax$는 결국 x라는 벡터에 선형변환(A)을 취한 것이다. eigenvector란 고유한 특징을 가진 벡터라는 의미로, 이때 특징은 방향(direction)은 변하지 않고, 크기(magnitude)만 변하는 것을 말한다. 크기가 얼마나 변했는지를 나타내는 것이 바로 eigenvalue이다.
수학 공식에 멀미가 난다면 다 필요 없고 아래만 살펴보시면 됩니다. SVD를 수학적 의미로 받아들이지 마시고 사용자의 특성을, 아이템의 특성을 자세히 파악해본다 정도로 이해해도 충분합니다.
협업 필터링에서 보자면 SVD를 한 결과는 아래와 같습니다. 아이템 벡터는 $UD$에 해당하는 것이고, 유저 벡터는 $DV$에 해당하는 것이며, 형태는 전치(transpose)를 한 것입니다. 이때 아이템 행렬의 컬럼 및 유저 행렬의 행인 "잠재 요인1", "잠재 요인2"는 우리가 직접적으로 알 수는 없습니다. 이것이 의미하는 바는 아이템의 특성이 되고, 영화로 생각한다면 코메디나 액션과 같은 장르가 될 수 있는 것입니다.
잠재 요인 개수는 사람이 직접 판단해서 최적화를 할 수 없습니다. 10개를 할 수도, 50개를 할 수도, 100개를 할 수도 있습니다. 결국 heuristic하게 최적의 잠재 요인 개수를 찾아내거나(GridsearchCV 등) 하이퍼파라미터로 미리 설정해야 하는 것이죠. 참고로 surprise패키지의 Matrix Factorization 모듈은 디폴트 값이 100개입니다. surprise 패키지를 활용한 코드 예시는 제 다른 글을 참고해주세요.
학습은 SVD를 통한 Matrix Factorization으로 유저가 아이템에 대해 부여할 것으로 "예상"되는 평점(이미 평점을 부여한 아이템도 포함)을 계산하고, 이를 실제 부여한 평점과 비교하여 최소화하는 방식으로 진행됩니다. 평가 지표로는 보통 RMSE를 사용합니다. 이렇게 학습을 진행하면 아이템 행렬, 유저 행렬이 업데이트되며 RMSE가 가장 작은 최적의 행렬을 찾아가는 것입니다.
다만, 사용자-아이템 기반 협업 필터링은 다음와 같은 한계가 있습니다. <추천 시스템 기법 연구동향 분석> 논문을 참고했습니다.
1. Cold Start
아이템을 소비한 유저가 적거나 아예 없는 경우 혹은 유저가 소수의 아이템만 소비하거나 아예 소비하지 않았을 경우 sparse matrix가 생성된다. 이때 유저 간 유사도를 구하는 데 문제가 발생한다.
2. Scalability
상품의 종류가 다양해지고 유저가 늘어남에 따라 사용자-아이템 행렬 크기는 커지고 있다. 알고리즘 구현시 컴퓨터 계산량이 급증하여 시간과 비용이 소모되는 문제점이 발생한다.
3. Grey sheep
협력 필터링 접근 방식은 사람들의 취향에 경향과 패턴이 존재한다는 것을 가정한다. 따라서 일관성 없는 유저 데이터는 방해가 되며 예측 정확도를 떨어뜨린다.
4. Shilling Attack
광고 및 마케팅을 위해 관계자들이 자사 아이템에 긍정적인 평가 점수를 입력하거나 경쟁사 아이템에 부정적인 평가 점수를 입력할 경우 전반적인 추천 시스템에 영향을 준다.
'문돌이 존버 > 데이터 분석' 카테고리의 다른 글
RNN 개념 잡고 간단 예제 코드 돌려보기 (2) (1) | 2021.04.25 |
---|---|
RNN 개념 잡고 간단 예제 코드 돌려보기 (1) (0) | 2021.04.11 |
앙상블 학습 - 부스팅(boosting) 알고리즘 개념 잡기 (0) | 2021.04.10 |
파이썬, pandas 일자 및 시간 처리 방법, feat. dt (0) | 2021.04.06 |
서프라이즈 SVD Collaborative Filtering 파이썬 예제 (1) | 2021.03.01 |