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

۱۱۹۴ بازدید
آخرین به‌روزرسانی: ۰۸ خرداد ۱۴۰۲
زمان مطالعه: ۵ دقیقه
الگوریتم بیز ساده در پایتون — راهنمای کاربردی

زمانی که با یک مسئله دسته‌بندی مواجه هستید، یکی از ساده‌ترین روش‌های طبقه‌بندی می‌تواند استفاده از «الگوریتم بیز ساده» (Naive Bayes) باشد. در بیشتر مواقع، زمانی که تعداد متغیرها کم ولی مشاهدات زیاد هستند الگوریتم بیز ساده برای تشخیص دسته‌ها مناسب است. البته مشخص است که اساس و مبنای الگوریتم دسته‌بندی بیز، قضیه بیز است.

به منظور آشنایی با قضیه بیز (Bayes Theorem) بهتر است مطلب قضیه بیز در احتمال شرطی و کاربردهای آن را مطالعه کنید. همچنین در مورد الگوریتم بیز ساده در نوشتار دسته‌ بند بیز ساده (Naive Bayes Classifiers) — مفاهیم اولیه و کاربردها به طور مفصل بحث شده است. البته خواندن احتمال پسین (Posterior Probability) و احتمال پیشین (Prior Probability) — به زبان ساده نیز خالی از لطف نیست.

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

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

اطلاعات اولیه برای وضعیت هوا و شرایط بازی به صورت زیر است.

انجام بازیشرایط آب و هوایی
خیرآفتابی
بلهابری
بلهبارانی
بلهآفتابی
بلهآفتابی
بلهابری
خیربارانی
خیربارانی
بلهافتابی
بلهبارانی
خیرآفتابی
بلهابری
بلهابری
خیربارانی

به نظر می‌رسد بهتر است این اطلاعات را به صورت یک جدول فراوانی دو طرفه (Cross-tab) در آوریم.

وضعیت آب و هواانجام بازی (خیر)انجام بازی (بله)
ابری04
بارانی32
آفتابی23
جمع59

در این صورت می‌توانیم براساس این جدول توزیع احتمالات شرطی و حاشیه‌ای را حساب کنیم.

وضعیت آب و هواانجام بازی (خیر)انجام بازی (بله)نسبت احتمالاحتمال حاشیه‌ای
ابری$$\dfrac{4}{14}$$$$0.29$$
بارانی$$\dfrac{5}{14}$$$$0.36$$
آفتابی$$\dfrac{3}{9}=0.33$$$$\dfrac{5}{14}$$$$0.36$$
کل$$\dfrac{5}{14}$$$$\dfrac{9}{14}$$
$$0.36$$$$0.64$$

قضیه بیز راه حلی برای پیدا کردن احتمال بازی کردن به شرط وضعیت آب و هوایی را به شکل زیر ارائه می‌کند. فرض کنید که وضعیت آب و هوا شامل پیشامدهای $$W_1, W_2,W_3$$ باشد که به ترتیب وضعیت ابری، بارانی و آفتابی را نشان می‌دهند. از طرفی پیشامد انجام بازی را به صورت g نشان می‌دهیم. هدف پیدا کردن احتمال انجام بازی (g) است به شرطی که هوا آفتابی ($$W_3$$) باشد. در نتیجه براساس قضیه بیز خواهیم داشت:

$$\large P(g|W_3)=\dfrac{P(W_3|g)p(g)}{P(W_3)}$$

این احتمال بیانگر «احتمال پسین» (Posterior Probability) است. یعنی پس از مشاهده وضعیت آب و هوا بتوانیم احتمال انجام بازی را پیش‌بینی کنیم. با توجه به جدول بالا، اطلاعات زیر در اختیارمان قرار گرفته است. توجه داشته باشید که «احتمال پیشین» (Prior Probability) در اینجا  برابر با $$0.64$$‌ است.

$$\large P(W_3|g)=\dfrac{3}{9}=0.33$$

$$\large P(W_3)=\dfrac{5}{14}=0.36$$

$$\large P(g)=\dfrac{9}{14}=0.64$$

به این ترتیب برای محاسبه احتمال انجام بازی در هوای آفتابی می‌توانیم براساس رابطه بیز به صورت زیر محاسبات را دنبال کنیم.

$$\large P(g|W_3)=\dfrac{P(W_3|g)p(g)}{P(W_3)}=\dfrac{0.33 \times 0.64}{0.36}=0.60$$

در نتیجه مشخص می‌شود که در بیش از ۶۰٪ اوقات بازی در هوای آفتابی رخ خواهد داد. در ادامه فهرستی از مزایا و معایب الگوریتم بیز ساده ارائه خواهد شد.

مزایا

  • این الگوریتم بسیار ساده است و برای پیش‌بینی گروه یا دسته مناسب برای داده‌ها، سرعت زیادی دارد.
  • از این الگوریتم می‌توان برای پیش‌بینی در بیش از دو دسته یا گروه نیز استفاده کرد.
  • با وجود شرط استقلال پیشامدها، الگوریتم بیز ساده قادر است الگوی بهتری نسبت به دیگر روش‌ها مانند رگرسیون لجستیک ارائه دهد.
  • برای اجرای الگوریتم بیز ساده احتیاجی به حجم نمونه زیاد نیست. در نتیجه برای جوامع کوچک بسیار مناسب است.

معایب

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

حال به پیاده‌سازی این الگوریتم و محاسبات در زبان‌ برنامه‌نویسی پایتون می‌پردازیم.

پیاده‌سازی بیز ساده در پایتون

قبل از هر چیز باید از کتابخانه scikit learn در پایتون استفاده کنیم به این ترتیب دسترسی به بسیاری از توزیع‌های آماری و محاسبات مربوط به آن‌ها فراهم می‌شود. در اینجا با فرض نرمال بودن توزیع متغیرهای پیشگو، از توزیع گوسی (نرمال) استفاده خواهیم کرد.

نکته: اگر متغیر‌های پیشگو به صورت گسسته و شمارشی باشند، از توزیع چندجمله‌ای (Multinomial) استفاده خواهیم کرد. برای مثال به منظور دسته‌بندی متن‌ها از کلمات کلیدی و میزان تکرار آن‌ها استفاده می‌کنیم که دارای توزیع چندجمله‌ای هستند. اگر متغیرهای پیشگو به صورت دو وضعیتی باشند می‌توانیم از توزیع برنولی برای مدل‌بندی استفاده کنیم. برای مثال اگر قرار است در اسناد متنی به دنبال کلمه خاصی بگیردیم این توزیع برای متغیر پیشگو مناسب است.

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

1#Import Library of Gaussian Naive Bayes model
2from sklearn.naive_bayes import GaussianNB
3import numpy as np
4
5#assigning predictor and target variables
6x= np.array([[-3,7],[1,5], [1,2], [-2,0], [2,3], [-4,0], [-1,1], [1,1], [-2,2], [2,7], [-4,1], [-2,7]])
7y = np.array([3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4])
8
9#Create a Gaussian Classifier
10model = GaussianNB()
11
12# Train the model using the training sets 
13model.fit(x, y)
14
15#Predict Output 
16predicted= model.predict([[1,2],[3,4]])
17print predicted

با توجه به داده‌های متغیر آرایه $$x$$ به عنوان پیشگو و متغیر پاسخ (دسته‌ها) $$y$$  نتیجه برای دو مشاهده $$[3,4]$$ و $$[1,2]$$ به ترتیب برابر با 3 و ۴ است. از آنجایی که از کتابخانه sklearn الگوریتم بیز ساده naive.bayes با توزیع گوسی GaussianNB فراخوانی شده است، مدل برای متغیرهای پیشگو نرمال در نظر گرفته شده است. همچنین با اجرای دستور model.fit متغیر $$x$$ و $$y$$ یک مدل خواهند ساخت. اگر لازم است می‌توانید از کد که به زبان $$R$$ نوشته شده است برای اجرای الگوریتم بیز ساده استفاده کنید. البته باید فایل اطلاعاتی مربوط به داده‌های آموزشی و آزمایشی را مشخص کنید. در اینجا از بسته e1071 استفاده شده است.

1require(e1071) #Holds the Naive Bayes Classifier
2Train <- read.csv(file.choose())
3Test <- read.csv(file.choose())
4
5#Make sure the target variable is of a two-class classification problem only
6
7levels(Train$Item_Fat_Content)
8
9model <- naiveBayes(Item_Fat_Content~., data = Train)
10class(model) 
11pred <- predict(model,Test)
12table(pred)

کاربردهای الگوریتم بیز ساده

در ادامه به بعضی از کاربردهای الگوریتم بیز ساده می‌پردازیم. البته ممکن است کاربردهای بیشتری نیز برای این الگوریتم وجود داشته باشد ولی در حالت کلی این فهرست به نظر کامل می‌رسد.

  • پیش‌بینی بلادرنگ (Real Time Prediction): با توجه به سرعت بالای این الگوریتم، و علاقمندی این الگوریتم به یادگیری، برای حل مسائلی که احتیاج به پاسخ سریع و به موقع دارند، به کار می‌رود.
  • دسته‌بندی متن/ تشخیص هرزنامه‌ها: از دسته‌بندی بیز ساده در دسته‌بندی اسناد و متون با موضوعات مختلف استفاده می‌شود. همچنین بسیاری از شرکت‌ها برای تشخیص هرزنامه‌ها در پست الکترونیکی از این الگوریتم بهره می‌برند. در حقیقت توزیع آماری برای هر یک از متغیر پیشگو در این جا چندجمله‌ای (Multinomial) است.
  • سیستم‌های توصیه‌گر: یکی دیگر از کاربردهای الگوریتم بیز ساده، بخصوص در یادگیری ماشین و داده‌کاوی، سیستم‌های توصیه‌گر است که به کمک آن می‌توان با توجه به نظرات و عملکرد قبلی، انتخاب‌های آتی یک مشتری را پیش‌بینی و به او پیشنهاد کرد.

جمع‌بندی

در این نوشتار به بررسی یکی از محبوب‌ترین الگوریتم‌های یادگیری ماشین (Machine Learning) یعنی «دسته‌بند بیز ساده» (Naive Bayes Classifier) پرداختیم. هر چند این الگوریتم براساس احتمال شرطی و قضیه بیز بنا شده است ولی بسیار موثر و کاربردی است و پیاده‌سازی آن در زبان‌های برنامه‌نویسی نیز ساده است.

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شود:

^^

بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
۳ دیدگاه برای «الگوریتم بیز ساده در پایتون — راهنمای کاربردی»

فکر کنم این تنیجه گیری غلطه ==>‌

فکر کنم این میشه ==>

وقتی هوا آفتابی باشه ( w3 ) ۶۰ درصد بازی ها انجام میشه ( بله (۱)(TRUE) )

با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

این مورد بررسی شد، مشکلی در نتیجه‌گیری وجود ندارد. اینکه بگوییم «در بیش از ۶۰٪ اوقات بازی در هوای آفتابی رخ خواهد داد» با اینکه بگوییم «احتمال انجام شدن بازی در صورت آفتابی بودن هوا ۶۰ درصد است» هیچ تفاوتی ندارد.

برای شما آرزوی سلامتی و موفقیت داریم.

با سلام خدمت دکتر ری بد . دکتر بنده یک سوالی داشتم ولی هر چی تلاش کردم تا ایمیل شما را پیدا نمایم متاسفانه موفق نشدم . امکانش هست ایمیل شما را برای ارتباط داشته باشم . ممنون

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *