Gaussian Naive Bayes، وضاحت کی گئی۔

Gaussian Naive Bayes، وضاحت کی گئی۔

ماخذ نوڈ: 2021431

Gaussian Naive Bayes، وضاحت کی گئی۔
Gaussian بولی Bayes درجہ بندی کرنے والے کا فیصلہ علاقہ۔ مصنف کی طرف سے تصویر.

 

میرے خیال میں یہ ہر ڈیٹا سائنس کیریئر کے آغاز میں ایک کلاسک ہے: بولی Bayes کلاسیفائر. یا مجھے اس کے بجائے کہنا چاہئے۔ خاندان بولی Bayes کے درجہ بندی کرنے والوں کا، جیسا کہ وہ بہت سے ذائقوں میں آتے ہیں۔ مثال کے طور پر، ایک کثیر الجہتی بولی Bayes، ایک Bernoulli naive Bayes، اور ایک Gaussian naive Bayes کی درجہ بندی کرنے والا بھی ہے، جو ہر ایک صرف ایک چھوٹی سی تفصیل میں مختلف ہے، جیسا کہ ہم دیکھیں گے۔ بولی Bayes الگورتھم ڈیزائن میں کافی آسان ہیں لیکن بہت سے پیچیدہ حقیقی دنیا کے حالات میں کارآمد ثابت ہوئے ہیں۔

اس مضمون میں، آپ سیکھ سکتے ہیں

  • بولی Bayes کے درجہ بندی کرنے والے کیسے کام کرتے ہیں،
  • ان کی وضاحت کرنا کیوں سمجھ میں آتا ہے جیسا کہ وہ ہیں اور
  • NumPy کا استعمال کرتے ہوئے انہیں ازگر میں کیسے نافذ کیا جائے۔

آپ کوڈ پر تلاش کر سکتے ہیں۔ میرا گیتوب.

Bayesian statistics پر میرے پرائمر کو چیک کرنے میں تھوڑی مدد ہو سکتی ہے۔ Bayesian Inference کا ایک نرم تعارف Bayes فارمولے کی عادت ڈالنے کے لیے۔ جیسا کہ ہم درجہ بندی کو اسکِٹ لرن کنفارم طریقے سے لاگو کریں گے، اس لیے میرے مضمون کو چیک کرنا بھی فائدہ مند ہے۔ اپنی مرضی کے مطابق اسکِٹ سیکھیں ریگریشن بنائیں. تاہم، اسکِٹ لرن اوور ہیڈ کافی چھوٹا ہے اور آپ کو بہرحال اس کی پیروی کرنے کے قابل ہونا چاہیے۔

ہم بولی Bayes کی درجہ بندی کے حیران کن حد تک سادہ نظریہ کو تلاش کرنا شروع کریں گے اور پھر عمل درآمد کی طرف رجوع کریں گے۔

درجہ بندی کرتے وقت ہمیں واقعی کیا دلچسپی ہے؟ ہم اصل میں کیا کر رہے ہیں، ان پٹ اور آؤٹ پٹ کیا ہے؟ جواب آسان ہے:

ڈیٹا پوائنٹ ایکس کو دیکھتے ہوئے، کسی کلاس سی سے تعلق رکھنے والے x کا کیا امکان ہے؟

ہم صرف اس کا جواب دینا چاہتے ہیں۔ کوئی بھی درجہ بندی آپ اس بیان کو مشروط امکان کے طور پر براہ راست نمونہ بنا سکتے ہیں: p(c|x).

مثال کے طور پر، اگر موجود ہیں

  • 3 کلاسیں c₁c₂c₃، اور
  • 2 خصوصیات پر مشتمل ہے۔ x₁x₂,

درجہ بندی کا نتیجہ کچھ ایسا ہو سکتا ہے۔ p(c₁|x₁x₂)=0.3، p(c₂|x₁x₂)=0.5 اور p(c₃|x₁x₂)=0.2۔ اگر ہم آؤٹ پٹ کے طور پر ایک ہی لیبل کا خیال رکھتے ہیں، تو ہم سب سے زیادہ امکان کے ساتھ ایک کا انتخاب کریں گے، یعنی c₂ یہاں 50% کے امکان کے ساتھ۔

بولی Bayes درجہ بندی کرنے والا ان امکانات کو براہ راست شمار کرنے کی کوشش کرتا ہے۔

بولی

ٹھیک ہے، تو ایک ڈیٹا پوائنٹ دیا x، ہم حساب کرنا چاہتے ہیں۔ p(c|xتمام کلاسز کے لیے اور پھر آؤٹ پٹ c سب سے زیادہ امکان کے ساتھ۔ فارمولوں میں آپ اکثر یہ دیکھتے ہیں۔

 

Gaussian Naive Bayes، وضاحت کی گئی۔
مصنف کی طرف سے تصویر.

 

نوٹ: میکس p(c|x) argmax کے دوران زیادہ سے زیادہ امکان واپس کرتا ہے۔ p(c|x) واپس کرتا ہے۔ c اس سب سے زیادہ امکان کے ساتھ۔

لیکن اس سے پہلے کہ ہم اصلاح کر سکیں p(c|x)، ہمیں اس کی گنتی کرنے کے قابل ہونا پڑے گا۔ اس کے لیے ہم استعمال کرتے ہیں۔ بائیس کا نظریہ۔:

 

Gaussian Naive Bayes، وضاحت کی گئی۔
Bayes تھیوریم۔ مصنف کی طرف سے تصویر.

 

یہ بولی Bayes کا Bayes حصہ ہے۔ لیکن اب، ہمارے پاس مندرجہ ذیل مسئلہ ہے: کیا ہیں؟ p(x|c) اور p(c)?

یہ وہی ہے جو ایک بولی Bayes درجہ بندی کرنے والے کی تربیت کے بارے میں ہے.

تربیت

ہر چیز کو واضح کرنے کے لیے، آئیے اس کے ساتھ ایک کھلونا ڈیٹاسیٹ استعمال کریں۔ دو حقیقی خصوصیات x₁x₂، اور تین کلاس c₁c₂c₃ مندرجہ ذیل میں

 

Gaussian Naive Bayes، وضاحت کی گئی۔
اعداد و شمار، تصور. مصنف کی طرف سے تصویر.

 

آپ یہ درست ڈیٹاسیٹ کے ذریعے تشکیل دے سکتے ہیں۔

from sklearn.datasets import make_blobs X, y = make_blobs(n_samples=20, centers=[(0,0), (5,5), (-5, 5)], random_state=0)

آئیے اس کے ساتھ شروعات کریں کلاس کا امکان p(c)، امکان ہے کہ کچھ کلاس c لیبل والے ڈیٹاسیٹ میں دیکھا جاتا ہے۔ اس کا اندازہ لگانے کا سب سے آسان طریقہ یہ ہے کہ صرف کلاسوں کی رشتہ دار تعدد کی گنتی کی جائے اور انہیں احتمالات کے طور پر استعمال کیا جائے۔ ہم اپنے ڈیٹاسیٹ کو یہ دیکھنے کے لیے استعمال کر سکتے ہیں کہ اس کا بالکل کیا مطلب ہے۔

7 میں سے 20 پوائنٹس پر لیبل کلاس ہیں۔ c₁ (نیلا) ڈیٹاسیٹ میں، اس لیے ہم کہتے ہیں۔ p(c₁)=7/20۔ ہمارے پاس کلاس کے لیے 7 پوائنٹس ہیں۔ c₂ (سرخ) کے ساتھ ساتھ، لہذا ہم نے سیٹ کیا p(c₂)=7/20۔ آخری کلاس c₃ (پیلا) میں صرف 6 پوائنٹس ہیں، اس لیے p(c₃)=6/20۔

کلاس کے امکانات کا یہ سادہ حساب زیادہ سے زیادہ امکانات کے نقطہ نظر سے ملتا ہے۔ تاہم، آپ دوسرا بھی استعمال کر سکتے ہیں۔ پہلے تقسیم، اگر آپ چاہیں. مثال کے طور پر، اگر آپ جانتے ہیں کہ یہ ڈیٹا سیٹ حقیقی آبادی کا نمائندہ نہیں ہے کیونکہ کلاس c₃ 50% کیسز میں ظاہر ہونا چاہیے، پھر آپ سیٹ کریں۔ p(c₁)=0.25، p(c₂)=0.25 اور p(c₃)=0.5۔ جو بھی آپ کو ٹیسٹ سیٹ پر کارکردگی کو بہتر بنانے میں مدد کرتا ہے۔

اب ہم کی طرف رجوع کرتے ہیں۔ امکان p(x|c)=p(x₁x₂|c)۔ اس امکان کا حساب لگانے کا ایک طریقہ لیبل والے نمونوں کے لیے ڈیٹا سیٹ کو فلٹر کرنا ہے۔ اور پھر ایک تقسیم تلاش کرنے کی کوشش کریں (مثال کے طور پر ایک 2-جہتی گاوسی) جو خصوصیات کو حاصل کرتی ہے x₁x₂.

بدقسمتی سے، عام طور پر، ہمارے پاس امکانات کا صحیح اندازہ لگانے کے لیے فی کلاس کے لیے کافی نمونے نہیں ہوتے۔

زیادہ مضبوط ماڈل بنانے کے قابل ہونے کے لیے، ہم بناتے ہیں۔ بولی مفروضہ کہ خصوصیات x₁x₂ ہیں اسٹاکسٹک طور پر آزاد، دیئے گئے c. یہ ریاضی کو آسان بنانے کا صرف ایک عمدہ طریقہ ہے۔

 

Gaussian Naive Bayes، وضاحت کی گئی۔
مصنف کی طرف سے تصویر

 

ہر کلاس کے لیے c. یہ وہ جگہ ہے جہاں بولی بولی Bayes کا حصہ اس لیے آتا ہے کیونکہ یہ مساوات عام طور پر نہیں ہوتی ہے۔ پھر بھی، اس کے باوجود بولی Bayes کے اچھے، کبھی کبھی عملی طور پر شاندار نتائج برآمد ہوتے ہیں۔ خاص طور پر NLP مسائل کے لیے بیگ آف الفاظ کی خصوصیات کے لیے، کثیر الجہتی بولی Bayes چمکتی ہے۔

اوپر دیے گئے دلائل کسی بھی بولی Bayes درجہ بندی کرنے والے کے لیے یکساں ہیں جو آپ کو مل سکتے ہیں۔ اب یہ صرف اس بات پر منحصر ہے کہ آپ کس طرح ماڈل بناتے ہیں۔ p(x₁|c₁), p(x₂|c₁), p(x₁|c₂), p(x₂|c₂), p(x₁|c₃) اور p(x₂|c₃).

اگر آپ کی خصوصیات صرف 0 اور 1 ہیں، تو آپ a استعمال کر سکتے ہیں۔ برنولی کی تقسیم. اگر وہ عددی عدد ہیں، a کثیر الجہتی تقسیم. تاہم، ہمارے پاس حقیقی خصوصیت کی اقدار ہیں اور a کا فیصلہ کرتے ہیں۔ گیوسو تقسیم، اس لیے نام Gaussian naive Bayes ہے۔ ہم مندرجہ ذیل فارم کو فرض کرتے ہیں۔

 

Gaussian Naive Bayes، وضاحت کی گئی۔
مصنف کی طرف سے تصویر.

 

کہاں μᵢ،ⱼ مطلب ہے اور σᵢ،ⱼ معیاری انحراف ہے جس کا ہمیں ڈیٹا سے اندازہ لگانا ہے۔ اس کا مطلب ہے کہ ہمیں ہر خصوصیت کے لیے ایک مطلب ملتا ہے۔ i ایک کلاس کے ساتھ مل کر cⱼ, ہمارے معاملے میں 2*3=6 کا مطلب ہے۔ معیاری انحراف کا بھی یہی حال ہے۔ یہ ایک مثال طلب کرتا ہے۔

آئیے اندازہ لگانے کی کوشش کرتے ہیں۔ μ₂،₁ اور σ₂،₁. کیونکہ j=1، ہم صرف کلاس میں دلچسپی رکھتے ہیں۔ c₁آئیے صرف اس لیبل کے ساتھ نمونے رکھیں۔ مندرجہ ذیل نمونے باقی ہیں:

# samples with label = c_1 array([[ 0.14404357, 1.45427351], [ 0.97873798, 2.2408932 ], [ 1.86755799, -0.97727788], [ 1.76405235, 0.40015721], [ 0.76103773, 0.12167502], [-0.10321885, 0.4105985 ], [ 0.95008842, -0.15135721]])

اب، کی وجہ سے i=2 ہمیں صرف دوسرے کالم پر غور کرنا ہے۔ μ₂,₁ مطلب ہے اور σ₂,₁ اس کالم کے لیے معیاری انحراف، یعنی μ₂,₁ = 0.49985176 اور σ₂,₁ = 0.9789976۔

اگر آپ اوپر سے بکھرے ہوئے پلاٹ کو دوبارہ دیکھیں تو یہ نمبر معنی خیز ہیں۔ خصوصیات x₂ کلاس سے نمونوں کا c₁ 0.5 کے ارد گرد ہیں، جیسا کہ آپ تصویر سے دیکھ سکتے ہیں۔

ہم اب اس کی گنتی دوسرے پانچ مجموعوں کے لیے کرتے ہیں اور ہم ہو چکے ہیں!

ازگر میں، آپ اسے اس طرح کر سکتے ہیں:

from sklearn.datasets import make_blobs
import numpy as np # Create the data. The classes are c_1=0, c_2=1 and c_3=2.
X, y = make_blobs( n_samples=20, centers=[(0, 0), (5, 5), (-5, 5)], random_state=0
) # The class probabilities.
# np.bincounts counts the occurence of each label.
prior = np.bincount(y) / len(y) # np.where(y==i) returns all indices where the y==i.
# This is the filtering step.
means = np.array([X[np.where(y == i)].mean(axis=0) for i in range(3)])
stds = np.array([X[np.where(y == i)].std(axis=0) for i in range(3)])

ہمیں ملا

# priors
array([0.35, 0.35, 0.3 ])
# means array([[ 0.90889988, 0.49985176], [ 5.4111385 , 4.6491892 ], [-4.7841679 , 5.15385848]])
# stds
array([[0.6853714 , 0.9789976 ], [1.40218915, 0.67078568], [0.88192625, 1.12879666]])

یہ ایک Gaussian بولی Bayes درجہ بندی کرنے والے کی تربیت کا نتیجہ ہے۔

پیش گوئیاں کرنا

مکمل پیشن گوئی فارمولہ ہے

 

Gaussian Naive Bayes، وضاحت کی گئی۔
مصنف کی طرف سے تصویر.

 

آئیے ایک نیا ڈیٹا پوائنٹ فرض کرتے ہیں۔ x*=(-2، 5) آتا ہے۔

 

Gaussian Naive Bayes، وضاحت کی گئی۔
مصنف کی طرف سے تصویر.

 

یہ دیکھنے کے لیے کہ یہ کس کلاس سے تعلق رکھتا ہے، آئیے حساب کریں۔ p(c|x*تمام کلاسز کے لیے۔ تصویر سے، اس کا تعلق کلاس سے ہونا چاہیے۔ c₃ = 2، لیکن آئیے دیکھتے ہیں۔ آئیے ڈینومینیٹر کو نظر انداز کر دیں۔ p(x) ایک سیکنڈ کے لیے۔ مندرجہ ذیل لوپ کا استعمال کرتے ہوئے نامزد کنندگان کی گنتی کی۔ j = 1، 2، 3۔

x_new = np.array([-2, 5]) for j in range(3): print( f"Probability for class {j}: {(1/np.sqrt(2*np.pi*stds[j]**2)*np.exp(-0.5*((x_new-means[j])/stds[j])**2)).prod()*p[j]:.12f}" )

ہمیں ملا

Probability for class 0: 0.000000000263
Probability for class 1: 0.000000044359
Probability for class 2: 0.000325643718

یقینا ، یہ امکانات (ہمیں ان کو اس طرح نہیں کہنا چاہئے) ایک میں اضافہ نہ کریں کیونکہ ہم نے ڈینومینیٹر کو نظر انداز کیا ہے۔ تاہم، یہ کوئی مسئلہ نہیں ہے کیونکہ ہم صرف ان غیر معمولی امکانات کو لے سکتے ہیں اور ان کو ان کی جمع سے تقسیم کر سکتے ہیں، پھر وہ ایک کا اضافہ کریں گے۔ لہذا، ان تینوں اقدار کو تقریباً 0.00032569 کے حساب سے تقسیم کرنے سے، ہمیں ملتا ہے

 

Gaussian Naive Bayes، وضاحت کی گئی۔
مصنف کی طرف سے تصویر.

 

ایک واضح فاتح، جیسا کہ ہم نے توقع کی تھی۔ اب، آئیے اسے نافذ کریں!

یہ نفاذ اب تک موثر نہیں ہے، عددی اعتبار سے مستحکم نہیں ہے، یہ صرف ایک تعلیمی مقصد کو پورا کرتا ہے۔ ہم نے زیادہ تر چیزوں پر تبادلہ خیال کیا ہے، لہذا اب اس پر عمل کرنا آسان ہونا چاہیے۔ آپ سب کو نظر انداز کر سکتے ہیں۔ check افعال، یا میرا مضمون پڑھیں اپنی مرضی کے مطابق اسکِٹ لرن بنائیں اگر آپ اس میں دلچسپی رکھتے ہیں کہ وہ بالکل کیا کرتے ہیں۔

صرف نوٹ کریں کہ میں نے لاگو کیا a predict_proba امکانات کی گنتی کرنے کا پہلا طریقہ۔ طریقہ کار predict صرف اس طریقہ کو کال کرتا ہے اور ارگ میکس فنکشن کا استعمال کرتے ہوئے سب سے زیادہ امکان کے ساتھ انڈیکس (=کلاس) لوٹاتا ہے (وہاں یہ دوبارہ ہے!) کلاس 0 سے کلاسز کا انتظار کر رہی ہے۔ k-1، کہاں k کلاسوں کی تعداد ہے۔

import numpy as np
from sklearn.base import BaseEstimator, ClassifierMixin
from sklearn.utils.validation import check_X_y, check_array, check_is_fitted class GaussianNaiveBayesClassifier(BaseEstimator, ClassifierMixin): def fit(self, X, y): X, y = check_X_y(X, y) self.priors_ = np.bincount(y) / len(y) self.n_classes_ = np.max(y) + 1 self.means_ = np.array( [X[np.where(y == i)].mean(axis=0) for i in range(self.n_classes_)] ) self.stds_ = np.array( [X[np.where(y == i)].std(axis=0) for i in range(self.n_classes_)] ) return self def predict_proba(self, X): check_is_fitted(self) X = check_array(X) res = [] for i in range(len(X)): probas = [] for j in range(self.n_classes_): probas.append( ( 1 / np.sqrt(2 * np.pi * self.stds_[j] ** 2) * np.exp(-0.5 * ((X[i] - self.means_[j]) / self.stds_[j]) ** 2) ).prod() * self.priors_[j] ) probas = np.array(probas) res.append(probas / probas.sum()) return np.array(res) def predict(self, X): check_is_fitted(self) X = check_array(X) res = self.predict_proba(X) return res.argmax(axis=1)

عمل درآمد کی جانچ

اگرچہ کوڈ کافی مختصر ہے یہ ابھی بھی بہت لمبا ہے اس بات کا مکمل یقین کرنے کے لیے کہ ہم نے کوئی غلطی نہیں کی ہے۔ تو، آئیے چیک کریں کہ اس کے مقابلے میں اس کا کیا فائدہ ہے۔ scikit-learn GaussianNB درجہ بندی کرنے والا.

my_gauss = GaussianNaiveBayesClassifier()
my_gauss.fit(X, y)
my_gauss.predict_proba([[-2, 5], [0,0], [6, -0.3]])

نتائج

array([[8.06313823e-07, 1.36201957e-04, 9.99862992e-01], [1.00000000e+00, 4.23258691e-14, 1.92051255e-11], [4.30879705e-01, 5.69120295e-01, 9.66618838e-27]])

کا استعمال کرتے ہوئے پیشن گوئیاں predict طریقہ کار ہیں

# my_gauss.predict([[-2, 5], [0,0], [6, -0.3]])
array([2, 0, 1])

اب آئیے اسکِٹ لرن کا استعمال کریں۔ کچھ کوڈ میں پھینکنا

from sklearn.naive_bayes import GaussianNB gnb = GaussianNB()
gnb.fit(X, y)
gnb.predict_proba([[-2, 5], [0,0], [6, -0.3]])

پیداوار

array([[8.06314158e-07, 1.36201959e-04, 9.99862992e-01], [1.00000000e+00, 4.23259111e-14, 1.92051343e-11], [4.30879698e-01, 5.69120302e-01, 9.66619630e-27]])

نمبر ہمارے درجہ بندی کرنے والے سے ملتے جلتے نظر آتے ہیں، لیکن وہ آخری چند دکھائے گئے ہندسوں میں تھوڑا سا دور ہیں۔ کیا ہم نے کچھ غلط کیا؟ نہیں. سکیٹ لرن ورژن صرف ایک اور ہائپر پیرامیٹر کا استعمال کرتا ہے۔ var_smoothing=1e-09 . اگر ہم اسے اس پر سیٹ کریں۔ صفر، ہمیں بالکل اپنے نمبر ملتے ہیں۔ کامل!

ہمارے درجہ بندی کے فیصلہ کن علاقوں پر ایک نظر ڈالیں۔ میں نے ان تین نکات کو بھی نشان زد کیا جنہیں ہم نے جانچ کے لیے استعمال کیا۔ سرحد کے قریب اس ایک پوائنٹ پر سرخ طبقے سے تعلق رکھنے کا صرف 56.9 فیصد موقع ہے، جیسا کہ آپ دیکھ سکتے ہیں predict_proba آؤٹ پٹ دوسرے دو نکات کو بہت زیادہ اعتماد کے ساتھ درجہ بندی کیا گیا ہے۔

 

Gaussian Naive Bayes، وضاحت کی گئی۔

3 نئے پوائنٹس کے ساتھ فیصلے والے علاقے۔ مصنف کی طرف سے تصویر.

 

اس مضمون میں، ہم نے سیکھا ہے کہ Gaussian naive Bayes کی درجہ بندی کیسے کام کرتی ہے اور اس پر ایک وجدان دیا کہ اسے اس طرح کیوں ڈیزائن کیا گیا تھا - یہ دلچسپی کے امکان کو ماڈل کرنے کے لیے براہ راست نقطہ نظر ہے۔ اس کا موازنہ لاجسٹک ریگریشن سے کریں: وہاں، امکان کو لکیری فنکشن کا استعمال کرتے ہوئے ماڈل بنایا جاتا ہے جس کے اوپر ایک سگمائیڈ فنکشن لگایا جاتا ہے۔ یہ اب بھی ایک آسان ماڈل ہے، لیکن یہ اتنا فطری محسوس نہیں ہوتا جتنا کہ ایک بولی Bayes درجہ بندی کرنے والا ہے۔

ہم نے چند مثالوں کا حساب لگا کر اور راستے میں کوڈ کے کچھ مفید ٹکڑوں کو جمع کرکے جاری رکھا۔ آخر میں، ہم نے ایک مکمل Gaussian naive Bayes کی درجہ بندی کو اس طرح لاگو کیا ہے جو scikit-learn کے ساتھ اچھی طرح کام کرتا ہے۔ اس کا مطلب ہے کہ آپ اسے پائپ لائنز یا گرڈ سرچ میں استعمال کر سکتے ہیں، مثال کے طور پر۔

آخر میں، ہم نے اسکِٹ-لرنز کا اپنا گاوسین نیوی بائیس کلاسیفائر درآمد کرکے اور جانچ کر کے ایک چھوٹا سا سنٹی چیک کیا کہ آیا ہمارا اور اسکِٹ لرن کے کلاسیفائر کا نتیجہ ایک جیسا ہے۔ یہ ٹیسٹ کامیاب رہا۔

 
 
ڈاکٹر رابرٹ کوبلر پبلکس میڈیا میں ڈیٹا سائنٹسٹ اور Towards Data Science میں مصنف ہیں۔

 
حقیقی. اجازت کے ساتھ دوبارہ پوسٹ کیا۔
 

ٹائم اسٹیمپ:

سے زیادہ KDnuggets