신기술 습득/IDEA&Tool&API
연관규칙분석 알고리즘( Apriori VS FP-growth ) 비교 및 사용법
테리베리
2021. 10. 27. 10:35
728x90
반응형
연관규칙분석 알고리즘은 진화를 거듭해서 지금의 개인화 추천 / 협업필터링으로 진화했다.
가장 근간이되는 Apriori 알고리즘과 FP-growth알고리즘에 대해 비교 및 사용법을 적어보겠다.
(본인은 OSP 투자 설계 시스템에 본 방법을 적용한 적이 있다.)
Apriori Algorithm
장점: 원리가 간단하여 이해하거나 의미를 파악하기 쉽다.
유의미한 연관성을 갖는 분야(구매패턴찾기, 동일 설계 추천 등)에 다양한 패턴을 찾아준다.
단점: 데이터가 커질수록 연산할게 많아져 속도가 느려진다.(이를 보완하기 위해 나온 것이 FP-growth algorithm)
너무 많은 연관상품을 나타내준다.
치킨을 먹기 위해 콜라를 산 것인지, 콜라를 먹기 위해 치킨을 산 것인지 구분이 어렵다.
[실행 코드]
import mlxtend
import numpy as np
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
import time
data = np.array([
['우유','기저귀','쥬스'],
['상추','기저귀','맥주'],
['우유','양상추','기저귀','맥주'],
['양상추','맥주']
])
start = time.time()
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
#print(df)
min_support_per = 0.5
min_trust_per =0.5
result = apriori(df,min_support=min_support_per, use_colnames=True)
result_chart = association_rules(result, metric="confidence", min_threshold=min_trust_per)
print(result_chart)
print("time: ", time.time() - start) # 현재시각 - 시작시간 = 실행시간
[결과]
antecedents consequents antecedent support consequent support support confidence lift leverage conviction
0 (맥주) (기저귀) 0.75 0.75 0.5 0.666667 0.888889 -0.0625 0.75
1 (기저귀) (맥주) 0.75 0.75 0.5 0.666667 0.888889 -0.0625 0.75
2 (우유) (기저귀) 0.50 0.75 0.5 1.000000 1.333333 0.1250 inf
3 (기저귀) (우유) 0.75 0.50 0.5 0.666667 1.333333 0.1250 1.50
4 (맥주) (양상추) 0.75 0.50 0.5 0.666667 1.333333 0.1250 1.50
5 (양상추) (맥주) 0.50 0.75 0.5 1.000000 1.333333 0.1250 inf
time: 0.032541751861572266
FP-growth Algorithm
장점: Tree구조를 사용하여 Apriori Algoritm보다 훨씬 빠르며, DB 스캔 횟수도 줄어든다.
단점: 아직까지도 대용량 데이터 셋에서는 메모리를 효율적으로 사용하지 않는다고 본다.
Apriori에 비해 원리이해/설계가 어렵고, 서포트의 계산은 무조건 FP-Tree가 만들어져야 가능하다.
[실행 코드]
import mlxtend
import numpy as np
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import fpgrowth
import time
start = time.time() # 시작 시간 저장
data = np.array([
['우유','기저귀','쥬스'],
['상추','기저귀','맥주'],
['우유','양상추','기저귀','맥주'],
['양상추','맥주']
])
te = TransactionEncoder()
te_ary = te.fit(data).transform(data)
df = pd.DataFrame(te_ary, columns=te.columns_)
#print(df)
min_support_per = 0.5
min_trust_per =0.5
result = fpgrowth(df,min_support=min_support_per, use_colnames=True)
result_chart = association_rules(result, metric="confidence", min_threshold=min_trust_per)
print(result_chart)
print("time: ", time.time() - start) # 현재시각 - 시작시간 = 실행시간
[결과]
antecedents consequents antecedent support consequent support support confidence lift leverage conviction
0 (맥주) (기저귀) 0.75 0.75 0.5 0.666667 0.888889 -0.0625 0.75
1 (기저귀) (맥주) 0.75 0.75 0.5 0.666667 0.888889 -0.0625 0.75
2 (기저귀) (우유) 0.75 0.50 0.5 0.666667 1.333333 0.1250 1.50
3 (우유) (기저귀) 0.50 0.75 0.5 1.000000 1.333333 0.1250 inf
4 (양상추) (맥주) 0.50 0.75 0.5 1.000000 1.333333 0.1250 inf
5 (맥주) (양상추) 0.75 0.50 0.5 0.666667 1.333333 0.1250 1.50
time: 0.028723716735839844
728x90
반응형