파이썬 Apriori 알고리즘

Muhammad Maisam Abbas 2023년6월21일
  1. Apriori 알고리즘의 설명
  2. Python의 Apriori 알고리즘
  3. Python에서 토폴로지 정렬 알고리즘 구현
파이썬 Apriori 알고리즘

이 튜토리얼은 Python에서 apriori 알고리즘의 구현에 대해 설명합니다.

Apriori 알고리즘의 설명

Apriori 알고리즘은 시장 바구니 분석, 즉 판매되는 품목과 기타 품목을 분석하는 데 널리 사용됩니다. 함께 판매되는 상품을 서로 가깝게 배치하거나 할인을 제공하여 매출을 늘리려는 상점 소유자에게 유용한 알고리즘입니다.

이 알고리즘은 항목 집합이 자주 발생하면 비어 있지 않은 모든 하위 집합도 자주 발생해야 한다고 명시합니다. 이 개념을 설명하는 데 도움이 되는 작은 예를 살펴보겠습니다.

우리 가게에서 우유, 버터, 빵이 함께 판매되는 경우가 많다고 가정해 봅시다. 이는 우유, 버터, 우유, 빵, 버터, 빵도 함께 판매되는 경우가 많다는 것을 의미한다.

Apriori 알고리즘은 또한 항목 집합의 빈도가 비어 있지 않은 하위 집합의 빈도를 초과할 수 없다고 명시합니다. 이전 예제에서 조금 더 확장하여 이를 더 자세히 설명할 수 있습니다.

저희 매장에서는 우유, 버터, 빵을 3번 같이 판매합니다. 이는 우유, 버터, 우유, 빵, 버터, 빵과 같이 비어 있지 않은 하위 집합이 모두 함께 최소 3번 이상 판매됨을 의미합니다.

Python의 Apriori 알고리즘

이 알고리즘을 구현하기 전에 선험적 알고리즘이 어떻게 작동하는지 이해해야 합니다.

알고리즘 시작 시 지원 임계값을 지정합니다. 지원 임계값은 트랜잭션에서 항목이 발생할 확률입니다.

$$
지원(A) =(항목 A를 포함하는 거래 수) / (총 거래 수)
$$

지원 외에도 신뢰도 및 리프트와 같은 다른 측정값이 있지만 이 자습서에서는 걱정할 필요가 없습니다.

선험적 알고리즘을 구현하기 위해 따라야 할 단계는 다음과 같습니다.

  1. 알고리즘은 1-itemset으로 시작합니다. 여기서 1은 항목 집합의 항목 수를 의미합니다.
  2. 최소 지원 요구 사항을 충족하지 않는 데이터에서 모든 항목을 제거합니다.
  3. 이제 알고리즘은 항목 집합의 항목(k) 수를 늘리고 지정된 k에 도달하거나 최소 지원 요구 사항을 충족하는 항목 집합이 없을 때까지 1단계와 2단계를 반복합니다.

Python에서 토폴로지 정렬 알고리즘 구현

Apriori 알고리즘을 구현하기 위해 Python의 apyori 모듈을 사용합니다. 외부 모듈이므로 별도로 설치해야 합니다.

apyori 모듈을 설치하기 위한 pip 명령은 다음과 같습니다.

pip install apyori

Kaggle의 Market Basket Optimization dataset을 사용할 것입니다.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from apyori import apriori

위에 주어진 코드에서 작업에 필요한 모든 라이브러리를 가져왔습니다. 이제 pandas를 사용하여 데이터 세트를 읽어야 합니다.

이는 다음 코드 스니펫에서 구현되었습니다.

market_data = pd.read_csv("Market_Basket_Optimisation.csv", header=None)

이제 데이터 세트의 총 트랜잭션 수를 확인하겠습니다.

len(market_data)

출력:

7501

출력은 데이터 세트에 7501개의 레코드가 있음을 보여줍니다. 이 데이터에는 두 가지 작은 문제가 있습니다. 이러한 트랜잭션은 가변 길이입니다.

실제 시나리오를 감안할 때 이것은 많은 의미가 있습니다.

선험적 알고리즘을 수행하려면 이러한 임의 트랜잭션을 동일한 길이의 트랜잭션으로 변환해야 합니다. 이는 다음 코드 스니펫에서 구현되었습니다.

transacts = []
for i in range(0, len(market_data)):
    transacts.append([str(market_data.values[i, j]) for j in range(0, 20)])

위의 코드에서 우리는 transacts 목록을 초기화하고 길이 20의 거래를 저장했습니다. 여기서 문제는 항목이 20개 미만인 트랜잭션에 null 값을 삽입한다는 것입니다.

그러나 apriori 모듈이 null 값을 자동으로 처리하기 때문에 걱정할 필요가 없습니다.

이제 apriori 클래스 생성자를 사용하여 데이터에서 연관 규칙을 생성합니다. 이것은 다음 코드 블록에서 설명됩니다.

rules = apriori(
    transactions=transacts,
    min_support=0.003,
    min_confidence=0.2,
    min_lift=3,
    min_length=2,
    max_length=2,
)

생성자의 최소 지원, 신뢰도 및 리프트 임계값에 대한 임계값을 지정했습니다. 또한 항목 집합의 최소 항목 수와 최대 항목 수를 2로 지정했습니다. 즉, 자주 함께 판매되는 항목 쌍을 생성하려고 합니다.

선험적 알고리즘의 연관 규칙은 rules 생성기 객체 내에 저장됩니다. 이제 이 규칙판다 데이터 프레임으로 변환하는 메커니즘이 필요합니다.

다음 코드 스니펫은 apriori() 생성자가 반환한 생성기 개체 rules를 가져와 이를 pandas 데이터 프레임으로 변환하는 inspect() 함수를 보여줍니다.

def inspect(output):
    Left_Hand_Side = [tuple(result[2][0][0])[0] for result in output]
    support = [result[1] for result in output]
    confidence = [result[2][0][2] for result in output]
    lift = [result[2][0][3] for result in output]
    Right_Hand_Side = [tuple(result[2][0][1])[0] for result in output]
    return list(zip(Left_Hand_Side, support, confidence, lift, Right_Hand_Side))


output = list(rules)
output_data = pd.DataFrame(
    inspect(output),
    columns=["Left_Hand_Side", "Support", "Confidence", "Lift", "Right_Hand_Side"],
)
print(output_data)

출력:

         Left_Hand_Side   Support  Confidence      Lift Right_Hand_Side
0           light cream  0.004533    0.290598  4.843951         chicken
1  mushroom cream sauce  0.005733    0.300699  3.790833        escalope
2                 pasta  0.005866    0.372881  4.700812        escalope
3         fromage blanc  0.003333    0.245098  5.164271           honey
4         herb & pepper  0.015998    0.323450  3.291994     ground beef
5          tomato sauce  0.005333    0.377358  3.840659     ground beef
6           light cream  0.003200    0.205128  3.114710       olive oil
7     whole wheat pasta  0.007999    0.271493  4.122410       olive oil
8                 pasta  0.005066    0.322034  4.506672          shrimp

이제 이 데이터 프레임을 지원 수준별로 정렬하고 다음 코드를 사용하여 데이터 세트의 상위 5개 레코드를 표시할 수 있습니다.

print(output_data.nlargest(n=5, columns="Lift"))

출력:

      Left_Hand_Side   Support  Confidence      Lift Right_Hand_Side
3      fromage blanc  0.003333    0.245098  5.164271           honey
0        light cream  0.004533    0.290598  4.843951         chicken
2              pasta  0.005866    0.372881  4.700812        escalope
8              pasta  0.005066    0.322034  4.506672          shrimp
7  whole wheat pasta  0.007999    0.271493  4.122410       olive oil

Apriori는 시장 바구니 분석을 위한 매우 기본적이고 간단한 알고리즘입니다. 시장이나 상점에서 상품 판매를 늘리는 데 도움이 되는 내부 정보를 제공할 수 있습니다.

이 알고리즘의 유일한 단점은 큰 데이터 세트에 대해 많은 메모리를 사용한다는 것입니다. 빈번한 항목의 조합을 많이 생성하기 때문입니다.

또한 이 튜토리얼은 UCI 온라인 소매 데이터 세트와 함께 작동하도록 의도되었기 때문에 이러한 제한을 경험했지만 메모리 제한으로 인해 데이터 세트를 장바구니 최적화로 변경해야 했습니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn