[추천 시스템] CF, CBF

Jewook·2022년 10월 10일
0

ML

목록 보기
3/4

Content Based Filtering 1

  1. 아이템의 피처들을 추출해서 벡터화한 후, 아이템 간의 유사도를 계산한다.
  • 유사도 함수
  1. Jaccard Similarity

sim(A,B) = rArA/rArB\| r_{A} \cap r_{A} \| / \| r_{A} \cup r_{B} \|

실제 값을 보지 않고, 값이 동시에 존재하는 정도로 유사도를 판단.
계산이 간편하지만 실제 값을 고려하지 않기 때문에 직관적인 결과를 얻지 못할 수 있다.

  1. Cosine Similarity

물리적인 "방향"에 기반하여 유사도를 계산한다.
피쳐들이 label 값일 경우 성능이 좋다. 값의 크기가 의미를 갖는 경우에는 적절하지 않다.

  1. Euclidean Similarity

물리적인 "거리"에 기반하여 유사도를 계산해준다.
하지만 scale에 민감하기 때문에 적절히 전처리를 해주어야 한다.

  1. User Profiles를 만든다.

Item에서 정의한 feature에 대응되도록 만들어야 한다.
차원이 일치해야 내적을 통해 예측값을 구할 수 있기 때문이다.

예를들어 Item은 영화이고 배우가 A인지 B인지를 나타내는 피처 하나씩만 있다고 가정해보자.

Binary label)
영화의 시청 여부를 기록한다고 할 때, A가 나오는 영화는 2번 B가 나오는 영화는 3번 보았다고 하면 A feature에 대한 weight는 0.4, B는 0.6임을 알 수 있다.

Rating)
만약 평점을 부여하는 경우도 살펴보자. A가 나오는 영화에 3, 5점을 B가 나오는 영화에 각각 1,2,4점을 주었다고 하자.

우선 이 유저가 전체 부여한 평점의 평균 3으로 normalization을 우선 해주면
A : 0, 2
B : -2, -1, 1
이므로 A의 가중치는 1 B의 가중치는 -2/3 이라고 알 수 있다.

  1. Make Prediction

item feature vector와 user profiles의 내적을 통해, 혹은 cosine 값을 통해 예측할 수 있다.

장단점

  • 장점
    다른 유저의 데이터가 필요 없다
    특이한 성향(unique taste)를 갖는 유저에게도 추천이 가능
    새로운 item에 대해서도 feature만 잘 정의하면 추천이 용이하다

  • 단점
    다른 유저들의 데이터로부터 도움을 받지 못한다.
    feature를 정의하는 것 자체가 난관이다.
    유저의 profile에만 국한되어 추천하게 될 수 있다.
    새로운 "유저"에 대해서는 추천할 수 없다.

Content Based Filtering 2

딥러닝을 활용

item feature에 맞춰서 user feature를 추정하는 것이 아니라, 각각 독립적으로 피쳐를 추출한다. 피쳐를 추출하는 고된 일이 두배가 되었지만, 모델링 하기에 따라 유저와 아이템을 더욱 잘 표현할 수 있다.

추출한 두 피처를 근거로 예측을 해야하는데, 다양한 방법이 있을 수 있지만 가장 간단한 방법으로 dot product를 이용할 수 있다. 다만 서로 차원이 다르기 때문에 간단한 neural network를 거쳐 차원을 맞추어 준다.

텐서플로우로 구현된 코드가 있어서, 딥러닝을 조금 더 공부하고 pytorch로 바꾸어보고자 한다.

Retrieval Ranking을 통해 최적화하기에 좋다.

아이템들의 피처들을 미리 신경망을 통해 학습시켜 두면, 아주 빠른 성능의 추천 시스템을 기대할 수 있다.

Collaborative Filtering

Nearest Neighbor Based

  • User based

n명의 비슷한 유저를 찾고
그 유저들에 기반하여 나의 score를 예측한다.

비슷한 정도는 jacard, cosine, euclidean 등의 기준을 적절히 활용할 수 있다.

  • Item based
    비슷한 n개 아이템을 찾고,
    비슷한 아이템들에게 내가 줬던 점수의 유사도 기반 가중 평균을 적용한다.

에듀세션 퀘스트에도 유저기반, 아이템 기반 협업 필터링 코드가 대략적으로 구현되어 있다.

Latent Factor Analysis

잠재 요인을 찾아내어 행렬 분해를 통해 예측하는 알고리즘이다.

잠재 요인이 구체적으로 무엇을 의미하는지는 완전히 블랙박스이다.

잠재 요인이 영화의 장르적 특성을 의미한다고 가정하고 분석한 내용이다.
행렬 분해를 풀어서 설명했으므로 행렬 분해가 나오지 않지만, 유저의 feature와 item의 feature가 각각 분해될 행렬의 요소들이다.

정직하게 gradient descent로 구현한 코드와 딥러닝을 활용한 코드를 찾아 두었는데, 완전히 내것으로 만들고 구현하고 싶어서 조금 더 공부하려고 한다.

Reference

  • 간단한 CF 구현 dvysardana
  • Coursera Recommender System
profile
https://solved.ac/profile/huh0918

0개의 댓글