코드만 짜고 하다보니 전체적인 그림이 자꾸 잊혀지는 것 같아 한 번 정리를 쭉 해보고자 한다.
추천시스템이란?
사용자의 interest를 예측해서 흥미로워할 만한 상품을 추천해주는 것.
추천시스템에 사용되는 data는 Explicit data와 Implicit data가 있다.
- Explicit data : ex) 영화를 본 뒤 매기는 평점
- Implicit data : ex) 사용자가 장바구니에 담거나 해당 아이템 페이지에 머무르거나 하는 함축적인 정보
왜 추천시스템이 필요한가?
회사입장에서는 판매율을 높이기 위해 필요하다. 각 고객의 취향을 고려한 추천으로 판매율을 높일 수 있다.
또한, 추천은 검색 속도를 높이고 사용자가 자신이 흥미를 느끼는 컨텐츠에 검색하지않고도 더 쉽게 접근하도록 한다.
이외에도 회사는 수신자의 흥미에 맞춘 상품들의 link를 e-mail로 보냄으로써, 신규 고객을 얻고 기존 고객을 유지하고 영화나 TV 쇼를 각 사용자의 프로파일에 맞춰 제안한다.
이 결과로 사용자들은 추가적인 상품들을 구매하거나 컨텐츠를 소비한다. 사용자가 원하는 것을 앎으로써, 회사는 경쟁력을 이익을 얻어 고객을 잃을 위험이 감소한다.
추천시스템은 어떻게 작동하는가?
우선 추천시스템은 두 가지의 정보로 작동한다.
- Characteristic information : 아이템 자체에 대한 정보 ex) 키워드, 카테고리 & 사용자 자체에 대한 정보 ex) 선호도, 프로필 등...
- User-item interactions : 아이템에 대한 사용자의 평가, 구입하는 수, 좋아요 등등...
이러한 정보들을 기반으로 우리는 추천시스템에 사용되는 세 가지 알고리즘을 구분한다.
- Content-based systems(컨텐츠 기반) -> characteristic information을 사용해서 추천한다.
- Collaborative filtering systems(협업 필터링) -> user-item interactions을 기반으로 추천한다.
- Hybrid systems(컨텐츠 기반과 협업 필터링을 결합하여 장점만을 뽑아낸다.)
1. Content-based systems
" 사용자 A가 아이템 c에 관심이 있었다면 미래에도 이 아이템에 관심이 있을 테니, c와 비슷한 다른 아이템을 추천하자!"라는 가설을 기반으로 한다. 아이템의 유사도는 그들의 features를 기반으로 측정된다. 영화라면 장르, 출연배우 등...
사용자의 프로필은 과거의 interactions 또는 사용자에게 취향을 물어서 형성한다.(왓챠플레이에서 봤던 영화에 대해 평가해달라는 방식을 생각하면 쉽다.)
컨텐츠 기반 시스템의 문제점은 색다른 컨텐츠를 추천하기가 어렵다는 것이다.
사용자 A가 B,C,D 카테고리에 관심이 있다고 판단되면 그 외의 카테고리의 아이템은 추천하지 않는다.
또 다른 문제점은 새로운 사용자들은 기존의 정보가 없기 때문에 위와 같이 explicit 정보를 묻지 않는 한 추천이 힘들 수 있다.
이러한 문제점들에도 불구하고 컨텐츠 기반 시스템은 상대적으로 새로운 사용자들을 시스템에 추가하는 것이 쉽다는 장점이 있다. (이 사용자의 취향에 따라 grouping만 하면 되기 때문에...)
2. Collaborative filtering systems
협업필터링 시스템은 최근 가장 빈번하게 쓰이는 접근법 중 하나이고 컨텐츠 기반 시스템보다 대부분의 경우에서 나은 결과를 제공한다. 유투브, 넷플릭스 그리고 스포티파이에서 쓰인다.
협업필터링 시스템은 user-item interactions를 사용한다.
협업필터링은 classifications 즉 분류와 regression의 일반화 버전이라고 생각할 수 있다.
classifications과 regression은 variable을 다른 variables에 의존하여 예측하는데 협업필터링은 feature variables과 class variable의 구분이 없다는 것이 다르다.
행렬로 표현해보면,
왼쪽의 분류는 training과 test를 나누어서 몇 variable들은 test row에 의존한다.
반면 오른쪽의 협업필터링은 training과 test를 따로 나누지 않고 independent variable과 dependent variables의 구분 또한 없다.
요약하자면, 협업필터링은 "사용자 A가 item c를 좋아하고 사용자 B 또한 item c를 좋아하고 item d를 좋아했다면 사용자 A도 item d를 좋아할 것이다"를 가정한다. 그러므로 협업필터링은 기존의 히스토리(ex 사용자 A,B가 모두 item c를 좋아하고 사용자 B는 item d 또한 좋아한다.)를 기반으로 새로운 interactions(사용자 A도 item d를 선호할 것이다.)를 예측한다.
협업필터링의 방법은 Memory-based와 Model-based로 나뉜다.
1) Memory-based
참고 자료 :
https://simonezz.tistory.com/22?category=852348
메모리 기반 협업필터링은 또 두가지로 나뉘는데 첫번째는 사용자의 clusters를 확인하고 특정 사용자의 interactions을 이용하여 같은 cluster에 있는 다른 사용자(유사한 사용자)의 interactions을 예측하는 것이다. (user based collaborative filtering)
두번째는 사용자 A가 평가한 아이템의 clusters을 확인하고 이 것을 이용하여 이 아이템과 유사한 다른 아이템에 대한 사용자 A의 interactions을 예측하는 것이다. (item-based collaborative filtering) (content based filtering과 헷갈리지 않게 주의!) content based 는 아이템 자체의 특성(장르, 태그 등)을 이용하여 유사한 아이템을 추천하는 것이고 item-based는 user-item rank matrix를 기반으로 유사한 아이템을 추천하는 것이다.
이러한 메모리 기반 협업필터링은 user-item matrix의 sparsity라는 문제를 갖게 된다. 너무 sparse하면 정확한 cluster를 형성하기 힘들기 때문에...
2) Model-based
모델 기반의 협업필터링은 머신러닝이나 데이터 마이닝 기술들을 기반으로 한다.
GOAL : 모델을 training해서 예측하게 만들자!
예를 들어 우리는 기존의 user-item interactions의 히스토리를 이용하여 모델을 트레이닝하고 사용자가 좋아할 만한 top-5 items을 예측할 수 있다.
장점) 메모리 기반의 협업필터링에 비해, 심지어 matrix가 sparse할 때도 많은 사용자들에게 많은 아이템들을 추천할 수 있다. "large coverage"
이렇게 협업필터링의 두 방법인 memory-based와 model-based 에 대해 알아보았다.
이전 방법인 컨텐츠 기반 시스템은 신규 사용자들에게 직접 explicit data를 요구하지 않는 이상 추천을 할 수 없다는 단점이 있지만, 신규 사용자들을 추가하기 쉽다는 장점이 있었다.
협업필터링은 어떤 단점과 장점이 있을까?
단점 - 1. Cold start 문제 : 시스템이 작동하기 위해서는, user-item interactions에 대한 충분한 정보가 있어야 한다. 만약 인터넷 쇼핑몰을 새로연다고 할 때 우리는 사용자들이 많은 아이템들과 interact하기 전에는 제대로 된 추천을 할 수 없다.
- 2. 신규 사용자/아이템 추가 시 문제 : 새로운 사용자나 아이템을 추가할 때 기존의 interactions이 없기 때문에 prior 정보를 가지고 있지 않다. (이런 문제를 해결하기 위해 hybrid 시스템이 필요!)
* Collaborative filtering에 사용되는 techniques : fully-connected neural networks & Item2vec
1) Fully-connected neural networks
이 방법의 고전적인 접근법 중 하나는 Matrix factorization이다.
GOAL : Unknown user-item matrix(R)를 찾아내는 것이다.
그렇다면 이제까지 알고있는 user-item matrix 를 이용하여 U(user matrix), I(item matrix)를 뽑아내서 최종적으로 Rating matrix R를 찾아내야 하는데 어떻게 U, I를 얻을까?
한 방법으로는, Neural network를 이용하여 U, I를 찾는 것이다.
첫번째로는, 우리는 각 사용자와 아이템을 한 벡터(각각 dim M과 N)로 mapping시켜야 한다.
즉 우리는 사용자들과 아이템들의 representations을 neural network을 이용해서 learning 해야한다!
( representations = embeddings )
물론 처음에 값을 모르니 random initialization으로 시작해야 한다.
그다음, 각 user-item interactions (u,x)에 대해 user u와 item x의 embeddings을 쌓아 single vector를 되돌려준다. 우리가 기존에 아는 matrix의 값이 output으로 나오도록 neural network를 통해 training 시켜주는 것이다! 그 다음 모두 잘 아는 back propagation을 이용하여 parameters를 조정한다. (그럼 embeddings 값 또한 조정될 것이다.)
결과적으로, network는 사용자들과 아이템들을 잘 대표하는 방식에 대해 배우고 아직 모르는 ratings값에 대해 예측할 수 있어진다.
예를 들어, 위의 그림에서 사용자 A의 item X에 대한 interactions인 (A,X)를 예측하자고 하면 neural network에
[1.2, 0.8, 1.2, 0.6]를 먹이고 output이 4.5가 나오도록 training 시킨다.
training을 시키려면 loss를 정의하고 loss를 최소화 시키는 방법으로 back propagation을 이용하여 weight update하는 방식인데, loss는 가장 흔한 MSE 사용할 수 있다. 만약 interactions을 위와 같이 5점만점의 평점이 아니라 0/1인 binary를 사용한다면 classification에 쓰이는 cross entropy를 사용할 수도 있다.
여기서 흥미로운점은 embeddings은 대개 특정 semantic information을 포함한다는 것이다. 그러므로 그저 예측하는데에만 끝내지 않고 insights를 얻을 수 있다.
예를 들어 아래의 예시를 보면 user matrix에서 각 행은 각 사용자들에 대한 embeddings이고 각 열은 사용자들의 comedy나 action 영화와 같은 장르에 대한 정보를 뜻하는 것을 알 수 있다.
2) Item2vec
Item2vec은 이름만 들어보고 생소해서 후에 더 포스팅하도록 하겠습니다.
Item2vec은 아이템들에 대한 embeddings이 Word2vec에 사용된 방식과 비슷하게 찾아질 수 있다고 제안한다. Item2vec은 상점 구입 순서를 contextual information으로 사용한다. 즉 유사한 상황에서 구입된 아이템들은 비교될 수 있고 embeddings의 측면에서 매우 비슷한 represenatations을 가진다.
이 접근법은 직접적으로 사용자를 포함시키지도 않고 추천를 하는 순간에서 그들을 고려하지도 않는다. 그러나 만약에 우리의 목표가 사용자에게 그들이 선택한 특정 아이템에 대한 대안들을 보여주는 것이라면 유용할 수 있다. ( "이 TV를 샀다면 이 것들도 좋아할거에요!" 라는 논리이다.)
여기서의 주된 문제는 good embeddings을 얻기위해 엄청나게 많은 데이터가 필요하다는 것이다. Item2vec논문에서, 두 데이터셋이 사용됐는데 하나는 9백만개의 interactions, 73만명의 사용자 그리고 약 5만개의 아이템을 가지고 있고 다른 하나는 약 38만개의 interactions, 1706개의 아이템들 그리고 사용자에 대한 정보는 없다.
언제 추천시스템을 사용할까?
언제 추천시스템을 쓰면 가치가 있을까?
만약 성공적인 사업중이라면 추천시스템이 없어도 될것이지만 데이터의 힘을 이용하고 싶다면 추천시스템 사용을 고려해봐야한다.
어떻게 회사들이 추천시스템을 사용하여 이익을 냈는지 살펴보자.
아마존, 알리바바, 유투브 그리고넷플릭스와 같은 거대회사들은 모두 추천시스템을 이용하여 엄청난 판매량을 기록하고 사용자들을 끌어들였다!
추천시스템을 사용하기 위한 전제조건은 무엇일까?
(당연한 얘기이므로 이 섹션은 패스하셔도 됩니다.)
당연히 DATA가 유일하게 그리고 엄청나게 중요하다.
당연히 추천을 하려면 사용자와 아이템에 대한 정보가 있어야 한다. 만약 metadata만 가능하다면 컨텐츠 기반 추천시스템으로 시작할 수 있고 엄청난 interactions 정보가 있다면 더 강력한 추천시스템인 협업필터링 추천시스템이 적용가능하다.
더 많은 데이터를 가지고 있을수록, 추천시스템은 더 잘 작동할 것이다.
<user-items interactions을 사용할 때 주의할 점>
1) 시스템에 따라 interactions을 정의해야 한다. 예를 들어 인터넷 쇼핑몰이라면 interactions은 아이템에 대한 클릭, 방문들, 선호하는 아이템들, 구입, 평점, 장바구니에 담긴 상품들 또는 장바구니에서 삭제된 상품들과 같이 정의할 수 있다.
2) interactions은 정보와 같이 explicit 과 implicit으로 나뉠 수 있다. Explicit는 리뷰나 평점이 있고 Implicit는 사용자의 actions이다. 예를 들어 상품을 검색하거나 구입하는 등의 actions...
3) 사용자와 아이템의 interactions의 수가 많을수록 최종 추천 결과는 좋을 것이다.
4) 전형적으로, 많은 사용자들이 interact하는 인기 상품들이 있고 그렇지 않은 비인기 상품이 있다.
밑의 그래프에서 보면 Long Tail부분이 비인기 상품이라 할 수 있는데, 추천시스템은 인기 상품들에서는 대부분 잘 작동하지만 사용자들이 이미 아는 상품일 가능성이 크므로, 사용자에게 큰 흥미를 주지 않는다. Long Tail의 아이템들은 추천되지 않으면 잘 모르는 흥미로운 상품들이다.
새로운 상품을 런칭하는 맥락에서, 추천시스템을 밑바닥부터 실행시키는 건 쉽지 않다. 컨텐츠 기반의 추천은 사용자들이 interacting을 시작하면 편리해진다. 위에서 말했듯이 아예 기존 히스토리가 없는 경우에는, 사용자들에게 그들의 관심사를 물어볼 수 있다.
한 번 사용자들과 아이템들의 interactions에 대한 정보가 풍부해지면 collaborative filtering을 시작할 수 있다! 그러면 더 정밀한 추천이 가능해지겠다.
이제 남은 것은 어떻게 추천시스템의 성능을 평가하느냐이다. 가장 어려운 부분이다!
어떻게 추천시스템의 성능을 평가하나?
추천시스템의 goal에 따라 평가 방법이 달라진다. 단지 top-5 items에 관심이 있다면 나머지 아이템들에 대한 예측을 고려할 필요가 없다. 그러나 이러한 추천 아이템 5개의 순서에 관심이 있다면 다음의 방법들을 고려해보자.
- Online methods : A/B testing이라고도 불린다. ex) 추천 아이템에 대한 user clicks
이상적인 방법이지만 실행하기 어렵다. 이미 만들어진 시스템과 실시간으로 interacting 해야하기 때문.
- Offline methods : experimental stages에서 이상적이다. 사용자가 직접적으로 포함되지 않기 때문에. 그리고 online methods와 다르게 system은 고려되지 않아도 된다. Data는 training dataset과 validation dataset으로 나뉜다. 즉, data의 일부분이 system을 만드는 데 사용된다.(training dataset) 그리고 나머지 부분(validation dataset)은 이 시스템을 평가하는데에 사용된다. 이 offline methods를 사용할 때에는 결과에 영향을 미치는 factors가 있을 수 있으니 신중하게 다뤄야한다. 예를 들어, 시간 factor는 추천에서 매우 중요하므로,(계절, 날씨 등 고객의 기분을 좌우하기 때문에) 꼭 고려해야 한다. (내가 본 대부분 이 오프라인 방식을 사용하는 듯 하다.)
이렇게 전체적인 추천시스템의 기본적인 것들을 리뷰했다.
다시 코드 돌려보고 바꿔보는 포스팅을 올릴 계획이다..
피드백은 언제나 환영입니다:)
'개발 > Recommender System' 카테고리의 다른 글
Amazon Reviews를 이용한 추천시스템 실습 - surprise패키지 사용 (0) | 2020.07.29 |
---|---|
추천시스템 Collaborative Filtering - Model based approach (0) | 2020.05.31 |
추천시스템 Collaborative Filtering(CF) Python 기반 [4] (0) | 2020.05.08 |
추천시스템 Collaborative Filtering(CF) Python 기반 [3] (0) | 2020.05.08 |
추천시스템 Collaborative Filtering(CF) Python 기반 [2] (0) | 2020.05.06 |
댓글