꺼내먹는지식 준

Collaborative Filetering - 1 (Neighborhood-based CF, K- Nearest Neightborhood CF) 본문

AI/추천시스템

Collaborative Filetering - 1 (Neighborhood-based CF, K- Nearest Neightborhood CF)

알 수 없는 사용자 2022. 7. 11. 18:40

더 많은 유저들로부터 얻은 기호 정보를 활용하여 유저의 관심사를 자동 예측한다.

데이터가 많아질 수록 좋은 건 ML 모델들과 동일하다. 

예시 2 같이 내 데이터만이 아니라 다른 사람들의 상호작용 데이터까지 활용하는 것이 Collaborative Filetering(hereafter, CF) 이다. 

평점 뿐만 아니라 선호도, 클릭 확률이 될 수도 있다. 

유저-아이템 행렬: (유저가 아이템에 기록한 선호도) - 모두 채워져 있지 않은, 즉 빈칸이 존재하는 부분을 채워나가야 한다. 

 

CF는 아이템(contents)이 가진 속성을 하나도 사용하지 않으면서도 추천을 한다. 두 유저가 선호하는 아이템이 유사한 경우, 둘 중 한 유저가 선호하거나 비 선호한 아이템은 다른 한 유저에게도 동일할 것이라 예측하고 적용한다. 이와같은 성질 때문에 데이터가 쌓이면 쌓일 수록 더 정확해진다. 

 

CF는 여러 방식을 통해 수행할 수 있다. 그 중 가장 간단하고 쉬운 방법은 바로 

Neighborhood-based CF(memory-based CF) 이다. 

 

이 외에도 Model-based CF

머신러닝과 딥러닝 기반의 모델들이 있다. 

(Non-parametric(KNN, SVD), Matrix Factorization, Deep Learning) 

또한 Content 와 CF 를 결합한 Hybrid CF 가 존재한다. 

 

하지만 보통 모델을 하나로 결합하기 보다는 각각 모델의 추천 결과를 앙상블 하는 방식으로 주로 사용한다. 

 

먼저 해당 글에서는 가장 간단한 Neighborhood-based CF(memory-based CF) 를 살펴보자. 

 

Neighborhood-based CF(memory-based CF)

User A 와 B는 유사하다. 이에 따라 User B의 스타워즈 점수는 A와 유사할 것이라 예측

 

스타워즈와 비슷한 아이템을 살펴보면 아이언맨, 헐크가 있다. 즉 아이템을 기준으로 가장 유사한 아이템의 점수를 뽑아온다. 

아주 간단한 이 모델은 두가지 문제점을 갖는다. (해당 문제는 모든 추천시스템이 갖는 문제이기도 하다.)

- 아이템과 유저가 계속해서 늘어날 경우 어떻게 대응하는가에 관한 Scalability 문제가 있다. (늘어날 수록 백터가 계속 커지므로) $\rightarrow$ 추후 Matrix Factorization 에서 더 자세하게 다룬다. 

 

큰 문제가 될 수 있는 두번째 문제 Sparsity를 살펴보자. 

Sparsity: 유저 아이템 숫자에 비해 가지고 있는 선호도 및 평점 데이터가 적은 경우

상단의 예시와는 다르게 텅 비어있다. (Netflix 영화 수 999999 내 평점 개수 100)

 

이에 따라 NBCF는 적어도 Sparsity ration 가 99.5% 넘지 않도록 유지

$\rightarrow$ 넘는 경우에는 matrix factorization 기법이 필요 

 

K-Nearest Neighbors CF (KNN CF) & Similarity Measures

NBCF의 한계는 한마디로 아이템 i 의 점수를 예측하기 위해서는 다른 데이터들이 i에 대해 평가를 마쳤어야 한다는 가정아래에서 

(유저기반이어도, 아이템 기반이어도 이 사실은 변하지 않는다.)

유저의 수가 늘어날 수록 연산 속도 문제가 발생하고 심지어 성능이 떨어지기도 한다. 

 이에 따라 가운데 녹색 타겟 점과 가장 가까운 K 개의 점만 찾아서 사용하자는 아이디어가 KNN CF이다. 

$\rightarrow$ 그러나 애초에 유사도를 검증하는 과정자체가 연산 bottle neck에 걸리지 않을까 하는 의문점이 있기는 하다. 

(K 값은 하이퍼 파라미터)

 

아래는 K가 1 일때 예시 

K 가 1이므로, 가장 가까운 User A 데이터를 활용하여 스타워즈에 1점을 부여 

백터, 분포 등을 통해 유사도를 확인할 수 있다.  

 

추천시스템에서 자주사용하는 4가지의 유사도 확인 방법에 대해 알아보자. 

두 유저의 rating 이 비슷할 수록 msd(u,v) 는 작아지고 0이 된 순간 유사도가 1이 된다. 

 

추천 시스템에서 가장 많이 사용, 같은 차원의 벡터 필수 , 벡터의 방향이 같아야한다. 

각 비교 방법에 따라 유사도의 값 차이가 변동이 심하다.

 

코사인 유사도와의 차이점은 "벡터를 표본평균으로 정규화" 했다는 것

코사인처럼 같은 차원이어야 한다.

표본 평균으로 정규화 하기에 점수부여에 weight를 줄 수 있다. 

정규화라는 포인트를 잊지말자. 

 

피어슨 유사도는 언제나 어느정도의 성능을 보여준다. 

 

벡터를 사용하는 것이 아니라, 집합을 사용한다. 

예시)

 

Q: 4.5 이상 평가한 영화는?

A: $m_1, m_3$ 

B: $m_1, m_2, m_4$ 

 

$J(A,B) = \frac{2}{3} = 0.66$

 

어떤 유사도가 좋을까?

데이터의 형태, 추천시스템의 특징, 서비스의 특징등에 따라 선택하는 것이 적절하다. 

 

 

Rating Prediction (CF를 이용한  평점 예측)

 

먼저 User based CF 이다. 

 

다른 유저들의 rating 을 모두 반영하는 것은 비슷하지 않은 유저들을 포함한다.

이에 따라 더 유사도를 측정하여 더 높은 weight를 부가하는 weighted average 가 탄생했다.

유저가 평점을 주는 기준이 제각기 다르다. (왓챠의 점수 시스템)

이에 따라 '편차' 를 이용하는 방식이 제안되었다. 

 

모든 평점을 '편차' 즉 deviataion 값으로 바꾼 뒤 원래의 rating이 아닌 deviation을 예측하면 다음과 같다. 

1. 유저 평균 rating 구하기 

2. 평균 rating에 예측된 deviation 더하기

즉, 평균보다 유저가 얼마나 더 높게 혹은 더 낮게 평가했는가로 절대 평점값을 얻게 된다. 

 

예제는 다음과 같다.

물론, 유사도를 구하는 방식은 다양하다. 여기서는 코사인 유사도를 사용했다. 

Absolute Rating 도 애초에 유사도를 통해 가중치를 부과하기 때문에 사람수가 꽤 많다면 Relative Rating과 값이 유사하지 않을까 싶다. 

 

Item based CF 도 이와 작동방식은 동일하다. 

다만, 가로 방식을 세로 방식으로만 적용하면 된다.

 

※ 애초에 K-NN 으로 하면 유사도 계산의 시간이 bottle neck으로 작용하지 않을까 염려했는데, weighted average를 사용하기 위해서는 애초에 먼저 '유사도' 를 구해야 한다. 또한 그 유사도를 기반으로 weighted sum 혹은 deviation을 연산하다보니 계산량이 더 늘어나고, 관련도가 낮은 데이터로 인해 오히려 성능이 떨어지기도 한다는 것이다. 즉 K-NN은 웬만한 상황에서 default로 사용하면 좋을 것 같다. 

CF를 기반으로 다음과 같이 아주 간단하게 Top-N recommendation 이 가능하다. 

 

Comments