في نافذة الطباعة اختر «حفظ كملف 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 دقيقة |
| 2 | Naive 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) | مدى شيوع الصنف، قبل النظر في الرسالة |
| الأرجحية | P(x | c) | مدى شيوع الدليل داخل الصنف |
| الدليل | P(x) | مدى شيوع الدليل عموما |
| الاحتمال اللاحق | P(c | x) | احتمال الصنف بعد رؤية الدليل |
يدويا
مثال محلول: رسالة مزعجة، بشرط وجود الكلمة money
999 رسالة. S مزعجة، وH سليمة، وm: الرسالة تحتوي على money
| الصنف | الرسائل | تحتوي على money |
|---|---|---|
مزعجة S | 500 | 79 |
سليمة H | 499 | 25 |
| الكل | 999 | 104 |
الخطوة 1: الاحتمال المسبق والأرجحية
الخطوة 2: الدليل
الخطوة 3: الاحتمال اللاحق
الجزء 2
Naive Bayes يدويا
الافتراض الساذج
في الرسالة كلمات كثيرة x_1, ..., x_n
- ▸المزيج المحدد من الكلمات لا يكاد يتكرر، لذا لا يمكن عده
- ▸يفترض Naive Bayes أن الكلمات مستقلة عند معرفة الصنف
- ▸عندها تصبح الأرجحية حاصل ضرب أرجحيات الكلمات المفردة
- ▸الكلمات الحقيقية ليست مستقلة، ومع ذلك تعمل الطريقة جيدا على نحو مدهش
قاعدة التصنيف
- 1احسب الدرجة
s(c)لكل صنفc - 2تنبأ بالصنف صاحب أكبر درجة
- 3التطبيع (normalization): اقسم كل درجة على مجموع الدرجات كلها. وهذا هو
predict_proba
عد الكلمات: MultinomialNB
| الرمز | المعنى |
|---|---|
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
| الكلمة | العدد في السليمة | العدد في المزعجة |
|---|---|---|
money | 38 | 155 |
online | 7 | 94 |
meeting | 153 | 1 |
meds | 0 | 30 |
المجموع N_c | 198 | 280 |
الخطوة 1: أي الكلمات يراها المرشح؟
المفردات: money وonline وmeeting وmeds
الخطوة 2: احتمالات الكلمات
o = online، وd = meds. المقامان: 198 + 4 = 202 للسليمة، و280 + 4 = 284 للمزعجة
الخطوة 3: الدرجتان
s(c) = P(c) مضروبا في احتمالات الكلمات
الخطوة 4: التطبيع
e = الرسالة
جربها: مرشح الرسائل المزعجة كلمة بكلمة
مشكلة العدد صفر
رسالة جديدة e: Money for the meeting? The meeting is about meds. الأعداد: m = money 1، وg = meeting 2، وd = meds 1
تنعيم لابلاس يعالجها
α = 1: يضاف واحد إلى كل عدد، فلا يكون أي احتمال 0 أبدا
الجزء 3
الدفتر 1: مرشح الرسائل المزعجة
افتح الدفتر في Colab
https://colab.research.google.com/github/
jeffprosise/Machine-Learning/blob/master/
E-Mail%20Classification.ipynburl = ("https://raw.githubusercontent.com/"
"jeffprosise/Machine-Learning/master/Data/ham-spam.csv")
df = pd.read_csv(url)تحميل البيانات وحذف المكرر
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
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
text = vectorizer.transform(['Why pay MORE for * expensive meds when you can ...123... order them online and save $$$?'])
print(vectorizer.inverse_transform(text))[array(['expensive', 'meds', 'online', 'order', 'order online', 'pay',
'save'], dtype='<U401')]التقسيم والتدريب
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 رسالة مزعجة

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) للرسائل المزعجة
تصنيف رسائل جديدة
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

url = ("https://raw.githubusercontent.com/tirthajyoti/"
"Machine-Learning-with-Python/master/"
"Datasets/wine.data.csv")
df = pd.read_csv(url)هل الخصائص مستقلة؟

- ▸
FlavanoidsمقابلTotal phenols: الارتباط (correlation) 0.86 - ▸
FlavanoidsمقابلOD280/OD315: 0.79 - ▸الافتراض الساذج خاطئ بوضوح هنا
الأرجحية الغاوسية
داخل كل صنف، يفترض أن الخاصية تتبع منحنى جرسيا
| الرمز | المعنى |
|---|---|
μ_c | متوسط (mean) الخاصية في الصنف c |
σ_c | الانحراف المعياري (standard deviation) للخاصية في الصنف c |
f(x | c) | ارتفاع المنحنى عند x: الأرجحية |
يدويا
مثال محلول: عينة نبيذ واحدة، وخاصية واحدة
Flavanoids على عينات النبيذ الـ178 كلها
| الصنف | العينات | المتوسط μ | الانحراف المعياري σ |
|---|---|---|---|
| 1 | 59 | 2.982 | 0.394 |
| 2 | 71 | 2.081 | 0.701 |
| 3 | 48 | 0.781 | 0.290 |
الخطوة 1: الأسس
الأس: -(x - μ)^2 / (2σ^2) مع x = 2.0
الخطوة 2: الكثافات
اضرب e مرفوعا إلى الأس في 1 / √(2πσ²) لتحصل على الكثافة (density)

الخطوة 3: الاحتمالات المسبقة والاحتمال اللاحق
الاحتمالات المسبقة: 59/178 و71/178 و48/178
| الصنف | f(x | c) | P(c) | الاحتمال اللاحق |
|---|---|---|---|
| 1 | 0.0453 | 0.3315 | 0.0625 |
| 2 | 0.5653 | 0.3989 | 0.9373 |
| 3 | 0.000200 | 0.2697 | 0.0002 |
جربها: Naive Bayes الغاوسي
التدريب على الخصائص الـ13 كلها
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 | |
|---|---|---|---|
| الحقيقي 1 | 19 | 0 | 0 |
| الحقيقي 2 | 2 | 19 | 1 |
| الحقيقي 3 | 0 | 0 | 13 |
تقرير معكوس
يطبع الدفتر classification_report(y_pred, y_test)
| الصيغة | الضبط | الاستدعاء | support |
|---|---|---|---|
(y_pred, y_test) | 0.86 | 1.00 | 19 |
(y_test, y_pred) | 1.00 | 0.86 | 22 |
قبل التمارين
الأخطاء الشائعة
- ▸قراءة البيانات من مجلد غير موجود في 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) |
|---|---|---|
click | 50 | 6 |
meeting | 1 | 89 |
نحو 10 دقائق
التمرين 2: مرشح الكلمات الأربع
الرسالة e: Make money online, no meeting needed
نحو 5 دقائق
التمرين 3: Naive Bayes الغاوسي يدويا
| الصنف | f(x | c) | P(c) | الدرجة |
|---|---|---|---|
| 1 | 0.4791 | 0.3315 | 0.1588 |
| 2 | 0.4760 | 0.3989 | 0.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 / 42 | 1 و0 من 54 صنفت خطأ |
الخلاصة
- 1تحول نظرية بايز الأرجحية التي يمكن عدها إلى الاحتمال اللاحق الذي نريده
- 2الافتراض الساذج: أرجحية الرسالة حاصل ضرب أرجحيات كلماتها
- 3تنبأ بالصنف صاحب أكبر ناتج لضرب الاحتمال المسبق في الأرجحيات، ثم طبق التطبيع لتحصل على احتمالات
- 4يمنع تنعيم لابلاس (
alpha=1) كلمة واحدة لم تظهر في صنف ما من فرض القيمة 0 - 5
MultinomialNBلأعداد الكلمات، وGaussianNBللخصائص العددية - 6يتدرب بالعد، لذا فهو سريع، وجيد حتى حين يكون الافتراض خاطئا
افتح هذا الدرس
Mahmoud Abas|التصنيف بخوارزمية Naive Bayes