بعد اختيار النموذج وضبطه عبر Cross-Validation، تحتاج مقاييس دقيقة لتقييمه. Accuracy وحدها مضلّلة في كثير من الحالات. هذه الصفحة تشرح المقاييس الأساسية مع أمثلة عملية.
المشكلة الأساسية: Accuracy غير كافية
مثال
لديك 1000 بريد، 990 عادي و 10 مزعج. نموذج "غبي" يقول "كل شيء عادي":
y_true = [0]*990 + [1]*10 # 0 = عادي, 1 = مزعج
y_pred = [0]*1000 # النموذج يتنبأ دائمًا بـ "عادي"
from sklearn.metrics import accuracy_score
print(accuracy_score(y_true, y_pred)) # 0.99 — يبدو ممتازًا!
# لكن النموذج فشل تمامًا في كشف الـ 10 رسائل مزعج!
99% Accuracy مع 0% كشف للبريد المزعج. هذا كارثي.
لهذا نحتاج مقاييس أدقّ تأخذ بعين الاعتبار نوع الخطأ.
مصطلحات أساسية
لتنبؤ تصنيف ثنائي (0 = سالب، 1 = موجب)، هناك 4 احتمالات:
| فعلي سالب (0) | فعلي موجب (1) | |
|---|---|---|
| تنبؤ سالب (0) | True Negative (TN) — صح | False Negative (FN) — خطأ |
| تنبؤ موجب (1) | False Positive (FP) — خطأ | True Positive (TP) — صح |
- True Positive (TP): تنبّأتَ بالموجب وكان فعلًا موجبًا. ✅
- True Negative (TN): تنبّأتَ بالسالب وكان فعلًا سالبًا. ✅
- False Positive (FP): تنبّأتَ بالموجب لكنّه سالب. خطأ من النوع الأول، أو "إنذار كاذب".
- False Negative (FN): تنبّأتَ بالسالب لكنّه موجب. خطأ من النوع الثاني، أو "فرصة ضائعة".
مثال ملموس
فحص طبي لكشف مرض:
- TP: مريض، الاختبار قال مصاب → صح.
- TN: سليم، الاختبار قال سليم → صح.
- FP: سليم، الاختبار قال مصاب → قلق زائد، فحوصات إضافية.
- FN: مريض، الاختبار قال سليم → مرض لم يُكتشف. خطير!
Accuracy (الدقّة)
Accuracy = (TP + TN) / (TP + TN + FP + FN)
نسبة التنبؤات الصحيحة من الكل.
متى يعمل جيدًا: عندما تكون الفئات متوازنة تقريبًا.
متى يفشل: كما في مثال البريد أعلاه — عندما تكون فئة نادرة.
Precision (الدقّة الإيجابية)
Precision = TP / (TP + FP)
من بين كل ما تنبّأتَ بأنه موجب، كم كان فعلًا موجبًا؟
سؤال يجيب عنه: "إذا قلتُ إن هذا مزعج، كم فرصة أنني مصيب؟"
مثال: مصنّف بريد مزعج بدقة (Precision) = 0.95 → من بين كل ما صنّفته كمزعج، 95% فعلًا مزعج.
متى يهمّ Precision:
- إنذار كاذب مكلّف: فلترة بريد مزعج. لا تريد أن تصنّف بريدًا مهمًا كمزعج.
- اختبار طبي مع تكلفة نفسية عالية: لا تريد أن تقول لشخص سليم "أنت مريض".
- التوصيات: لا تريد أن توصي بمنتج لا يعجب الزبون.
Recall (الاستدعاء / الحساسية)
Recall = TP / (TP + FN)
من بين كل الحالات الموجبة الفعلية، كم اكتشفها النموذج؟
سؤال يجيب عنه: "من كل الموجب الفعلي، كم رصدتُ؟"
مثال: مصنّف بريد مزعج باستدعاء (Recall) = 0.85 → من بين كل البريد المزعج فعلًا، رصدتُ 85%.
متى يهمّ Recall:
- فقد الحالة مكلّف: كشف السرطان. لا تريد أن يفوتك مريض.
- كشف الاحتيال: لا تريد أن يمرّ محتال.
- الأمن: لا تريد أن يدخل متسلّل.
F1 Score
F1 = 2 × (Precision × Recall) / (Precision + Recall)
المتوسّط التوافقي بين Precision و Recall. رقم واحد يلخّص الاثنين.
- F1 = 1 → Precision و Recall كلاهما 1 (مثالي).
- F1 = 0 → واحد منهم على الأقل 0.
- يصلح للتصنيف غير المتوازن.
from sklearn.metrics import f1_score
print(f1_score(y_true, y_pred))
Confusion Matrix (مصفوفة الارتباك)
تمثيل بصري للأخطاء:
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
cm = confusion_matrix(y_true, y_pred)
print(cm)
# [[TN FP]
# [FN TP]]
sns.heatmap(cm, annot=True, fmt='d')
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.show()
القراءة:
- الخلية (0,0) = TN (صحيح سليم).
- الخلية (0,1) = FP (إنذار كاذب).
- الخلية (1,0) = FN (فائت).
- الخلية (1,1) = TP (صحيح موجب).
مثال تطبيقي شامل
سيناريو: كشف الاحتيال
- 10,000 معاملة.
- 9,950 عادية، 50 احتيال.
| فعلي عادي | فعلي احتيال | |
|---|---|---|
| تنبّأ عادي | TN = 9,940 | FN = 10 |
| تنبّأ احتيال | FP = 10 | TP = 40 |
- Accuracy = (9940 + 40) / 10000 = 0.998 (ممتاز ظاهريًا).
- Precision = 40 / (40 + 10) = 0.80 (من الإنذارات، 80% احتيال فعلًا).
- Recall = 40 / (40 + 10) = 0.80 (رصدنا 80% من الاحتيال).
- F1 = 0.80.
الآن الصورة أوضح: رغم Accuracy 99.8%، فاتنا 20% من الاحتيال. Recall منخفض.
كيف نرفع Recall؟
نخفّض عتبة التنبؤ (مثلًا من 0.5 إلى 0.3):
- نتنبّأ بـ "احتيال" حتى لو النموذج أقل ثقة.
- ↑ FP، ↓ FN → ↑ Recall، ↓ Precision.
هذا Trade-off — رفع واحد يخفض الآخر. يعتمد اختيارك على السياق (هل خطأ FP أسوأ أم FN؟).
ROC Curve و AUC
ROC Curve = منحنى يربط Recall (y-axis) بـ False Positive Rate (x-axis) عند عتبات مختلفة.
AUC (Area Under Curve) = المساحة تحت المنحنى. بين 0 و 1.
- AUC = 1 → نموذج مثالي.
- AUC = 0.5 → نموذج عشوائي.
- AUC < 0.5 → أسوأ من العشوائي (خطأ في الإعداد).
from sklearn.metrics import roc_curve, auc
# الحصول على احتمالات (وليس فئات)
y_proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
roc_auc = auc(fpr, tpr)
import matplotlib.pyplot as plt
plt.plot(fpr, tpr, label=f'ROC (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--') # خط العشوائي
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
Multi-class: ماذا يتغيّر؟
في التصنيف متعدد الفئات، المقاييس تُطبَّق لكل فئة ثم تُجمَع:
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
precision recall f1-score support
class_0 0.95 0.98 0.96 100
class_1 0.92 0.88 0.90 50
class_2 0.85 0.90 0.87 50
accuracy 0.93 200
macro avg 0.91 0.92 0.91 200
weighted avg 0.93 0.93 0.93 200
- Macro avg: متوسّط بسيط (كل فئة متساوية).
- Weighted avg: متوسّط مرجّح بحجم كل فئة.
أيّ مقياس أختار؟
| الحالة | المقياس الأنسب |
|---|---|
| فئات متوازنة، اهتمام متساوٍ | Accuracy |
| فئة نادرة مهمّة جدًا | Recall |
| الإنذار الكاذب مكلّف | Precision |
| ملخّص واحد للاختيار بين النماذج | F1 |
| التصنيف غير المتوازن بشكل كبير | ROC-AUC |
| التصنيف متعدد الفئات | Macro/Weighted F1 |
نصائح عملية
- دائمًا اطبع confusion matrix — يعطيك صورة فورية لأنواع الأخطاء.
- اختر المقياس حسب السياق — لا تقل "Accuracy 95%!" دون فحص ما يعنيه ذلك.
- في التصنيف غير المتوازن، Accuracy وحدها لا تكفي أبدًا.
- استخدم ROC-AUC لمقارنة النماذج بشكل مستقل عن العتبة.
أخطاء شائعة
- "Accuracy 99% يعني النموذج ممتاز": كما في مثال البريد — يمكن أن يكون كارثيًا مع فئة نادرة.
- "Precision + Recall = F1": خطأ. F1 هو متوسّط توافقي، ليس جمعًا.
- "AUC = 0.8 يعني 80% من التنبؤات صحيحة": لا — AUC مقياس الترتيب، ليس الدقّة.
- "العتبة 0.5 عالمية": تختلف حسب توزيع الفئات. اخترها بناءً على validation set.
الخطوات التالية
- Overfitting و Bias-Variance — كيف تربط هذه المقاييس بالمشاكل الكلاسيكية.
- الانحدار والتصنيف — متى تستخدم كلًّا من النوعين.
- تقسيم البيانات و Cross-Validation — كيف تحصل على تقييم موثوق.
📊 لاحقًا في المسار: تقييم نماذج اللغة الكبيرة (LLMs) — له مقاييس مختلفة لأنواع مختلفة من المهام.