사용자: 서비스를 사용하는 사람
아이템: 서비스에서 판매하는 물품
-> 보통 서비스가 성장하면 사용자/아이템의 수도 같이 성장함
-> 하지만 아이템 수가 커지면서 아이템 디스커버리 문제가 대두됨
추천 엔진의 정의
추천 엔진이 필요한 이유
추천은 결국 매칭 문제
=> 위 추천 엔진들의 공통점
컨텐츠 기반 (아이템 기반)
: 개인화된 추천이 아니며 비슷한 아이템을 기반으로 추천이 이뤄짐
: 아이템 간의 유사도를 측정하여 추천
: 구현이 상대적으로 간단함
협업 필터링(평점 기준)
: 기본적으로 다른 사용자들의 정보를 이용하여 내 취향을 예측하는 방식
: 크게 사용자 기반과 아이템 기반 두 종류가 존재
-> 사용자 기반: 나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천
-> 아이템 기반: 평점의 패턴이 비슷한 아이템들을 찾아서 그걸 추천하는 방식
사용자 행동 기반
: 아이템 클릭 혹은 구매 혹은 소비 등의 정보를 기반으로 한 추천
: 모델링을 통해 사용자와 아이템 페어에 대한 클릭 확률 등의 점수 계산이 가능
: 크게 두 종류가 존재(1. 사용자 행동 기반 간단한 추천 유닛 구성 / 2. 사용자 행동을 예측하는 추천(클릭 혹은 구매) )
많은 경우 위의 알고리즘들을 하이브리드 형태로 사용
협업 필터링
사용자 기반 협업 필터링: 나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천
아이템 기반 협업 필터링: 아이템들간의 유사도를 비교하는 것으로 시작 / 사용자 기반 협업 필터링과 비교해 더 안정적이며 좋은 성능을 보인다.(아이템의 수가 보통 작기에 사용자에 비해 평점의 수가 평균적으로 더 많고 계산량이 작음)
유사도 측정 방법: 두 개의 비교대상을 N차원 좌표로 표현 / 보통 코사인 유사도 혹은 피어슨 유사도 사용
협업 필터링 문제점
협업 필터링 구현 방법
지도학습 방식의 추천 엔진
앙상블과 랜덤 포레스트
추천엔진의 발전 역사
다양한 행동 기반 추천
기본 아이디어
- 하이브리드 방식 추천: 협업 필터링, 사용자 행동 기반 추천, 머신러닝 모델기반 추천
- 사용자별로 등록 확률을 기준으로 2천개의 탑 강의 목록 생성(배치로 시작했다가 실시간 계산으로 변경)
- 홈페이지에서의 추천은 조금 더 복잡(개인화되어 있음 / 유닛 후보 생성, 유닛 후보 랭킹)
- 특정 강의 세부 페이지에서 추천은 아이템 중심
1. student also bought(아이템 기반 협업 필터링)
2. Frequently bought together(별도의 co-occurrence 행렬 계산)
3. 각 유닛에서의 강의 랭킹은 개인별 등록 확률로 결정
다양한 유사도 측정 알고리즘
: 벡터들 간의 유사도를 판단하는 방법
: 추천 알고리즘에서는, 두 점 사이의 거리를 계산하는 것 보다는 두 벡터의 방향성을 보는 것이 더 좋음
코사인 유사도: N차원 공간에 있는 두 개의 벡터간의 각도(원점에서)를 보고 유사도를 판단하는 기준
-> from sklearn.metrics.pairwise import cosine_similarity
(코사인 유사도)
피어슨 유사도: 먼저 벡터 A와 B의 값들을 보정, 그 이후 계산은 코사인 유사도와 동일. 이를 중앙 코사인 유사도 혹은 보정된 코사인 유사도라 부르기도 함
텍스트를 행령(벡터)로 표현하는 방법
: 텍스트 문서를 행렬로 표현하는 방법은 여러가지가 존재
1. 원핫 인코딩 + Bag of Words (카운트): 단어의 수를 카운트 해서 표현
- 먼저 stopword를 제외 ( the, is, in, we, can, see)
- 그 뒤 단어수 계산 -> 총 5개 sky, blue, sun, bright, shining
- 단어별로 차원을 배정: sky(1), blue(2), sun(3), bright(4), shining(5)
- CountVectorizer: Bag of Words 카운팅 방식을 구현한 모듈. 벡터로 표현이 되면 문서들간의 유사도 측정이 가능.
-> from sklearn.feature_extraction.text import CountVectorizer
2. 원핫 인코딩 + Bag of Words (TF-IDF): 단어의 값을 TF-IDF 알고리즘으로 계산된 값으로 표현
- TF-IDF
:위의 카운트 방식은 자주 나오는 단어가 높은 가중치를 갖게 된다.
: TF-IDF의 기본적인 아이디어 -> 한 문서에서 중요한 단어를 카운트가 아닌 '문서군 전체'를 보고 판단하자
: 어떤 단어가 한 문서에서 자주 나오면 중요하지만 이 단어가 다른 문서들에서는 자주 나오지 않는다면 더 중요
- 카운트 기반 Bag of Words랑 동일한데, 카운트 대신에 TF-IDF 점수를 사용(TF-IDF = TF(t,d)*IDF(t))
-> TF(t,d): 단어 t의 문서 d에서 카운트
-> IDF(t): 역문서 비율. 단어 t가 전체 문서들 중(총 N개) 몇 개의 문서에서 나타났는지 비율을 역으로 한 값)
-> DF는 단어가 나온 문서의 수를 말한다.
- TfIdfVectorizer: 문서를 벡터로 바꾸는 방법. CountVectorizer와 사용법이 거의 같다.
->from sklearn.feature_extraction.text import TfidfVectorizer
-> 기본적으로 L2 normalization 을 함.
+ L2 normalization: 벡터를 단위 벡터로 만듦(길이가 1인 벡터로 만드는 것)
+ L1 normalization과 L2 normalization의 차이는?
기본적으로 다른 사용자들의 정보를 이용하여 내 취향을 예측하는 방식
크게 세 종류가 존재
1. 사용자 기반(나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천)
2. 아이템 기반(평점의 패턴이 비슷한 아이템들을 찾아서 그걸 추천하는 방식)
3. 예측 모델 기반(평점을 예측하는 머신러닝 모델을 만드는 것)
구현하는 방식에는 크게 두 종류가 존재
1. 메모리 기반
사용자의 유사도 측정
아이템의 유사도 측정
=> 협업 필터링에는 사용자 기반과 아이템 기반으로 유사도를 바탕으로 추천을 하는 메모리 방식과, 평점을 예측하여 추천하는 모델 방식이 존재한다.
=> Surprise 라이브러리를 사용하여 사용자 기반과 아이템 기반 협업 필터링을 구현한다!!!