نظریه بیز که یک مفهوم کلیدی در نظریه احتمال است، پایه و اساس طبقهبند کردن احتمالی موسوم به بیز ساده (Naive Bayes) را فراهم میکند. این الگوریتم ساده اما قدرتمند به دلیل درک آسان، سادگی و سهولت پیادهسازیاش، محبوبیت زیادی پیدا کرده است. الگوریتم بیز ساده یک روش محبوب برای کاربردهای طبقهبندی، بهخصوص فیلتر کردن اسپم و طبقهبندی متن است. در این مقاله، ما در مورد نحوه پیادهسازی بیز ساده با پایتون یاد خواهیم گرفت.
بیز ساده چیست؟
بیز ساده خانوادهای از الگوریتم های یادگیری ماشین احتمالی است که بر اساس نظریه بیز و با فرض استقلال ویژگیها از یکدیگر بنا شده است. طبقهبند بیز ساده فرض میکند که وجود یک ویژگی در یک کلاس به هیچ ویژگی دیگری مرتبط نیست. بیز ساده یک الگوریتم طبقهبندی برای مسائل طبقهبندی دوتایی و چند کلاسی است.
قضیه بیز ساده
– بر اساس دانش قبلی از شرایطی که ممکن است با یک رویداد مرتبط باشند، قضیه بیز احتمال وقوع آن رویداد را توصیف میکند.
– احتمال شرطی به این شکل میتواند یافت شود.
– فرض کنید ما یک فرضیه (H) و شواهد (E) داریم، بر اساس قضیه بیز، رابطه بین احتمال فرضیه قبل از به دست آوردن شواهد که به صورت P(H) نمایش داده میشود و احتمال فرضیه پس از به دست آوردن شواهد که به صورت P(H|E) نمایش داده میشود، به این شکل است:
P(H|E) = P(E|H)*P(H)/P(E)
– احتمال قبلی = P(H) احتمال قبل از به دست آوردن شواهد است
احتمال بعدی = P(H|E) احتمال پس از به دست آوردن شواهد است
– به طور کلی،
P(class|data) = (P(data|class) * P(class)) / P(data)
مثال قضیه بیز ساده
فرض کنید ما میخواهیم احتمال اینکه یک کارت به طور تصادفی انتخاب شده، پادشاه (king) باشد، به شرط اینکه یک کارت رو باشد را پیدا کنیم.
در یک دسته کارت، ۴ پادشاه وجود دارد که نشان میدهد:
P(King) = 4/52
از آنجایی که تمام پادشاهها کارتهای رو (face) هستند، پس:
P(Face|King) = 1
در هر دسته از ۱۳ کارت، ۳ کارت رو وجود دارد و در مجموع ۴ دسته کارت هست، پس:
P(Face) = 12/52
بنابراین،
P(King|face) = P(face|king)*P(king)/P(face) = 1/3
پیادهسازی بیز ساده با پایتون
در اینجا ما در حال پیادهسازی یک الگوریتم بیز ساده با استفاده از توزیعهای گاوسی هستیم. این پیادهسازی تمامی مراحل لازم از آمادهسازی دادهها و آموزش مدل گرفته تا آزمایش و ارزیابی را انجام میدهد.
وارد کردن کتابخانهها
math: برای عملیات ریاضی
random: برای تولید اعداد تصادفی
pandas: برای دستکاری دادهها
numpy: برای محاسبات علمی
import math import random import pandas as pd import numpy as np
تبدیل کلاس
تابع `encode_class` برچسبهای کلاس در دیتاست را به مقادیر عددی تبدیل میکند. این تابع به هر کلاس یک شناسه عددی منحصر به فرد اختصاص میدهد.
def encode_class(mydata): classes = [] for i in range(len(mydata)): if mydata[i][-1] not in classes: classes.append(mydata[i][-1]) for i in range(len(classes)): for j in range(len(mydata)): if mydata[j][-1] == classes[i]: mydata[j][-1] = i return mydata
تقسیم دادهها
تابع تقسیم کردن برای جدا کردن دیتاست به مجموعههای آموزشی و آزمایشی بر اساس نسبت داده شده استفاده میشود.
def splitting(mydata, ratio): train_num = int(len(mydata) * ratio) train = [] test = list(mydata) while len(train) < train_num: index = random.randrange(len(test)) train.append(test.pop(index)) return train, test
گروهبندی دادهها بر اساس کلاس
تابع `groupUnderClass` دادهها را میگیرد و یک دیکشنری برمیگرداند که در آن هر کلید یک برچسب کلاس است و مقدار آن فهرستی از نقاط دادهای است که به آن کلاس تعلق دارند.
def groupUnderClass(mydata): data_dict = {} for i in range(len(mydata)): if mydata[i][-1] not in data_dict: data_dict[mydata[i][-1]] = [] data_dict[mydata[i][-1]].append(mydata[i]) return data_dict
محاسبه میانگین و انحراف معیار برای کلاس
تابع `MeanAndStdDev` لیستی از اعداد را میگیرد و میانگین و انحراف معیار آنها را محاسبه میکند.
تابع `MeanAndStdDevForClass` دادهها را میگیرد و دیکشنریای برمیگرداند که در آن هر کلید یک برچسب کلاس است و مقدار آن لیستی از لیستها است که هر لیست داخلی میانگین و انحراف معیار هر ویژگی آن کلاس را دارد.
def MeanAndStdDev(numbers): avg = np.mean(numbers) stddev = np.std(numbers) return avg, stddev def MeanAndStdDevForClass(mydata): info = {} data_dict = groupUnderClass(mydata) for classValue, instances in data_dict.items(): info[classValue] = [MeanAndStdDev(attribute) for attribute in zip(*instances)] return info
محاسبه احتمالات گاوسی و کلاس
– تابع `calculateGaussianProbability` یک مقدار، میانگین و انحراف معیار را میگیرد و احتمال وقوع آن مقدار را زیر یک توزیع گاوسی با آن میانگین و انحراف معیار محاسبه میکند.
– تابع `calculateClassProbabilities` دیکشنری اطلاعات و یک نقطه داده آزمایشی را به عنوان آرگومان میگیرد. این تابع هر کلاس را بررسی کرده و احتمال اینکه نقطه داده آزمایشی به آن کلاس تعلق داشته باشد را بر اساس میانگین و انحراف معیار هر ویژگی آن کلاس محاسبه میکند.
def calculateGaussianProbability(x, mean, stdev): epsilon = 1e-10 expo = math.exp(-(math.pow(x - mean, 2) / (2 * math.pow(stdev + epsilon, 2)))) return (1 / (math.sqrt(2 * math.pi) * (stdev + epsilon))) * expo def calculateClassProbabilities(info, test): probabilities = {} for classValue, classSummaries in info.items(): probabilities[classValue] = 1 for i in range(len(classSummaries)): mean, std_dev = classSummaries[i] x = test[i] probabilities[classValue] *= calculateGaussianProbability(x, mean, std_dev) return probabilities
پیشبینی برای مجموعه آزمایشی
– تابع `predict` دیکشنری اطلاعات و یک نقطه داده آزمایشی را به عنوان آرگومان میگیرد. این تابع احتمالات کلاس را محاسبه میکند و کلاسی را که بیشترین احتمال را دارد برمیگرداند.
– تابع `getPredictions` دیکشنری اطلاعات و مجموعه آزمایشی را به عنوان آرگومان میگیرد. این تابع هر نقطه داده آزمایشی را بررسی کرده و کلاس آن را با استفاده از تابع `predict` پیشبینی میکند.
def predict(info, test): probabilities = calculateClassProbabilities(info, test) bestLabel = max(probabilities, key=probabilities.get) return bestLabel def getPredictions(info, test): predictions = [predict(info, instance) for instance in test] return predictions
محاسبه دقت
تابع `accuracy_rate` مجموعه آزمایشی و پیشبینیها را به عنوان آرگومان میگیرد. این تابع کلاسهای پیشبینی شده را با کلاسهای واقعی مقایسه میکند و درصد نقاط داده که به درستی پیشبینی شدهاند را محاسبه میکند.
def accuracy_rate(test, predictions): correct = sum(1 for i in range(len(test)) if test[i][-1] == predictions[i]) return (correct / float(len(test))) * 100.0
بارگذاری و پیشپردازش دادهها
کد ابتدا دادهها را از یک فایل CSV با استفاده از کتابخانه pandas بارگذاری میکند و آنها را به لیستی از لیستها تبدیل میکند. سپس برچسبهای کلاس را به مقادیر عددی رمزگذاری میکند و تمام ویژگیها را به اعداد اعشاری تبدیل میکند.
# Load data using pandas filename = '/content/diabetes_data.csv' # Add the correct file path df = pd.read_csv(filename) mydata = df.values.tolist() # Encode classes and convert attributes to float mydata = encode_class(mydata) for i in range(len(mydata)): for j in range(len(mydata[i]) - 1): mydata[i][j] = float(mydata[i][j])
تقسیم دادهها به مجموعههای آموزشی و آزمایشی
کد دادهها را با استفاده از یک نسبت مشخص به مجموعههای آموزشی و آزمایشی تقسیم میکند. سپس با محاسبه میانگین و انحراف معیار برای هر ویژگی در هر کلاس، مدل را آموزش میدهد.
# Split the data into training and testing sets ratio = 0.7 train_data, test_data = splitting(mydata, ratio) print('Total number of examples:', len(mydata)) print('Training examples:', len(train_data)) print('Test examples:', len(test_data))
خروجی:
Total number of examples: 768 Training examples: 537 Test examples: 231
آموزش و آزمایش مدل
برای مجموعه آموزشی، میانگین و انحراف معیار هر ویژگی درون هر کلاس را محاسبه میکند. در نهایت، مدل را روی مجموعه آزمایشی آزمایش کرده و دقت آن را محاسبه میکند.
# Train the model info = MeanAndStdDevForClass(train_data) # Test the model predictions = getPredictions(info, test_data) accuracy = accuracy_rate(test_data, predictions) print('Accuracy of the model:', accuracy)
خروجی:
Accuracy of the model: 100.0
نتیجهگیری
در کل، الگوریتم بیز ساده به عنوان یک الگوریتم ساده و مؤثر شناخته میشود که در مسائل طبقهبندی عملکرد خوبی دارد. این روش برای علاقهمندان به یادگیری ماشین بسیار مفید است، چراکه بر پایه قضیه بیز بنا شده و هم استفاده از آن و هم تحلیل آن آسان است. پیادهسازی دستی الگوریتم بیز ساده در پایتون میتواند با اجرای دقیق و تحلیل مناسب، درک عمیقتری از دادهها و پیشبینیهای دقیق برای موارد استفاده مختلف فراهم کند.
سوالات متداول
۱. چگونه میتوان بیز ساده را با پایتون از ابتدا پیادهسازی کرد؟
برای پیاده سازی بیز ساده با پایتون باید توابعی تعریف کنید که احتمالات لازم برای قضیه بیز را محاسبه کنند. این شامل محاسبه احتمال پیشین هر کلاس، احتمال شرطی هر ویژگی با توجه به کلاس، و احتمال وجود هر کلاس است. پس از محاسبه این احتمالات، میتوانید برای طبقهبندی دادههای جدید از قضیه بیز استفاده کنید.
۲. الگوریتم بیز ساده چطور کار میکند؟
بیز ساده یک طبقهبند احتمالی است که بر اساس قضیه بیز کار میکند. این قضیه بیان میکند که احتمال وقوع یک رویداد (فرضیه) با توجه به شواهد میتواند به عنوان حاصلضرب احتمال پیشین فرضیه و احتمال وجود شواهد با توجه به فرضیه، تقسیم بر احتمال کلی شواهد، محاسبه شود. در بیز ساده، فرضیه نمایانگر برچسب کلاس و شواهد نمایانگر ویژگیهای نقطه داده هستند.
۳. بیز ساده چیست؟
بیز ساده یک الگوریتم طبقهبندی است که بر اساس قضیه بیز است. این قضیه یک روش آماری برای محاسبه احتمال وقوع یک رویداد با توجه به مجموعهای از شرایط است. بیز ساده فرض میکند که ویژگیهای داده از هم مستقل هستند که محاسبات را سادهتر میکند.
۴. چرا بیز ساده محبوب است؟
بیز ساده به دلیل سادگی، کارآمدی و اثربخشیاش محبوب است. این الگوریتم اغلب به عنوان معیاری برای مقایسه با الگوریتمهای پیچیدهتر استفاده میشود.
۵. چه زمانی باید از بیز ساده استفاده کنم؟
بیز ساده برای مسائلی که در آنها ویژگیهای داده نسبتاً مستقل از هم هستند و دادههای آموزشی محدودی وجود دارد، مناسب است. همچنین، برای مسائلی که هزینه محاسباتی نگرانی ایجاد میکند، گزینه خوبی است.