وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

استخراج قوانین انجمن از طریق الگوریتم Apriori در پایتون

0 116
زمان لازم برای مطالعه: 9 دقیقه


کاوی قواعد انجمن تکنیکی برای شناسایی روابط اساسی بین آیتم های مختلف است. نمونه ای از سوپر مارکت را در نظر بگیرید که در آن مشتریان می توانند اقلام مختلفی را خریداری کنند. معمولاً در خرید مشتریان الگویی وجود دارد. به عنوان مثال، مادرانی که نوزاد دارند، محصولات کودک مانند شیر و پوشک می خرند. دختران ممکن است اقلام آرایش بخرند در حالی که مجردها ممکن است آبجو و چیپس و غیره بخرند. به طور خلاصه، معاملات شامل یک الگو است. در صورتی که بتوان رابطه بین اقلام خریداری شده در معاملات مختلف را شناسایی کرد، سود بیشتری ایجاد می کند.

به عنوان مثال، اگر اقلام A و B با هم بیشتر خریداری شوند، می توان چندین مرحله را برای افزایش سود برداشت. مثلا:

  1. A و B را می توان در کنار هم قرار داد تا زمانی که مشتری یکی از محصولات را خریداری می کند مجبور نباشد برای خرید کالای دیگر راه دور برود.
  2. افرادی که یکی از محصولات را خریداری می کنند می توانند از طریق یک کمپین تبلیغاتی برای خرید محصول دیگر مورد هدف قرار گیرند.
  3. تخفیف های دسته جمعی می تواند ارائه شود روی این محصولات اگر مشتری هر دوی آنها را بخرد.
  4. هر دو A و B را می توان با هم بسته بندی کرد.

این process شناسایی ارتباط بین محصولات نامیده می شود استخراج قانون انجمن.

الگوریتم Apriori برای قانون کاوی انجمن

الگوریتم‌های آماری مختلفی برای پیاده‌سازی قواعد کاوی ایجاد شده‌اند و Apriori یکی از این الگوریتم‌ها است. در این مقاله به بررسی نظریه پشت آن می پردازیم الگوریتم Apriori و بعداً الگوریتم Apriori را در پایتون پیاده سازی خواهد کرد.

نظریه الگوریتم Apriori

سه جزء اصلی الگوریتم Apriori وجود دارد:

این سه مفهوم را با کمک یک مثال توضیح خواهیم داد.

فرض کنید سابقه 1 هزار تراکنش مشتری داریم و می‌خواهیم پشتیبانی، اطمینان و افزایش دو مورد را پیدا کنیم، مانند همبرگر و سس کچاپ. از یک هزار تراکنش، 100 تراکنش حاوی سس کچاپ و 150 تراکنش حاوی برگر است. از 150 معامله ای که برگر خریداری می شود، 50 تراکنش حاوی سس کچاپ نیز می باشد. با استفاده از این داده‌ها، می‌خواهیم پشتیبانی، اطمینان و افزایش را پیدا کنیم.

حمایت کردن

پشتیبانی به محبوبیت پیش‌فرض یک آیتم اشاره دارد و می‌توان آن را با یافتن تعداد تراکنش‌های حاوی یک آیتم خاص تقسیم بر تعداد کل تراکنش‌ها محاسبه کرد. فرض کنید می خواهیم برای مورد B پشتیبانی پیدا کنیم. این می تواند به صورت زیر محاسبه شود:

Support(B) = (Transactions containing (B))/(Total Transactions)

به عنوان مثال، اگر از 1000 تراکنش، 100 تراکنش حاوی کچاپ باشد، پشتیبانی از مورد کچاپ را می توان به صورت زیر محاسبه کرد:

Support(Ketchup) = (Transactions containingKetchup)/(Total Transactions)

Support(Ketchup) = 100/1000
                 = 10%

اعتماد به نفس

اطمینان به این احتمال اشاره دارد که در صورت خرید کالای A، یک کالای B نیز خریداری شود. می توان آن را با یافتن تعداد تراکنش هایی که A و B با هم خریداری می شوند، تقسیم بر تعداد کل تراکنش هایی که A خریداری می شود، محاسبه کرد. از نظر ریاضی می توان آن را به صورت زیر نشان داد:

Confidence(A→B) = (Transactions containing both (A and B))/(Transactions containing A)

برگردیم به مشکلمان، ما 50 تراکنش داشتیم که برگر و سس کچاپ با هم خریدند. در حالی که در 150 تراکنش همبرگر خریداری می شود. سپس می‌توانیم احتمال خرید سس گوجه‌فرنگی را هنگام خرید همبرگر پیدا کنیم، می‌توان آن را به عنوان اطمینان Burger -> Ketchup نشان داد و می‌تواند به صورت ریاضی به صورت زیر نوشته شود:

Confidence(Burger→Ketchup) = (Transactions containing both (Burger and Ketchup))/(Transactions containing A)

Confidence(Burger→Ketchup) = 50/150
                           = 33.3%

ممکن است متوجه شوید که این مشابه چیزی است که در الگوریتم Naive Bayes مشاهده می کنید، با این حال، این دو الگوریتم برای انواع مختلفی از مشکلات در نظر گرفته شده اند.

بلند کردن

Lift(A -> B) به افزایش نسبت فروش B در هنگام فروش A اشاره دارد. Lift (A –> B) را می توان با تقسیم محاسبه کرد Confidence(A -> B) تقسیم بر Support(B). از نظر ریاضی می توان آن را به صورت زیر نشان داد:

Lift(A→B) = (Confidence (A→B))/(Support (B))

برگردیم به مشکل برگر و سس کچاپ، Lift(Burger -> Ketchup) را می توان به صورت زیر محاسبه کرد:

Lift(Burger→Ketchup) = (Confidence (Burger→Ketchup))/(Support (Ketchup))

Lift(Burger→Ketchup) = 33.3/10
                     = 3.33

Lift اساساً به ما می گوید که احتمال خرید برگر و سس گوجه فرنگی با هم 3.33 برابر بیشتر از احتمال خرید فقط سس کچاپ است. افزایش 1 به این معنی است که هیچ ارتباطی بین محصولات A و B وجود ندارد. افزایش بیشتر از 1 به این معنی است که محصولات A و B با هم خریداری می شوند. در نهایت لیفت کمتر از 1 به حالتی اشاره دارد که بعید است دو محصول با هم خریداری شوند.

مراحل درگیر در الگوریتم Apriori

برای مجموعه‌های بزرگ داده، می‌تواند صدها مورد در صدها هزار تراکنش وجود داشته باشد. الگوریتم Apriori سعی می کند قوانینی را برای هر ترکیب ممکن از آیتم ها استخراج کند. به عنوان مثال، Lift را می توان برای مورد 1 و مورد 2، مورد 1 و مورد 3، مورد 1 و مورد 4 و سپس مورد 2 و مورد 3، مورد 2 و مورد 4 و سپس ترکیبی از موارد به عنوان مثال مورد 1، مورد 2 و مورد 3; به طور مشابه مورد 1، مورد 2، و مورد 4، و غیره روی.

همانطور که از مثال بالا می بینید، این process به دلیل تعداد ترکیبات می تواند بسیار کند باشد. برای سرعت بخشیدن به process، باید مراحل زیر را انجام دهیم:

  1. حداقل مقدار را برای حمایت و اطمینان تعیین کنید. این بدان معنی است که ما فقط علاقه مند به یافتن قوانین برای مواردی هستیم که وجود پیش فرض مشخصی دارند (مثلاً پشتیبانی) و دارای حداقل مقدار برای همزمانی با موارد دیگر (مثلاً اطمینان) هستند.
  2. تمام زیرمجموعه هایی را که ارزش پشتیبانی بالاتر از حداقل آستانه دارند استخراج کنید.
  3. تمام قواعد را از زیر مجموعه هایی با ارزش اطمینان بالاتر از حداقل آستانه انتخاب کنید.
  4. قوانین را با ترتیب نزولی Lift ترتیب دهید.

پیاده سازی الگوریتم Apriori با پایتون

به اندازه کافی تئوری، اکنون زمان آن است که الگوریتم Apriori را در عمل ببینیم. در این بخش از الگوریتم Apriori برای یافتن قوانینی استفاده خواهیم کرد که ارتباط بین محصولات مختلف را با 7500 تراکنش در طول یک هفته در یک فروشگاه خرده‌فروشی فرانسوی توصیف می‌کنند. مجموعه داده ها را می توانید از لینک زیر دانلود کنید:

https://drive.google.com/file/d/1y5DYn0dGoSbC22xowBq2d4po6h1JxcTQ/view؟usp=sharing

نکته جالب دیگر این است که ما نیازی به نوشتن اسکریپت برای محاسبه پشتیبانی، اطمینان و افزایش برای تمام ترکیبات ممکن نداریم. ما از یک کتابخانه خارج از قفسه استفاده خواهیم کرد که در آن همه کدها قبلاً پیاده سازی شده اند.

کتابخانه ای که من به آن اشاره می کنم apyori و منبع را می توان یافت اینجا. به شما پیشنهاد می کنم قبل از ادامه، کتابخانه را در مسیر پیش فرض کتابخانه های پایتون خود دانلود و نصب کنید.

توجه: تمامی اسکریپت های این مقاله با استفاده از آن اجرا شده اند Spyder IDE برای پایتون

برای پیاده سازی الگوریتم Apriori در پایتون مراحل زیر را دنبال کنید:

واردات کتابخانه ها

اولین قدم، مثل همیشه، این است که import کتابخانه های مورد نیاز برای این کار اسکریپت زیر را اجرا کنید:

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

در اسکریپت بالا ما import کتابخانه های پانداها، نومپی، pyplot و apriori.

وارد کردن مجموعه داده

حالا وقته import مجموعه داده و ببینید ما با چه چیزی کار می کنیم. مجموعه داده را دانلود کنید و آن را در پوشه “Datasets” درایو “D” قرار دهید (یا کد زیر را تغییر دهید تا با مسیر فایل مطابقت داشته باشد. روی کامپیوتر شما) و اسکریپت زیر را اجرا کنید:

store_data = pd.read_csv('D:\\Datasets\\store_data.csv')

بیایید تماس بگیریم head() تابع برای دیدن اینکه مجموعه داده چگونه به نظر می رسد:

store_data.head()

پیش نمایش داده ها را با هدر ذخیره کنید

یک قطعه از مجموعه داده در تصویر بالا نشان داده شده است. اگر با دقت به داده ها نگاه کنید، می بینیم که هدر در واقع اولین تراکنش است. هر ردیف مربوط به یک تراکنش و هر ستون مربوط به یک آیتم خریداری شده در آن تراکنش خاص است. این NaN به ما می گوید که مورد نشان داده شده توسط ستون در آن تراکنش خاص خریداری نشده است.

در این مجموعه داده هیچ ردیف هدر وجود ندارد. اما به طور پیش فرض، pd.read_csv تابع ردیف اول را به عنوان هدر در نظر می گیرد. برای رهایی از این مشکل، اضافه کنید header=None گزینه ای به pd.read_csv عملکرد، همانطور که در زیر نشان داده شده است:

store_data = pd.read_csv('D:\\Datasets\\store_data.csv', header=None)

حال اجرا کنید head() تابع:

store_data.head()

در این خروجی به روز شده، خواهید دید که خط اول به جای هدر، اکنون به عنوان یک رکورد در نظر گرفته می شود، همانطور که در زیر نشان داده شده است:

پیش نمایش داده ها را بدون هدر ذخیره کنید

اکنون از الگوریتم Apriori استفاده می کنیم تا بفهمیم کدام اقلام معمولاً با هم فروخته می شوند تا صاحب فروشگاه بتواند اقدام به قرار دادن اقلام مرتبط در کنار هم یا تبلیغ آنها در کنار هم کند تا سود بیشتری داشته باشد.

پردازش داده ها

کتابخانه Apriori که قصد استفاده از آن را داریم، مستلزم این است که مجموعه داده ما به شکل لیستی از لیست ها باشد، که در آن کل مجموعه داده یک لیست بزرگ است و هر تراکنش در مجموعه داده یک لیست داخلی در لیست بزرگ بیرونی است. در حال حاضر ما داده هایی را به شکل یک دیتافریم پاندا داریم. برای تبدیل دیتافریم پانداها به لیستی از لیست ها، اسکریپت زیر را اجرا کنید:

records = ()
for i in range(0, 7501):
    records.append((str(store_data.values(i,j)) for j in range(0, 20)))

اعمال Apriori

مرحله بعدی اعمال الگوریتم Apriori است روی مجموعه داده برای این کار می توانیم از apriori کلاسی که از کتابخانه apyori وارد کردیم.

این apriori کلاس برای کار کردن به مقادیر پارامتری نیاز دارد. اولین پارامتر لیست لیستی است که می خواهید قوانین را از آن استخراج کنید. پارامتر دوم است min_support پارامتر. این پارامتر برای انتخاب مواردی با مقادیر پشتیبانی بیشتر از مقدار مشخص شده توسط پارامتر استفاده می شود. بعد، min_confidence پارامتر آن دسته از قوانینی را فیلتر می کند که اطمینان بیشتری از آستانه اطمینان مشخص شده توسط پارامتر دارند. به طور مشابه، min_lift پارامتر حداقل مقدار افزایش را برای قوانین فهرست شده مشخص می کند. در نهایت، min_length پارامتر حداقل تعداد مواردی را که در قوانین خود می خواهید را مشخص می کند.

فرض کنید که قوانینی را فقط برای مواردی می‌خواهیم که حداقل 5 بار در روز یا 7×5 = 35 بار در یک هفته خریداری می‌شوند، زیرا مجموعه داده ما برای یک دوره زمانی یک هفته‌ای است. پشتیبانی برای آن موارد را می توان به صورت 35/7500 = 0.0045 محاسبه کرد. حداقل اطمینان برای قوانین 20٪ یا 0.2 است. به همین ترتیب، مقدار lift را 3 و در نهایت مشخص می کنیم min_length 2 است زیرا ما حداقل دو محصول را در قوانین خود می خواهیم. این مقادیر عمدتاً به‌طور دلخواه انتخاب می‌شوند، بنابراین می‌توانید با این مقادیر بازی کنید و ببینید چه تفاوتی در قوانینی که دوباره بیرون می‌آورید ایجاد می‌کند.

اسکریپت زیر را اجرا کنید:

association_rules = apriori(records, min_support=0.0045, min_confidence=0.2, min_lift=3, min_length=2)
association_results = list(association_rules)

در خط دوم در اینجا ما قوانین یافت شده توسط the را تبدیل می کنیم apriori کلاس به a list از آنجایی که مشاهده نتایج در این فرم آسان تر است.

مشاهده نتایج

بیایید ابتدا تعداد کل قوانین استخراج شده توسط را پیدا کنیم apriori کلاس اسکریپت زیر را اجرا کنید:

print(len(association_rules))

اسکریپت بالا باید 48 را برگرداند. هر مورد با یک قانون مطابقت دارد.

اجازه دهید print اولین مورد در association_rules لیست کنید تا قانون اول را ببینید. اسکریپت زیر را اجرا کنید:

print(association_rules(0))

خروجی باید به شکل زیر باشد:

RelationRecord(items=frozenset({'light cream', 'chicken'}), support=0.004532728969470737, ordered_statistics(OrderedStatistic(items_base=frozenset({'light cream'}), items_add=frozenset({'chicken'}), confidence=0.29059829059829057, lift=4.84395061728395)))

اولین مورد در لیست، خود فهرستی است که شامل سه مورد است. اولین مورد از لیست اقلام مواد غذایی در قانون را نشان می دهد.

به عنوان مثال از اولین مورد، می بینیم که خامه سبک و مرغ معمولاً با هم خریداری می شوند. این منطقی است زیرا افرادی که خامه سبک می خرند در مورد آنچه می خورند دقت می کنند بنابراین به احتمال زیاد مرغ یعنی گوشت سفید را به جای گوشت قرمز یعنی گوشت گاو خریداری می کنند. یا این می تواند به این معنی باشد که معمولاً از خامه سبک در دستور پخت مرغ استفاده می شود.

مقدار پشتیبانی برای قانون اول 0.0045 است. این عدد از تقسیم تعداد تراکنش های حاوی کرم روشن بر تعداد کل تراکنش ها محاسبه می شود. سطح اطمینان این قانون 0.2905 است که نشان می دهد از کل معاملاتی که حاوی خامه سبک هستند، 29.05 درصد از تراکنش ها نیز شامل مرغ است. در نهایت، بالابر 4.84 به ما می گوید که احتمال خرید مرغ توسط مشتریانی که خامه سبک می خرند در مقایسه با احتمال پیش فرض فروش مرغ، 4.84 برابر بیشتر است.

اسکریپت زیر قاعده، پشتیبانی، اطمینان و افزایش را برای هر قانون به روشی واضح‌تر نشان می‌دهد:

for item in association_rules:

    
    
    pair = item(0) 
    items = (x for x in pair)
    print("Rule: " + items(0) + " -> " + items(1))

    
    print("Support: " + str(item(1)))

    
    

    print("Confidence: " + str(item(2)(0)(2)))
    print("Lift: " + str(item(2)(0)(3)))
    print("=====================================")

اگر اسکریپت بالا را اجرا کنید، تمام قوانین بازگردانده شده توسط the را مشاهده خواهید کرد apriori کلاس چهار قانون اول بازگردانده شده توسط apriori کلاس به این صورت است:

Rule: light cream -> chicken
Support: 0.004532728969470737
Confidence: 0.29059829059829057
Lift: 4.84395061728395
=====================================
Rule: mushroom cream sauce -> escalope
Support: 0.005732568990801126
Confidence: 0.3006993006993007
Lift: 3.790832696715049
=====================================
Rule: escalope -> pasta
Support: 0.005865884548726837
Confidence: 0.3728813559322034
Lift: 4.700811850163794
=====================================
Rule: ground beef -> herb & pepper
Support: 0.015997866951073192
Confidence: 0.3234501347708895
Lift: 3.2919938411349285
=====================================

ما قبلاً در مورد قانون اول بحث کرده ایم. حال اجازه دهید در مورد قانون دوم بحث کنیم. قانون دوم می گوید که سس کرم قارچ و اسکالوپ اغلب خریداری می شود. ساپورت سس خامه قارچ 0.0057 است. اطمینان برای این قانون 0.3006 است که به این معنی است که از کل تراکنش های حاوی قارچ، 30.06٪ از تراکنش ها احتمالاً حاوی اسکالوپ نیز هستند. در نهایت، افزایش 3.79 نشان می دهد که احتمال خرید اسکالوپ توسط مشتریانی که سس خامه قارچ می خرند، در مقایسه با فروش پیش فرض آن، 3.79 بیشتر است.

نتیجه

الگوریتم‌های استخراج قانون انجمن مانند Apriori برای یافتن ارتباط ساده بین داده‌های ما بسیار مفید هستند. پیاده سازی آنها آسان است و قابلیت توضیح بالایی دارند. اما برای بینش های پیشرفته تر، مانند مواردی که توسط گوگل یا آمازون استفاده می شود، الگوریتم های پیچیده تر، مانند سیستم توصیهگر، استفاده می شود. با این حال، احتمالاً می توانید ببینید که این روش یک راه بسیار ساده برای به دست آوردن تداعی های اساسی است، اگر این همه نیازهای مورد استفاده شما باشد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-27 16:09:09

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید