Pythonアプリオリアルゴリズム

Muhammad Maisam Abbas 2023年6月21日
  1. アプリオリアルゴリズムの説明
  2. Python のアプリオリ アルゴリズム
  3. Python でトポロジカル ソート アルゴリズムを実装する
Pythonアプリオリアルゴリズム

このチュートリアルでは、Python でのアプリオリ アルゴリズムの実装について説明します。

アプリオリアルゴリズムの説明

Apriori Algorithm は、マーケット バスケット分析、つまり、どのアイテムが販売され、どのアイテムが他のアイテムであるかを分析するために広く使用されています。 これは、販売されたアイテムを互いに近くに配置したり、割引を提供したりして、売上を増やしたいショップ オーナーにとって便利なアルゴリズムです。

このアルゴリズムは、アイテムセットが頻繁にある場合、すべての空でないサブセットも頻繁でなければならないことを示しています。 この概念を説明するのに役立つ小さな例を見てみましょう。

当店では、牛乳、バター、パンがセットで売られていることが多いとしましょう。 これは、牛乳、バター、および牛乳、パン、およびバター、パンも一緒に販売されることが多いことを意味します。

Apriori Algorithm は、アイテムセットの頻度が空でないサブセットの頻度を超えることは決してないと述べています。 前の例をもう少し拡張することで、これをさらに説明できます。

当店では牛乳・バター・食パンを3回まとめて販売しております。 これは、milk、butter、milk、bread、butter、bread などの空でないサブセットのすべてが、少なくとも 3 回以上一緒に販売されていることを意味します。

Python のアプリオリ アルゴリズム

このアルゴリズムを実装する前に、アプリオリ アルゴリズムがどのように機能するかを理解する必要があります。

アルゴリズムの開始時に、サポートのしきい値を指定します。 サポートのしきい値は、トランザクションでアイテムが発生する確率です。

$$
サポート(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 レコードがあることを示しています。 このデータには 2つの小さな問題があります。 これらのトランザクションは可変長です。

現実世界のシナリオを考えると、これは非常に理にかなっています。

アプリオリ アルゴリズムを実行するには、これらの任意のトランザクションを等長のトランザクションに変換する必要があります。 これは、次のコード スニペットで実装されています。

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 ジェネレーター オブジェクト内に格納されます。 この rulespandas データフレームに変換するメカニズムが必要です。

次のコード スニペットは、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