컨텐츠 기반 알고리즘, 협업 필터링 알고리즘 2가지을 마치 하나의 알고리즘으로 활용하는 것에 대해 고민해봤습니다. 리서치 해보며 프로젝트에 알맞는 추천 시스템을 완성할 수 있었습니다.
각 알고리즘의 동작 방식을 정리하면 다음과 같습니다.
1) 협업 필터링 알고리즘
피어슨 상관계수에 따라 (-1 ~ 1 ) 로 수치화 할 수 있습니다. 즉, 유사도를 파악할 수 있습니다.
테스트 단계에서 나와 다른 사람의 정보를 바탕으로 피어슨 상관계수를 구했다면 전체 인원에 대해 상관계수를 파악해야 합니다.
상관계수에서 중요한점은 공통으로 내린 평가 기준입니다. 하지만, 추천은 평가를 내리지 않은것을 예측하여 상위 몇 개를 보여주는 시스템을 구축합니다. 추측평점은 유사도 * (타인 영화평점) 입니다. SUM(추측평점)/SUM(유사도) 를 통해서 예상 평점을 뽑을 수 있습니다.
2) 컨텐츠 기반 알고리즘
TF-IDF 알고리즘을 사용해야 합니다. 무게를 구하는 과정이 포함되는데 이거를 구하는 공식은 다음과 같습니다.
W = tf * log(N/df)
tf는 무엇이고, IDF는 무엇일까요?
tf = term frequency = 문서에서 얼마나 나오는지
IDF = inverse document frequency = 전체에서 얼만큼 중요한지
로 생각해볼 수 있었습니다.
이것을 구해주기 위해 python dptjsms TfidVectorizer 라는 라이브러리가 존재합니다. 이를 통해 tfidf_matrix 를 구할 수 있습니다.
사실 굉장히 컨텐츠 필터링 알고리즘을 직접 구현하려다가 토가 (?) 쏠린 이유는 아이템 n 개에 대한 속성 값들을 n 차원 벡터로 표현해야 하는데 자신이 없었습니다.
tfidf_matrix 구하게 되면 cosine thetal 을 통해서 vecter의 증감을 알 수 있습니다. 이를 통해 유사도의 파악이 가능해집니다.
그래프 보면
이런 이차원 평면상에서 각도를 표현한겁니다.
sin(A,B) = cos(theta) = AB외적/AB내적
정리 해보면 각 알고리즘 장 단점이 명확하기 때문에 혼합해서 하이브리드로 쓰는것이 좋습니다. 스케일을 확장시킬 수 있기 때문입니다.
컨텐츠 필터링 알고리즘 장점은 평점에 대한 정보가 없어도 됩니다. 아이템에 대한 분석을 진행하기 때문입니다. (feature-level basis에서 추천)
단점은 이전 아이템과 추천의 차이가 미비할 수 있습니다. 부정확성의 위험도 따릅니다. 과도해서 의도와 다른 아이템을 추천해줄 수 있습니다.