신기술 습득/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
반응형