Pythonアプリオリアルゴリズム
このチュートリアルでは、Python でのアプリオリ アルゴリズムの実装について説明します。
アプリオリアルゴリズムの説明
Apriori Algorithm は、マーケット バスケット分析、つまり、どのアイテムが販売され、どのアイテムが他のアイテムであるかを分析するために広く使用されています。 これは、販売されたアイテムを互いに近くに配置したり、割引を提供したりして、売上を増やしたいショップ オーナーにとって便利なアルゴリズムです。
このアルゴリズムは、アイテムセットが頻繁にある場合、すべての空でないサブセットも頻繁でなければならないことを示しています。 この概念を説明するのに役立つ小さな例を見てみましょう。
当店では、牛乳、バター、パンがセットで売られていることが多いとしましょう。 これは、牛乳、バター、および牛乳、パン、およびバター、パンも一緒に販売されることが多いことを意味します。
Apriori Algorithm は、アイテムセットの頻度が空でないサブセットの頻度を超えることは決してないと述べています。 前の例をもう少し拡張することで、これをさらに説明できます。
当店では牛乳・バター・食パンを3回まとめて販売しております。 これは、milk、butter、milk、bread、butter、bread などの空でないサブセットのすべてが、少なくとも 3 回以上一緒に販売されていることを意味します。
Python のアプリオリ アルゴリズム
このアルゴリズムを実装する前に、アプリオリ アルゴリズムがどのように機能するかを理解する必要があります。
アルゴリズムの開始時に、サポートのしきい値を指定します。 サポートのしきい値は、トランザクションでアイテムが発生する確率です。
$$
サポート(A) =(アイテムAを含むトランザクションの数)/(トランザクションの合計数)
$$
サポート以外にも、信頼度やリフトなどの他の測定値がありますが、このチュートリアルではそれらについて心配する必要はありません。
アプリオリ アルゴリズムを実装するために必要な手順を以下に示します。
- 私たちのアルゴリズムは、
1-itemset
から始まります。 ここで、1 はアイテムセット内のアイテムの数を意味します。 - 最小サポート要件を満たさないすべてのアイテムをデータから削除します。
- ここで、アルゴリズムはアイテムセット内のアイテム数 (
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
ジェネレーター オブジェクト内に格納されます。 この rules
を pandas
データフレームに変換するメカニズムが必要です。
次のコード スニペットは、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 オンライン小売データ セット で動作することを意図していたため、この制限も経験しましたが、メモリの制限により、データセットをマーケット バスケットの最適化に変更する必要がありました。
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