تقييم النموذج: الدقة ومصفوفة الالتباس
كم نموذجك جيّد حقًّا؟ ولماذا الدقّة وحدها قد تكذب؟ ⏱ نحو 50 دقيقة.
- تحسب الدقّة وتدرك متى تخدع.
- تقرأ مصفوفة الالتباس وخاناتها الأربع.
- تميّز الضبط عن الاستدعاء.
- تختار المقياس حسب كلفة كل خطأ.
١الدقّة وحدها تخدع
بنيت مصنّفًا؛ كم هو جيّد؟ أبسط مقياسٍ الدقّة Accuracy: نسبة التنبؤات الصحيحة. لكنها تخدع مع الفئات غير المتوازنة: لو 95% من الزوّار لا يشترون، فمصنّفٌ يقول «لا أحد يشتري» دقّته 95% — وهو عديم الفائدة!
from sklearn.metrics import accuracy_score y_true = [0, 0, 1, 1, 0, 1, 0, 0] # الحقيقةy_pred = [0, 0, 1, 0, 0, 1, 0, 1] # تنبّؤ النموذجprint("الدقّة:", round(accuracy_score(y_true, y_pred), 3))
ستّ تنبّؤاتٍ صحيحة من ثمانٍ ← دقّة 0.75. لكن الدقّة لا تخبرنا أين أخطأ النموذج. لذلك نحتاج مصفوفة الالتباس.
٢مصفوفة الالتباس: أين الخطأ؟
تفصّل التنبؤات إلى أربع خانات: صوابٌ وخطأٌ لكل فئة. منها نعرف نوع الخطأ:
| تنبّأ: لا | تنبّأ: نعم | |
|---|---|---|
| الحقيقة: لا | سلبيّ صحيح TN | موجب كاذب FP (إنذار كاذب) |
| الحقيقة: نعم | سالب كاذب FN (فوّتناه) | موجب صحيح TP |
from sklearn.metrics import confusion_matrix y_true = [0, 0, 1, 1, 0, 1, 0, 0]y_pred = [0, 0, 1, 0, 0, 1, 0, 1]cm = confusion_matrix(y_true, y_pred)print(cm)tn, fp, fn, tp = cm.ravel()print(f"TN={tn} FP={fp} FN={fn} TP={tp}")
٣الدقّة والاستدعاء precision & recall
من المصفوفة يُشتقّ مقياسان أدقّ، اختر بينهما حسب الأهمّ:
| المقياس | يجيب عن | يهمّ حين |
|---|---|---|
| الضبط Precision | من قلنا «نعم»، كم صحّ؟ | الإنذار الكاذب مكلف |
| الاستدعاء Recall | من الفعلي «نعم»، كم أمسكنا؟ | تفويت الحالة مكلف |
from sklearn.metrics import precision_score, recall_score, classification_report y_true = [0, 0, 1, 1, 0, 1, 0, 0]y_pred = [0, 0, 1, 0, 0, 1, 0, 1]print("الضبط:", round(precision_score(y_true, y_pred), 3))print("الاستدعاء:", round(recall_score(y_true, y_pred), 3))
توقّع وتحقّق
نسبة التنبؤات الصحيحة هي:
الدقّة تخدع مع:
«من الفعلي نعم، كم أمسكنا» هو:
الإنذار الكاذب يقابل:
الخلاصة
- الدقّة نسبة الصواب، لكنها تخدع مع الفئات غير المتوازنة.
- مصفوفة الالتباس تفصّل الخطأ:
TNوFPوFNوTP. - الضبط «كم صحّ ممّا قلناه نعم»، والاستدعاء «كم أمسكنا من الفعلي نعم».
- لا مقياس واحد يصلح لكلٍّ؛ اختر بحسب كلفة الإنذار الكاذب أو التفويت.
تحدٍّ برمجي: قيّم التنبؤات
متقدمللمصفوفتين المعطاتين احسب: الدقّة مقرّبة لمنزلتين، وعدد الموجبات الكاذبة FP.
- اطبع
accuracy_scoreمقرّبًا لمنزلتين. - اطبع قيمة FP من مصفوفة الالتباس.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
from sklearn.metrics import accuracy_score, confusion_matrixy_true = [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]y_pred = [1, 0, 0, 1, 1, 0, 1, 0, 1, 1]# اطبع الدقّة (منزلتين) ثم عدد الموجبات الكاذبة FP
💡 تلميح 1
accuracy_score(y_true, y_pred).💡 تلميح 2
confusion_matrix(...).ravel() يعطي tn, fp, fn, tp.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
from sklearn.metrics import accuracy_score, confusion_matrixy_true = [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]y_pred = [1, 0, 0, 1, 1, 0, 1, 0, 1, 1]print(round(accuracy_score(y_true, y_pred), 2))tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()print(int(fp))