git : choco9966/T-academy-Recommendation의 내용을 정리한 것입니다.
추천시스템 목표 : 어떤 사용자(user)에게 어떤 상품(item)을 어떻게 추천할 것인가
추천시스템은 아래와 같이 발전해왔다.
연관상품 추천, Apriori 알고리즘
협업 필터링 : SVD
Spark를 이용한 빅데이터 : FP-Growth, Matrix Factorization
딥러닝을 이용한 추천시스템 : 협업필터링 + 딥러닝, Item2Vec, Doc2Vec, YouTube Recommendation, Wide & Deep Model
개인화 추천시스템 : Factorization Machine, Hierarchical RNN, 강화학습 + Re-Ranking, 딥러닝
위의 발전 순서 중 과거의 추천시스템을 정리해보려한다.
상품과 상품사이에 어떤 연관이 있는지 Rule(알고리즘)을 찾기
평가 지표
1. Support ( 지지도 ) : A -> B일 때, support(A) = P(A)
2. lift ( 향상도 )
3. confidence ( 신뢰도 )
규칙 생성
가능한 모든 경우의 수를 탐색해서 지지도, 신뢰도, 향상도가 높은 규칙들을 찾아내는 방식
상품이 4개일 때, 전체 경우의 수는
4C1 + 4C2 + 4C3 + 4C4 = 4 + 6 + 4 + 1 = 15
단점
연관분석에서 item set의 증가를 줄이기 위한 방법으로 빈번하지 않은 itemset을 삭제하여 Rule의 수를 줄인다.
장점
아래의 가정에 기반한다.
빈번한 itemset은 하위 itemset 또한 빈번할 것이다.
빈번하지 않은 itemset은 하위 itemset 또한 빈번하지 않다.
support({2, 3}) > support({0,2,3}), support({1,2,3})
알고리즘 (방법)
1. K개의 item을 가지고 단일항목집단 생성(one-item frequent set)
2. 단일항목집단에서 설정된 성능(support, lift, confidence 중 1가지 이상)의 최소값 이상의 항목만 선택
3. 2에서 선택된 항목만을 대상으로 2개항목집단 생성
4. 2개항목집단에서 최소 성능값 이상의 항목만 선택
5. 위의 과정을 k개의 k-item frequent set을 생성할 때까지 반복
예시(5 item)
P(우유) : 0.5
P(양상추) : 0.75
P(기저귀) : 0.75
P(쥬스) : 0.25
P(맥주) : 0.75
P({우유, 양상추}) : 0.25
P({우유, 기저귀}) : 0.5
P({우유, 맥주}) : 0.25
P({양상추, 기저귀}) : 0.5
P({양상추, 맥주}) : 0.75
P({기저귀, 맥주}) : 0.5
P({양상추, 기저귀, 맥주}) : 0.5
P({우유, 기저귀,맥주}) : 불가능. 제거된 항목에 있다.
단점
import mlxtend
import numpy as np
from mlxtend.preprocessing import TransactionEncoder
data = np.array([
['우유', '기저귀', '쥬스'],
['양상추', '기저귀', '맥주'],
['우유', '양상추', '기저귀', '맥주'],
['양상추', '맥주']
])
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
%%time
from mlxtend.frequent_patterns import apriori
apriori(df, min_support=0.5, use_colnames=True)
장점
알고리즘 (방법)
예시(5 item)
1. 모든 거래를 확인 : 우유, 양상추, 기저귀, 쥬스, 맥주 (5가지)
2. 최소 지지도(support)가 0.5일 때, 최소 지지도 이상의 항목만 선택, 정렬
P(우유)=0.5, P(양상추)=0.75, P(기저귀)=0.75, ~~P(쥬스)=0.25~~, P(맥주)=0.75
0 : 우유, 기저귀,
쥬스=> 기저귀, 우유
1 : 양상추, 기저귀, 맥주 => 양상추, 기저귀, 맥주
2 : 우유, 양상추, 기저귀, 맥주 => 양상추, 기저귀, 맥주, 우유
3 : 양상추, 맥주 => 양상추, 맥주
0번거래 추가(기저귀, 우유)
1번거래 추가(양상추, 기저귀, 맥주) : 새로운 item
2번거래 추가(양상추, 기저귀, 맥주, 우유) : 기존 노드에서 확장
3번거래 추가(양상추, 맥주) : 기존 노드에서 확장
단점
import mlxtend
import numpy as np
from mlxtend.preprocessing import TransactionEncoder
data = np.array([
['우유', '기저귀', '쥬스'],
['양상추', '기저귀', '맥주'],
['우유', '양상추', '기저귀', '맥주'],
['양상추', '맥주']
])
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
# 여기부터 다르다.
%%time
from mlxtend.frequent_patterns import fpgrowth
fpgrowth(df, min_support=0.5, use_colnames=True)
과거에 사용된 추천시스템 알고리즘인 연관상품 추천, Apriori 알고리즘, FP-Growth의 알고리즘을 보았다.
다음에는 컨텐츠 기반 추천 모델 개념을 볼 것이다.(역시나 위의 git을 참조해서)