همانگونه که گفتیم چندین الگوریتم بر پایه قضیه بیز پیاده سازی شده اند که هر یک برای دسته ای از داده ها کاربرد دارند. در کتابخانه Scikit-Learn سه الگوریتم به نام Gaussian Naive Bayes و Multinomial Naive Bayes و Bernoulli Naive Byaes پیاده سازی شده اند. در این نوشته می خواهیم درباره الگوریتم GaussianNB (یا الگوریتم بیز ساده گوسی) بگوییم.

الگوریتم Gaussion Naive Bayes

این الگوریتم به زبان ساده برای ویژگی های پیوسته (Continuous) که توزیع نرمال (Normal Distribution) را دنبال می کنند. متغیر تصادفی X دارای توزیع نرمال با میانگین μ و واریانس  𝞼 ^ 2 است اگر تابع چگالی احتمال آن به صورت زیر باشد. در معادله زیر بازه های   ∞ > x > ∞- و ∞ > 𝝁 > ∞- و 𝝈 > 0 صادق هستند.

در معادله زیر 𝞹 برابر 3.14159 و 𝐞 برابر با 2.71828 است.

شکل زیر، نمودار توزیع نرمال را نشان می دهد که نموداری زنگی شکل و متقارن است و دامنه آن از منفی بی کران (بی نهایت) تا مثبت بی کران است. توزیع نرمال که آن را توزیع گوسی (Gaussian Distribution) نیز می گویند، نسبت به راستای y=𝜇 دارای تقارن است، بنابراین می توانیم بگوییم که پیرامون میانگین خویش، متقارن است.

متغیرهای پیوسته (Continuous Variables) به زبان ساده می توانند بی کران هَموند (بی نهایت عضو) داشته باشند. برای نمونه سن، فشار خون، قد، وزن و دیگر … از نمونه های متغیرهای پیوسته هستند. همچنین متغیر تصادفی X را که نمودار توزیع آن زنگی شکل باشد، متغیر تصادفی نرمال می نامیم.

توزیع متغیر تصادفی نرمال را توزیع نرمال می گوییم.

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

در زیر نخست کتابخانه numpy و کلاس GaussianNB از ماژول sklearn.naive_bayes را به برنامه پیوست کرده ایم. سپس دو متغیر X و Y را ساخته ایم که X نقش ویژگی ها و Y نقش برچسب ها (کلاس ها) را دارد. توجه کنید X خودش آرایه ای از آرایه ها است که هر آرایه درونی خودش دارای دو مقدار (شماره صحیح) است. متغیر Y دارای ۶ شماره ۱ یا ۲ است که این دو شماره بیانگر کلاس ها هستند.

توجه کنید که الگوریتم بیز ساده و همچنین Gaussain Naive Bayes از دسته الگوریتم های طبقه بندی است و از این رو در دسته الگوریتم های با نظارت جای می گیرند. بنابراین برای ساخت مدل به کمک متد ()fit نیاز به مجموعه داده ای داریم که به ازای هر نمونه، برچسب یا کلاس یا Target آن نمونه نیز باشد. بنابراین ما دو متغیر X که هر یک آرایه ای دو عضوی است و Y که برچسب هر یک از این آرایه ها است را نوشته ایم. توجه کنید که شمار (تعداد) هموندهای (اعضای) هر دو آرایه X و Y یکی است.

متغیر clf نمونه ای از کلاس GaussianNB است که سپس به کمک آن متد ()fit از این کلاس را فراخوانی می کنیم و دو متغیر X و Y برای ساخت مدل به آن فرستاده شده است. در پایان می خواهیم با ورودی های تازه پیش بینی هایی را انجام دهیم. توجه کنید ورودی های تازه همانند X، آرایه ای از ارایه هایی هستند که هر آرایه درونی دارای دو هموند است که هر یک دارای دو شماره است.

الگوریتم GaussianNB و مجموعه داده Iris

در نوشته بارگذاری داده ها در کتابخانه Scikit-Learn درباره بارگذاری مجموعه داده Iris از کتابخانه Scikit-Learn گفته ایم. این مجموعه داده، دربرگیرنده نمونه هایی (مشاهده هایی) از سه گونه گیاهی بر پایه چهار ویژگی از اندازه های گوناگون است. این مجموعه داده در دسته داده های پیوسته است همانند اینکه بیاییم انسان ها را بر پایه دو ویژگی پیوسته قد، سن نمونه برداری کنیم. بنابراین می تونیم الگوریتم GaussianNB را بر روی این مجموعه داده به کار ببریم.

در کد زیر نخست تابع ()load_iris از ماژول sklearn.datasets و کلاس GaussianNB از ماژول sklearn.naive_bayes را به برنامه پیوست کرده ایم و سپس برآیند (نتیجه) تابع ()load_iris را درون متغیر dataset ریخته ایم. در ادامه متغیر X که در برگیرنده نمونه ها بدون برچسب ها (یا کلاس ها) هستند و متغیر Y که در برگیرنده برچسب ها یا کلاس ها یا Target ها هستند را ساخته ایم. بازهم تاکید می کنیم که X آرایه ای از آرایه ها است که هر آرایه درونی در برگیرنده یک نمونه با چهار شماره است که هر شماره بیانگر یک ویژگی است و همچنین شمار (تعداد) شماره های درون آرایه Y برابر با هموندهای (اعضای) X است که هر کدام یک برچسب برای یک نمونه در X هستند.

سپس یک نمونه از کلاس GaussianNB می سازیم و سپس برای ساخت مدل دو متغیر X و Y به متد ()fit فرستاده شده است و در پایان یک آرایه دارای دو آرایه درونی به متد ()predict فرستاده می شود و برآیند (نتیجه) آن درون متغیر دیگری به نام predictions نگهداری می شود. همانگونه می بینید چون ما یک آرایه از دو آرایه درونی را به متد ()predict فرستادیم، پس دو پیش بینی داریم و از این رو یک لیست دوتایی از کلاس های (برچسب های) پیش بینی شده درون متغیر predictions ریخته می شود. سپس در یک بَند (خط) مقدار متغیر predictions را نشان می دهیم و در ادامه با یک حلقه for و عبارت if … elif … else درون آن در هر گام بررسی می کنیم که کلاس پیش بینی شده آیا 0 یا 1 یا 2 است و سپس برچسب (رشته) کلاس را نشان می دهیم.