Logo
تعلم الآلة (2026-2027) - التصنيف بخوارزمية Naive Bayes

في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.

تعلم الآلة، الأسبوع 7

التصنيف بخوارزمية Naive Bayes

حول أعداد الكلمات إلى احتمالات بنظرية بايز، ثم ابن مرشحا للرسائل المزعجة ومصنفا للنبيذ باستخدام scikit-learn.

الأهداف

  • صياغة نظرية بايز (Bayes' theorem) وتسمية أجزائها: الاحتمال المسبق (prior)، والأرجحية (likelihood)، والدليل (evidence)، والاحتمال اللاحق (posterior)
  • حساب احتمال أن تكون الرسالة مزعجة بشرط وجود كلمة فيها، من أعداد حقيقية
  • شرح الافتراض الساذج (naive assumption) وحساب درجة (score) الرسالة كلمة بكلمة، يدويا
  • شرح لماذا يتعطل النموذج حين يكون العدد 0، وكيف يعالج ذلك تنعيم لابلاس (Laplace smoothing)
  • بناء مرشح للرسائل المزعجة (spam) باستخدام MultinomialNB وCountVectorizer، وتقييمه
  • تدريب GaussianNB على خصائص (features) عددية: بيانات النبيذ

الأسبوع 7 من الخطة

موقع الدرس من المقرر

  • دفتران (notebooks): E-Mail Classification (1000 رسالة بريد إلكتروني ذات تسمية) وNaive_Bayes_Classification (178 عينة نبيذ)
  • سيناريو من الواقع: كشف الرسائل المزعجة، هل الرسالة مزعجة أم سليمة (ham) من كلماتها
  • مرحلة المشروع (project milestone) هذا الأسبوع: تنفيذ نموذج تعلم الآلة (Machine Learning Model Implementation)

خطة الساعتين

الجزءما نفعلهالزمن
1نظرية بايز، وكلمة واحدة يدويا20 دقيقة
2Naive Bayes يدويا، والتنعيم30 دقيقة
3الدفتر 1: مرشح الرسائل المزعجة20 دقيقة
4الدفتر 2: Naive Bayes الغاوسي على النبيذ20 دقيقة
5تمارين مع الإجابات، ثم الخلاصة30 دقيقة

الجزء 1

نظرية بايز

النظرية وأجزاؤها الأربعة

الاحتمال الشرطي (conditional probability) P(A | B): احتمال A، بشرط أن يكون B صحيحا. لصنف (class) c ودليل x:

P(c | x) = P(x | c) · P(c)P(x)
الجزءالرمزالمعنى
الاحتمال المسبقP(c)مدى شيوع الصنف، قبل النظر في الرسالة
الأرجحيةP(x | c)مدى شيوع الدليل داخل الصنف
الدليلP(x)مدى شيوع الدليل عموما
الاحتمال اللاحقP(c | x)احتمال الصنف بعد رؤية الدليل

يدويا

مثال محلول: رسالة مزعجة، بشرط وجود الكلمة money

999 رسالة. S مزعجة، وH سليمة، وm: الرسالة تحتوي على money

الصنفالرسائلتحتوي على money
مزعجة S50079
سليمة H49925
الكل999104

الخطوة 1: الاحتمال المسبق والأرجحية

P(S) = 500999 = 0.5005
P(m | S) = 79500 = 0.158

الخطوة 2: الدليل

P(m) = 79 + 25999 = 104999 = 0.1041

الخطوة 3: الاحتمال اللاحق

P(S | m) = 0.158 × 0.50050.1041 = 0.7596

الجزء 2

Naive Bayes يدويا

الافتراض الساذج

في الرسالة كلمات كثيرة x_1, ..., x_n

P(x1, x2, ..., xn | c) = P(x1 | c) × P(x2 | c) × ... × P(xn | c)
  • المزيج المحدد من الكلمات لا يكاد يتكرر، لذا لا يمكن عده
  • يفترض Naive Bayes أن الكلمات مستقلة عند معرفة الصنف
  • عندها تصبح الأرجحية حاصل ضرب أرجحيات الكلمات المفردة
  • الكلمات الحقيقية ليست مستقلة، ومع ذلك تعمل الطريقة جيدا على نحو مدهش

قاعدة التصنيف

s(c) = P(c) × P(x1 | c) × ... × P(xn | c)
  1. احسب الدرجة s(c) لكل صنف c
  2. تنبأ بالصنف صاحب أكبر درجة
  3. التطبيع (normalization): اقسم كل درجة على مجموع الدرجات كلها. وهذا هو predict_proba

عد الكلمات: MultinomialNB

P(w | c) = nwc + αNc + α V
الرمزالمعنى
n_wcعدد مرات ظهور الكلمة w في رسائل التدريب من الصنف c
N_cمجموع أعداد كل كلمات المفردات (vocabulary) في الصنف c
Vعدد الكلمات في المفردات
αالتنعيم، والقيمة الافتراضية alpha=1.0 في MultinomialNB()

يدويا

مثال محلول: مرشح رسائل مزعجة من أربع كلمات

أعداد حقيقية في الرسائل الـ999. الاحتمالان المسبقان P(H) = 0.4995 وP(S) = 0.5005، وV = 4 وα = 1

الكلمةالعدد في السليمةالعدد في المزعجة
money38155
online794
meeting1531
meds030
المجموع N_c198280

الخطوة 1: أي الكلمات يراها المرشح؟

المفردات: money وonline وmeeting وmeds

الخطوة 2: احتمالات الكلمات

o = online، وd = meds. المقامان: 198 + 4 = 202 للسليمة، و280 + 4 = 284 للمزعجة

P(o | H) = 7 + 1202 = 0.0396
P(d | H) = 0 + 1202 = 0.00495
P(o | S) = 94 + 1284 = 0.3345
P(d | S) = 30 + 1284 = 0.1092

الخطوة 3: الدرجتان

s(c) = P(c) مضروبا في احتمالات الكلمات

s(H) = 0.4995 × 0.0396 × 0.00495 = 0.0000979
s(S) = 0.5005 × 0.3345 × 0.1092 = 0.0183

الخطوة 4: التطبيع

e = الرسالة

P(S | e) = 0.01830.0183 + 0.0000979 = 0.9947
P(H | e) = 1 - 0.9947 = 0.0053

جربها: مرشح الرسائل المزعجة كلمة بكلمة

مشكلة العدد صفر

رسالة جديدة e: Money for the meeting? The meeting is about meds. الأعداد: m = money 1، وg = meeting 2، وd = meds 1

P(d | H) = 0198 = 0
s(H) = 0.4995 × 0.1919 × 0.77272 × 0 = 0 ⇒ P(S | e) = 1

تنعيم لابلاس يعالجها

α = 1: يضاف واحد إلى كل عدد، فلا يكون أي احتمال 0 أبدا

s(H) = 0.4995 × 0.1931 × 0.76242 × 0.00495 = 0.0002775
s(S) = 0.5005 × 0.5493 × 0.007042 × 0.1092 = 0.000001488
P(H | e) = 0.00027750.0002775 + 0.000001488 = 0.9947

الجزء 3

الدفتر 1: مرشح الرسائل المزعجة

افتح الدفتر في Colab

text
https://colab.research.google.com/github/
jeffprosise/Machine-Learning/blob/master/
E-Mail%20Classification.ipynb
اجمع الأسطر الثلاثة في عنوان واحد، أو اضغط رابط Colab في صفحة الدرس.
python
url = ("https://raw.githubusercontent.com/"
       "jeffprosise/Machine-Learning/master/Data/ham-spam.csv")
df = pd.read_csv(url)
يقرأ الدفتر Data/ham-spam.csv، وهو ليس بجواره في Colab. اقرأه من المستودع.

تحميل البيانات وحذف المكرر

python
df.info()
df.groupby('IsSpam').describe()
df = df.drop_duplicates()
df.groupby('IsSpam').describe()
  • 1000 صف: IsSpam (0 سليمة، و1 مزعجة) وText
  • النص بحروف صغيرة مسبقا، بلا علامات ترقيم، ولا قيم مفقودة
  • 500 رسالة سليمة لكن 499 فقط فريدة: رسالة سليمة واحدة تظهر مرتين
  • بعد drop_duplicates(): 999 صفا، منها 499 سليمة و500 مزعجة

من النص إلى الأعداد: CountVectorizer

python
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(
    ngram_range=(1, 2), stop_words='english')
x = vectorizer.fit_transform(df['Text'])
y = df['IsSpam']
  • صف لكل رسالة، وعمود لكل مدخل في المفردات، والخلايا أعداد
  • ngram_range=(1, 2): الكلمات المفردة والأزواج مثل order online
  • stop_words='english': تحذف كلمات التوقف (stop words) مثل the وfor وyou...
  • x.shape هي (999, 100687): 100687 عمودا

مثال محلول: ما يحتفظ به CountVectorizer

python
text = vectorizer.transform(['Why pay MORE for * expensive meds when you can ...123... order them online and save $$$?'])
print(vectorizer.inverse_transform(text))
text
[array(['expensive', 'meds', 'online', 'order', 'order online', 'pay',
       'save'], dtype='<U401')]

التقسيم والتدريب

python
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, random_state=0)

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(x_train, y_train)
  • 799 رسالة للتدريب، و200 للاختبار (102 سليمة و98 مزعجة)
  • fit يعد فقط: الاحتمالات المسبقة، وP(w | c) بعد التنعيم لكل عمود من الأعمدة الـ100687

مصفوفة الالتباس

بقيت 101 من 102 رسالة سليمة، وكشف المرشح 95 من 98 رسالة مزعجة

مصفوفة الالتباس لمرشح الرسائل المزعجة على 200 رسالة اختبار: 101 و1 في صف Not Spam، و3 و95 في صف Spam
python
from sklearn.metrics import ConfusionMatrixDisplay

ConfusionMatrixDisplay.from_estimator(
    model, x_test, y_test,
    display_labels=['Not Spam', 'Spam'],
    cmap='Blues', xticks_rotation='vertical')

مثال محلول: تقييم مرشح الرسائل المزعجة

A الدقة (accuracy)، وP الضبط (precision)، وR الاستدعاء (recall) للرسائل المزعجة

A = 101 + 95200 = 0.98
P = 9595 + 1 = 0.9896, R = 9595 + 3 = 0.9694

تصنيف رسائل جديدة

python
message = vectorizer.transform(['Can you attend a code review on Tuesday? Need to make sure the logic is rock solid.'])
model.predict(message)[0]
model.predict_proba(message)[0][0]

message = vectorizer.transform(['Why pay more for expensive meds when you can order them online and save $$$?'])
model.predict(message)[0]
model.predict_proba(message)[0][1]
الرسالةpredictالاحتمال المعروض
رسالة مراجعة الكود0 (سليمة)P(H) = 0.99992
رسالة الأدوية الغالية1 (مزعجة)P(S) = 0.99979

الجزء 4

الدفتر 2: Naive Bayes الغاوسي على النبيذ

بيانات النبيذ

178 عينة نبيذ، و3 سلالات (Class 1 و2 و3: 59 و71 و48 عينة)، و13 خاصية عددية مثل Alcohol وFlavanoids وProline

مخطط صندوقي للخاصية Flavanoids حسب صنف النبيذ: الصنف 1 الأعلى، والصنف 2 في الوسط، والصنف 3 الأدنى
python
url = ("https://raw.githubusercontent.com/tirthajyoti/"
       "Machine-Learning-with-Python/master/"
       "Datasets/wine.data.csv")
df = pd.read_csv(url)
يقرأ الدفتر 2 الملف ./Datasets/wine.data.csv، وهو ليس بجواره في Colab. ورابطه في Colab موجود في صفحة الدرس.

هل الخصائص مستقلة؟

مصفوفة الارتباط لأعمدة النبيذ، مع كتل حمراء قوية بين Total phenols وFlavanoids وOD280/OD315
  • Flavanoids مقابل Total phenols: الارتباط (correlation) 0.86
  • Flavanoids مقابل OD280/OD315: 0.79
  • الافتراض الساذج خاطئ بوضوح هنا

الأرجحية الغاوسية

داخل كل صنف، يفترض أن الخاصية تتبع منحنى جرسيا

f(x | c) = 1√(2πσc2) · e-(x - μc)2 / (2σc2)
الرمزالمعنى
μ_cمتوسط (mean) الخاصية في الصنف c
σ_cالانحراف المعياري (standard deviation) للخاصية في الصنف c
f(x | c)ارتفاع المنحنى عند x: الأرجحية

يدويا

مثال محلول: عينة نبيذ واحدة، وخاصية واحدة

Flavanoids على عينات النبيذ الـ178 كلها

الصنفالعيناتالمتوسط μالانحراف المعياري σ
1592.9820.394
2712.0810.701
3480.7810.290

الخطوة 1: الأسس

الأس: -(x - μ)^2 / (2σ^2) مع x = 2.0

c = 1: - (2.0 - 2.982)22 · 0.3942 = - 0.96430.3105 = -3.106
c = 2: - (2.0 - 2.081)22 · 0.7012 = - 0.006560.9828 = -0.0067
c = 3: - (2.0 - 0.781)22 · 0.2902 = - 1.48600.1682 = -8.834

الخطوة 2: الكثافات

اضرب e مرفوعا إلى الأس في 1 / √(2πσ²) لتحصل على الكثافة (density)

f(2.0 | 1) = 1.0125 × 0.04478 = 0.0453
f(2.0 | 2) = 0.5691 × 0.99335 = 0.5653
f(2.0 | 3) = 1.3757 × 0.000146 = 0.000200
المنحنيات الغاوسية الثلاثة للخاصية Flavanoids في كل صنف، والعينة الجديدة عند 2.0 معلمة على كل منحنى

الخطوة 3: الاحتمالات المسبقة والاحتمال اللاحق

الاحتمالات المسبقة: 59/178 و71/178 و48/178

الصنفf(x | c)P(c)الاحتمال اللاحق
10.04530.33150.0625
20.56530.39890.9373
30.0002000.26970.0002

جربها: Naive Bayes الغاوسي

التدريب على الخصائص الـ13 كلها

python
X = df.drop('Class', axis=1)
y = df['Class']
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)

nbc = GaussianNB()
nbc.fit(X_train, y_train)
y_pred = nbc.predict(X_test)
التنبؤ 1التنبؤ 2التنبؤ 3
الحقيقي 11900
الحقيقي 22191
الحقيقي 30013

تقرير معكوس

يطبع الدفتر classification_report(y_pred, y_test)

الصيغةالضبطالاستدعاءsupport
(y_pred, y_test)0.861.0019
(y_test, y_pred)1.000.8622

قبل التمارين

الأخطاء الشائعة

  • قراءة البيانات من مجلد غير موجود في Colab
  • تشغيل plot_confusion_matrix: استخدم بدلا منها ConfusionMatrixDisplay.from_estimator
  • alpha=0: كلمة واحدة لم تظهر في صنف ما تجعل احتماله 0 تماما
  • fit_transform على الرسائل الجديدة: النص الجديد يحتاج إلى vectorizer.transform([...])
  • تبديل وسيطي classification_report: التسميات الحقيقية أولا
  • MultinomialNB على القياسات: أعداد الكلمات إلى Multinomial، والقياسات العددية إلى Gaussian

مشروع فريقك

مرحلة المشروع: تنفيذ النموذج

  1. اختر النوع: MultinomialNB لأعداد الكلمات، وGaussianNB للخصائص العددية
  2. قسم البيانات بقيمة ثابتة للمعامل random_state
  3. درب النموذج، ثم تنبأ بمجموعة الاختبار
  4. اعرض مصفوفة الالتباس وclassification_report (التسميات الحقيقية أولا)
  5. قارن بنماذجك من الأسبوعين 5 و6 على التقسيم نفسه، واحتفظ بالأفضل

الجزء 5

التمارين: دورك

نحو 5 دقائق

التمرين 1: نظرية بايز لكلمتين أخريين

الكلمةالرسائل المزعجة (من 500)الرسائل السليمة (من 499)
click506
meeting189
P(S | k) = 0.1 × 0.50050.056056 = 0.8929 = 5056
P(S | g) = 0.002 × 0.50050.09009 = 0.0111 = 190

نحو 10 دقائق

التمرين 2: مرشح الكلمات الأربع

الرسالة e: Make money online, no meeting needed

s(H) = 0.4995 × 0.1931 × 0.0396 × 0.7624 = 0.002912
s(S) = 0.5005 × 0.5493 × 0.3345 × 0.00704 = 0.0006474
P(S | e) = 0.00064740.002912 + 0.0006474 = 0.1819

نحو 5 دقائق

التمرين 3: Naive Bayes الغاوسي يدويا

الصنفf(x | c)P(c)الدرجة
10.47910.33150.1588
20.47600.39890.1899

نحو 10 دقائق

التمرين 4: في Colab

  1. شغل الدفتر 1 مع الإصلاحين
  2. صنف ثلاث رسائل بتشغيل predict مرة واحدة وpredict_proba مرة واحدة: رسالة مراجعة الكود، ورسالة الأدوية الغالية، وMake money online, no meeting needed
  3. لماذا تختلف الرسالة الثالثة عن التمرين 2؟ اطبع inverse_transform
  4. الدفتر 2: random_state بالقيمة 1، ثم 42. كم عينة نبيذ تصنف خطأ؟
السؤالالناتج
predict على الدفعة[0 1 1]، والثالثة: P(S) = 0.7002
كلمات الرسالة الثالثةmake وmake money وmeeting وmoney وneeded وonline
random_state=1 / 421 و0 من 54 صنفت خطأ

الخلاصة

  1. تحول نظرية بايز الأرجحية التي يمكن عدها إلى الاحتمال اللاحق الذي نريده
  2. الافتراض الساذج: أرجحية الرسالة حاصل ضرب أرجحيات كلماتها
  3. تنبأ بالصنف صاحب أكبر ناتج لضرب الاحتمال المسبق في الأرجحيات، ثم طبق التطبيع لتحصل على احتمالات
  4. يمنع تنعيم لابلاس (alpha=1) كلمة واحدة لم تظهر في صنف ما من فرض القيمة 0
  5. MultinomialNB لأعداد الكلمات، وGaussianNB للخصائص العددية
  6. يتدرب بالعد، لذا فهو سريع، وجيد حتى حين يكون الافتراض خاطئا

افتح هذا الدرس

Mahmoud Abasالتصنيف بخوارزمية Naive Bayes