추천시스템
정의: 사용자에게 상품을 제안하는 소프트웨어 도구이자 기술
정의: 룰기반의 모델로서 상품과 상품 사이에 어떤 연관이 있는지 찾아내는 알고리즘
연관이란?
1. 얼마나 같이 구매 되는가?
2. A아이템을 구매하는 사람이 B아이템을 구매하는가? (규칙)
EX) 월마트에서 맥주 구매시 기저귀 함께 구매하는 경향이 큼을 발견 -> 함께 진열하는 전략
규칙평가지표
support(지지도)
lift(향상도)
confidence(신뢰도)
문제점
아이템의 증가에 따른 규칙의 수의 기하급수적 증가
-> Apriori 알고리즘이 해결!
아이템셋의 증가를 줄이기 위한 방법.
빈번한 아이템 셋은 하위 아이템셋 또한 빈번할 것이다
=빈번하지 않은 아이템셋은 하위 아이템셋 또한 빈번하지 않다
진행 과정
1. k개의 item 가지고 단일항목집단 생성
2. 단일항목집단에서 최소 지지도(support) 이상의 항목만 선택 - 알고리즘 만드는 사람이 지정
3. 2에서 선택된 항목만을 대상으로 2개 항목집단 생성
4. 2개 항목 집단에서 최소 지지도 혹은 신뢰도 이상의 항목만 선택
5. 위 과정을 k개의 k-item frequent set을 생성할 때까지 반복
장점
원리가 간단하여 사용자가 쉽게 이해할 수 있고 의미 파악 가능
유의한 연관성 갖는 구매패턴 찾아줌
단점
데이터가 클 경우(=item 많을 경우)에 속도 느리고 연산량 많음
실제 사용시 연관상품들이 많다는 단점
인과관계에 대한 판단이 어려움
-> 속도 측면의 단점의 문제 -> FP-Growth로 극복!
Apriori와 비슷한 성능 내지만 FP Tree 구조 사용해서 속도 개선한 장점
동일하게 발생하는 아이템셋 발견에 좋으나 아이템 간 연관성 발견의 어려움
과정
1. 모든 거래 확인하여, 각 아이템마다 지지도(support) 계산하고 최소 지지도 이상의 아이템만 선택
2. 모든 거래에서 빈도가 높은 아이템 순서대로 순서 정렬
3. 부모 노드를 중심으로 거래를 자식 노드로 추가하면서 tree 생성
4. 새로운 아이템이 나올 경우에는 부모 노드부터 시작하고, 그렇지 않으면 기존의 노드에서 확장
5. 위의 과정을 모든 거래에 대해 반복하여 FP Tree를 만들고 최소 지지도 이상의 패턴만을 추출
장점
Apriori 알고리즘보다 빠르고 2번의 탐색만 필요
후보 item sets 생성 필요 없이 진행 가능
단점
대용량 데이터셋에서 메모리 효율적 사용 안함
Apriori 알고리즘에 비해 설계 어려움
지지도 계산이 FP-Tree 만들어지고 나서야 가능
import mlxtend
import numpy as np
import pandas as pd
data = np.array([
['우유', '기저귀', '쥬스'],
['양상추', '기저귀', '맥주'],
['우유', '양상추', '기저귀', '맥주'],
['양상추', '맥주']
])
#apriori 알고리즘
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
df
%%time
from mlxtend.frequent_patterns import apriori
apriori(df, min_support=0.5, use_colnames=True)
#FP-Growth 알고리즘
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
df
%%time
from mlxtend.frequent_patterns import fpgrowth
fpgrowth(df, min_support=0.5, use_colnames=True)