المقاييس
درس 4 من 8
4المقاييس
الصورة الكبيرةالدقة تكذب عندما تكون الفئات غير متوازنة، وهذه هي الحالة في أغلب المسائل التي تستحق الحل: احتيال، أمراض، أعطال. الدقة الإيجابية والاستدعاء ومصفوفة الالتباس تخبرك بما حدث فعلًا.
ماذا تشاهد في الرسم: اثنا عشر تنبّؤًا تنقسم إلى أربع خانات: 3 إيجابي صحيح، و2 إنذار كاذب، و1 تفويت، و6 سلبي صحيح. كل مقياس تصنيف يُحسب من هذه الخانات: الدقة الإيجابية 3 من 5 تنبيهات، والاستدعاء 3 من 4 حالات حقيقية.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
لو كان واحد من كل مئة مريضًا، فنموذج يقول «الكل سليم» دائمًا يصيب في 99٪ من الحالات، ومع ذلك لم يكتشف أي مريض. لهذا لا تكفي «نسبة الصواب». تحتاج أن تسأل: من المرضى، كم اكتشفنا؟ ومن الذين قلنا إنهم مرضى، كم كانوا مرضى فعلًا؟
مصفوفة الخلط confusion matrix تعدّ الإيجابي والسلبي الصحيح والخاطئ. الإحكام precision = TP / (TP + FP) والاسترجاع recall = TP / (TP + FN)، وF1 متوسطهما التوافقي. وROC-AUC وPR-AUC يقيسان الأداء عبر كل العتبات، والثاني أصدق مع الفئات النادرة.
قبل أن تبدأ
✂️تقسيم البيانات
تعرف من درس التقسيم لماذا يُختار أي إعداد على التحقّق لا على الاختبار.
🔀الانحدار اللوجستي
تعرف أن predict_proba يعطي احتمالًا وأن predict يقارنه بعتبة 0.5.
الفكرة الجوهرية
الدقة تكذب عندما تكون الفئات غير متوازنة. تبدأ هنا بمثال تكذب فيه، ثم تستبدلها بسؤالين، ثم تحسبهما من أربع خانات، ثم تحرّك العتبة بينهما.
1لماذا تضلّل الدقة
مستشفى يجري 100 فحص، خمسة منها لمرضى فعلًا. نموذج كسول يقول «سليم» للجميع.
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score
y_true = np.array([0] * 95 + [1] * 5)
lazy = np.zeros(100, dtype=int)
print("accuracy :", accuracy_score(y_true, lazy))
print("recall :", recall_score(y_true, lazy))
print("precision:", precision_score(y_true, lazy, zero_division=0))
دقة 95%، واستدعاء صفر: لم يكتشف ولا مريضًا واحدًا. الرقم الأول يقول «ممتاز»، والثاني يقول الحقيقة.
انظر إلى الرسم: الدقة تعامل كل الأخطاء كأنها متساوية، فتغرق الفئة النادرة في الأكثرية.
2سؤالان بدل سؤال واحد
كل تنبّؤ يقع في خانة من أربع. انظر إلى الرسم: النموذج قال إيجابي أو سلبي، والحقيقة إيجابية أو سلبية.
الاستدعاء: من بين كل الحالات الإيجابية الحقيقية، كم اكتشفنا؟ الدقة الإيجابية (Precision): من بين كل ما قلنا إنه إيجابي، كم كان فعلًا إيجابيًا؟ الأول يعاقب التفويت، والثاني يعاقب الإنذار الكاذب.
الدقة الإيجابية = TP / (TP + FP)، وتنخفض مع كل إنذار كاذب. الاستدعاء = TP / (TP + FN)، وينخفض مع كل حالة فائتة، وهي غالبًا الخطأ الأغلى.
3من المصفوفة إلى المقاييس
مصفوفة الالتباس هي هذه الخانات الأربع في جدول. كل مقياس تصنيف آخر يُحسب منها.
اثنا عشر تنبّؤًا، أربع حالات إيجابية حقيقية. احسب الخانات الأربع ثم المقاييس منها.
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score
y_true = [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
y_pred = [1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0]
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
print(f"TP={tp} FP={fp} FN={fn} TN={tn}")
print(f"precision={precision_score(y_true, y_pred):.2f}")
print(f"recall ={recall_score(y_true, y_pred):.2f}")
print(f"f1 ={f1_score(y_true, y_pred):.2f}")
الدقة الإيجابية 3 / (3 + 2) = 0.60: من خمسة تنبيهات، ثلاثة صحيحة. الاستدعاء 3 / (3 + 1) = 0.75: من أربع حالات، التقطنا ثلاثًا. احسبهما بيدك من الخانات مرة، وستتذكّرهما بعدها دائمًا. وانتبه لترتيب ravel() في scikit-learn: tn, fp, fn, tp.
F1 يجمع الاثنين في رقم واحد، لكنه يفترض أن الخطأين متساويان، وهذا نادر.
4العتبة تحرّك المقايضة
النموذج يعطي احتمالًا، والعتبة تقرّر متى نقول «إيجابي». انظر إلى الرسم: كلما رفعت العتبة ارتفعت الدقة الإيجابية ونزل الاستدعاء.
نموذج واحد، وثلاث عتبات. الاحتمالات نفسها لا تتغيّر، فقط النقطة التي نقول عندها «إيجابي».
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=2000, weights=[0.9], random_state=1)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.5, random_state=1, stratify=y)
proba = LogisticRegression().fit(X_tr, y_tr).predict_proba(X_te)[:, 1]
for t in [0.2, 0.5, 0.8]:
pred = (proba >= t).astype(int)
print(f"threshold={t} precision={precision_score(y_te, pred):.2f} recall={recall_score(y_te, pred):.2f}")
عند 0.2 نلتقط 88% من الحالات لكن ثلث تنبيهاتنا كاذبة. عند 0.8 تنبيهاتنا صحيحة بنسبة 93% لكننا نفوّت نصف الحالات. لا توجد عتبة «صحيحة» رياضيًا، توجد عتبة صحيحة لتكلفة أخطائك. ولأنك تختارها، اخترها على التحقّق ثم أكّدها على الاختبار.
كيف يعمل، خطوة بخطوة: كيف تختار عتبة التصنيف
احسب احتمال الفئة الإيجابية لكل صف في مجموعة التحقّق بـ predict_proba.
جرّب عدة عتبات، وعند كل عتبة احسب الدقة الإيجابية والاستدعاء من خانات مصفوفة الالتباس.
قدّر تكلفة كل خطأ في الواقع: كم يكلّف التفويت، وكم يكلّف الإنذار الكاذب.
اختر العتبة التي تناسب تلك التكلفة، ثم أكّدها على الاختبار مرة واحدة دون تعديل.
أعمق قليلًا
| الحقيقة: إيجابي | الحقيقة: سلبي | |
|---|---|---|
| التنبّؤ: إيجابي | TP إيجابي صحيح | FP إنذار كاذب |
| التنبّؤ: سلبي | FN تفويت | TN سلبي صحيح |
مثال محلول
مستشفى فيه 100 فحص، خمسة منها لمرضى فعلًا. نموذج كسول يقول «سليم» للجميع.
average_precision_score.
classification_report من scikit-learn بعد كل تدريب. سطر لكل فئة بالدقة الإيجابية والاستدعاء وعدد العيّنات، فلا تختبئ فئة سيئة خلف متوسط جيد.
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| دقة عالية تعني نموذجًا جيدًا. | نموذج كسول يقول «سليم» لمئة فحص فيها خمسة مرضى يحصل على 95% واستدعاء صفر. |
| العتبة 0.5 هي الصحيحة رياضيًا. | هي قيمة افتراضية فقط. لا توجد عتبة صحيحة رياضيًا، بل عتبة تناسب تكلفة أخطائك. |
| F1 يحسم الاختيار بين المقياسين. | F1 مفيد كرقم واحد، لكنه يفترض أن الخطأين متساويان في الأهمية، وهذا نادر في الواقع. |
جرّب بنفسك
نموذج للكشف عن عيوب التصنيع: 40 تنبيهًا، منها 30 عيوب حقيقية، وفاتته 10 عيوب. ما الدقة الإيجابية والاستدعاء؟
TP = 30 وFP = 10 (أربعون تنبيهًا ناقص ثلاثين)، فالدقة الإيجابية 30/40 = 0.75. وFN = 10، فالاستدعاء 30/(30+10) = 0.75. التساوي هنا صدفة لأن FP وFN كلاهما 10.
خفضت العتبة من 0.5 إلى 0.3. ماذا تتوقّع؟
عتبة أقل تعني تنبيهات أكثر: نلتقط حالات إضافية كانت احتمالاتها بين 0.3 و0.5، فيرتفع الاستدعاء، لكن بعض هذه التنبيهات الإضافية خاطئة، فتنخفض الدقة الإيجابية. الاستدعاء لا يمكن أن ينخفض بخفض العتبة.
بطاقات مراجعة سريعة
تحقق من فهمك
نظام يفحص طلبات القروض ويحيل المشبوه لمراجع بشري يستطيع مراجعة 50 طلبًا يوميًا فقط. أي مقياس يهمّك أكثر؟
الدقة الإيجابية في أعلى 50 تنبيهًا، وتسمّى precision@50. المراجع لا يستطيع رؤية أكثر من 50، فاستدعاء عالٍ بألف تنبيه لا يفيد. المهم أن تكون الخمسون الأولى، مرتبة حسب الاحتمال، مليئة بالحالات الحقيقية. القيد العملي هو الذي يختار المقياس.
في مصفوفة الدرس، لماذا الدقة 0.75 بينما الدقة الإيجابية 0.60؟
الدقة تعدّ كل إجابة صحيحة، إيجابية وسلبية: (3 + 6) من 12 = 0.75. أما الدقة الإيجابية فتنظر إلى التنبيهات وحدها: 3 من 5.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.