تُعد عملية تقييم النماذج التنبؤية في ميدان تعلم الآلة (Machine Learning) والإحصاء التطبيقي ركيزة جوهرية لا غنى عنها لضمان موثوقية القرارات الخوارزمية. فعند تدريب خوارزميات التصنيف الخاضعة للإشراف (Supervised Classification Algorithms)، لا يقتصر الهدف على توليد نموذج قادر على حفظ البيانات التدريبية، بل يتعداه إلى بناء منظومة إحصائية قادرة على التعميم والتنبؤ بدقة على بيانات غير مرئية. ومن هنا تنشأ الحاجة الملحة إلى أدوات قياس دقيقة تتجاوز مجرد حساب النسب الإجمالية للنجاح، لتغوص في التفاصيل البنيوية لأنماط التنبؤ الصحيحة والخاطئة على حد سواء.
تمثل مصفوفة الارتباك (Confusion Matrix) حجر الزاوية والمعيار التشخيصي الأعمق لتحليل كفاءة نماذج التصنيف الثنائية والمتعددة الفئات. إنها ليست مجرد جدول إحصائي تقليدي، بل هي أداة تحليلية بصرية تفكك مخرجات النماذج وتكشف عن مواطن الضعف بدقة مجهرية؛ حيث تميز بين الحالات التي أصاب فيها النموذج والحالات التي ضل فيها، وتفصل بين أنواع الأخطاء المختلفة من حيث خطورتها وكلفتها الإحصائية والتطبيقية. في سياق لغة البرمجة بايثون (Python)، تتوفر حزمة متكاملة من المكتبات المتطورة مثل Scikit-Learn و NumPy و Pandas و Seaborn، والتي تتيح بناء وتحليل وعرض هذه المصفوفة بأعلى مستويات الاحترافية البرمجية والإحصائية.
في هذا الدليل الأكاديمي الشامل، سنستعرض بعمق نظري وتطبيقي كيفية إنشاء مصفوفة الارتباك في بايثون خطوة بخطوة، بدءاً من تفكيك الأسس الرياضية والنظرية الكامنة خلفها، مروراً بكتابة الأكواد البرمجية الدقيقة وتطويع مكتبات التمثيل البياني لإنتاج خرائط حرارية عالية الدقة، ووصولاً إلى حساب المقاييس المتقدمة المشتقة منها مثل الحساسية، والدقة التنبؤية، ومقياس F1، مع تسليط الضوء على التطبيقات المتقدمة في النمذجة السلوكية والتشخيص الإكلينيكي وحالات عدم توازن البيانات.
- 1. مقدمة شاملة حول مصفوفة الارتباك (Confusion Matrix) وأهميتها
- 2. البنية الهيكلية والمكونات الأساسية لمصفوفة الارتباك الثنائية (2×2)
- 3. إعداد وتجهيز بيئة العمل البرمجية في بايثون
- 4. إنشاء مصفوفة الارتباك برمجياً باستخدام Scikit-Learn
- 5. التحليل الإحصائي لمخرجات مصفوفة الارتباك في بايثون
- 6. استخراج وحساب مقاييس الأداء المتقدمة من المصفوفة
- 7. التمثيل البصري لمصفوفة الارتباك باستخدام Seaborn و Matplotlib
- 8. استخدام فئة ConfusionMatrixDisplay الحديثة في Scikit-Learn
- 9. تطبيق عملي كامل: تدريب نموذج انحدار لوجستي وتقييمه بمصفوفة الارتباك
- 10. إنشاء مصفوفة الارتباك للتصنيف متعدد الفئات (Multi-class Classification)
- 11. أفضل الممارسات والأخطاء الشائعة عند التعامل مع مصفوفة الارتباك
- 12. الخلاصة والتطبيقات النفسية والسلوكية المتقدمة لنماذج التصنيف
- المراجع (References)
1. مقدمة شاملة حول مصفوفة الارتباك (Confusion Matrix) وأهميتها
1.1 المفهوم الرياضي والنظري لمصفوفة الارتباك
تُعرف مصفوفة الارتباك (المعروفة أيضاً بمصفوفة الخطأ أو مصفوفة الالتباس) رياضياً بأنها مصفوفة مربعة ذات بعد يتطابق مع عدد الفئات التصنيفية المستهدفة في النموذج الرياضي. في فضاء التصنيف الثنائي، تتكون المصفوفة من جدول ثنائي الأبعاد بأبعاد محددة بحجم خلايا تصنيفية (2×2)، حيث يعكس أحد المحاور الفئات الحقيقية المسجلة فعلياً في مجتمع العينة، بينما يمثل المحور المقابل الفئات التنبؤية التي استنتجتها الخوارزمية. إن هذا التمثيل الجدولي يتيح للباحثين إجراء مقارنة تقاطعية دقيقة بين الواقع الملاحظ والنتائج المقدرة.
تتجلى الأهمية النظرية للمصفوفة في قدرتها الفائقة على معالجة القصور الجوهري الذي تعاني منه مقاييس التقييم السطحية ذات البعد الواحد. فالكثير من المقاييس الكلاسيكية تعطي رقماً مجملاً يلخص الأداء، مما يخفي خلفه توزيع الأخطاء واتجاهاتها التحيزية. تتيح مصفوفة الارتباك تشريح السلوك الرياضي للنموذج عبر تحويل فضاء الاحتمالات المستمر إلى مصفوفة احتمالية شرطية توضح احتمالية تصنيف العينة ضمن فئة معينة بمعلومية انتمائها الفعلي لفئة أخرى، مما يوفر أساساً متيناً لاختبار الفرضيات الإحصائية وتقييم متانة النماذج الرياضية.
علاوة على ذلك، توفر مصفوفة الارتباك الأساس الرياضي لحساب مصفوفة الخسارة المتوقعة (Expected Loss Matrix) ومصفوفة التكلفة والمنفعة (Cost-Benefit Matrix)؛ إذ في التطبيقات الحقيقية لا تتساوى تكلفة الوقوع في خطأ معين مع تكلفة الوقوع في خطأ آخر. وبناءً على ذلك، تشكل المصفوفة نقطة الانطلاق الأساسية لنظرية القرار البايزية (Bayesian Decision Theory)، حيث تُستخدم الاحتمالات التقاطعية المستخرجة من خلايا المصفوفة لإعادة ضبط عتبات القرار الرياضية وتقليل المخاطرة الإجمالية للنموذج.
1.2 دور مصفوفة الارتباك في تقييم نماذج الانحدار اللوجستي
يعد الانحدار اللوجستي (Logistic Regression) أحد النماذج الإحصائية القياسية المستخدمة في التنبؤ بالمتغيرات التابعة الثنائية، حيث يقوم بتقدير لوغاريتم الأرجحية (Log-Odds) لاحتمالية وقوع الحدث عبر دالة السيجمويد (Sigmoid Function). تنتج هذه الخوارزمية قيماً احتمالية مستمرة تقع حصراً في النطاق المحصور بين الصفر والواحد الصحيح. ولتحويل هذه الاحتمالات المستمرة إلى تصنيفات فئوية قاطعة، يتم تطبيق عتبة تصنيفية (Classification Threshold) محددة مسبقاً، والتي يُفترض أن تكون تقليدياً مساوية للقيمة 0.5 ما لم يُنص على خلاف ذلك.
هنا يبرز الدور الحيوي لمصفوفة الارتباك كمعيار أساسي للتحقق من كفاءة هذا التحويل الاحتمالي؛ فالنموذج اللوجستي قد يولد احتمالات متقاربة حول نقطة الفصل، مما يستدعي تقييماً معمقاً لمدى قدرة العتبة المختارة على فصل الفئات بشكل حاسم. تتيح مصفوفة الارتباك للمحلل مراقبة كيفية تغير التوزيع التكراري للإيجابيات والسلبيات عند تعديل العتبة، مما يكشف عن الخصائص التوزيعية للبواقي الإحصائية (Statistical Residuals) الخاصة بالنموذج اللوجستي ومدى استيفائه لافتراضات الفصل الخطي في فضاء المتغيرات المستقلة.
تساعد المصفوفة أيضاً في تشخيص مشكلات الانحدار اللوجستي المعقدة مثل الانفصال شبه التام (Quasi-Complete Separation) أو مشكلة التوافق الزائد (Overfitting)، حيث يظهر التقييم عبر مصفوفة الارتباك على بيانات التدريب والاختبار وجود فروقات شاسعة في نسب التصنيف الصحيح عبر الفئات المختلفة، مما يعطي مؤشراً دقيقاً على الحاجة إلى تطبيق أساليب التنظيم الإحصائي (Regularization) مثل L1 (Lasso) أو L2 (Ridge) لضبط معاملات النموذج.
1.3 مقارنة مصفوفة الارتباك بمقاييس الأداء العامة
يعتمد الكثير من الممارسين المبتدئين في علم البيانات على مقياس الدقة الإجمالية (Accuracy) كمؤشر وحيد لتقييم كفاءة الخوارزميات، وهو المقياس الذي يمثل النسبة المئوية لإجمالي التنبؤات الصحيحة مقسومة على العدد الكلي للعينات. ومع ذلك، يعاني هذا المقياس من قصور رياضي خطير يُعرف بـ “مفارقة الدقة” (Accuracy Paradox)، لا سيما عند التعامل مع مجموعات البيانات غير المتوازنة (Imbalanced Datasets) التي تمثل فيها فئة معينة الغالبية الساحقة من العينات، كحالات اكتشاف الاحتيال المالي أو الكشف عن الأمراض النادرة.
في مثل هذه السيناريوهات، إذا كانت الفئة السلبية تمثل 99% من البيانات، فإن أي نموذج ساذج يتنبأ دائماً بالسلبية سيحقق دقة إجمالية تبلغ 99%، على الرغم من فشله التام في التعرف على أي حالة إيجابية واحدة. تتجاوز مصفوفة الارتباك هذا القصور الجذري عبر تفكيك الدقة الإجمالية إلى مكوناتها الأولية؛ فهي تكشف بدقة متناهية أن نسبة الـ 1% المفقودة تمثل الإخفاق الكلي في الفئة المستهدفة، مما يمنع الوقوع في فخ التقييمات الزائفة والمضللة التي قد تؤدي إلى كوارث تشغيلية أو بحثية.
علاوة على ذلك، تمنح مصفوفة الارتباك مهندسي التعلم الآلي والباحثين رؤية عميقة تمكنهم من إعادة ضبط أوزان الفئات (Class Weights) في دوال التكلفة (Loss Functions). فعندما توضح المصفوفة انحياز النموذج المستمر نحو الفئة الأكبر، يمكن تعديل معاملات دالة الخطأ لفرض عقوبات رياضية مضاعفة على الأخطاء المرتكبة بحق الفئة الأقل تمثيلاً، وهو ما لا يمكن تحقيقه بمجرد النظر إلى المقاييس التجميعية العامة.

2. البنية الهيكلية والمكونات الأساسية لمصفوفة الارتباك الثنائية (2×2)
2.1 الإيجابيات الحقيقية (True Positives) والسلبيات الحقيقية (True Negatives)
ترتكز مصفوفة الارتباك الثنائية على أربعة مكونات أساسية تتوزع داخل خلاياها الأربع. المكون الأول هو “الإيجابيات الحقيقية” ويرمز له بـ (TP – True Positives)، ويمثل عدد الحالات التي تنتمي فعلياً إلى الفئة الإيجابية وتوقع النموذج بنجاح انتمائها إلى نفس الفئة الإيجابية. تعكس هذه القيمة قدرة النموذج على رصد الظاهرة المستهدفة بدقة دون إغفالها، وتشكل البسط الرئيسي في حساب معظم مؤشرات الحساسية والكفاءة الإكلينيكية.
أما المكون الثاني فهو “السلبيات الحقيقية” ويرمز له بـ (TN – True Negatives)، وهو يعبر عن عدد الحالات التي تنتمي في الأصل إلى الفئة السلبية وتنبأ النموذج بشكل صحيح بسلبيتها. يجسد هذا المكون قدرة النموذج على استبعاد الحالات السليمة أو غير المستهدفة، مما يمنع إطلاق الإنذارات غير المبررة. في السياق الإحصائي، يمثل مجموع القيم الواقعة على القطر الرئيسي للمصفوفة (الممتد من أعلى اليسار إلى أسفل اليمين في الترتيب المعياري) إجمالي القرارات الصائبة رياضياً.
يحمل التوافق الإحصائي للقيم الواقعة على القطر الرئيسي دلالة مباشرة على الاستقرار الهيكلي للنموذج؛ فكلما تركزت الكثافة العددية للبيانات على هذا القطر، دل ذلك على اقتراب النموذج من المحاكاة المثالية للواقع التوزيعي للمتغير التابع، وقلت مستويات التشتت العشوائي في مخرجات دالة التنبؤ.
2.2 الإيجابيات الخاطئة (False Positives – خطأ النوع الأول)
يقع المكون الثالث في الخلية غير القطرية العلوية أو السفلية (تبعاً لترتيب المحاور المتبع)، وهو “الإيجابيات الخاطئة” ويرمز له بـ (FP – False Positives). يُعرف هذا المكون في الإحصاء الاستدلالي واختبار الفرضيات باسم خطأ النوع الأول (Type I Error) أو “مستوى الدلالة ألفا” ($\alpha$). يحدث هذا الخطأ عندما يتنبأ النموذج بأن الحالة إيجابية في حين أن واقعها الفعلي والبيولوجي أو الميداني سلبي تماماً، وهو ما يطلق عليه بالعامية “الإنذار الكاذب” (False Alarm).
تتعدد الأمثلة التطبيقية لهذا الخطأ عبر الميادين العلمية؛ ففي تشخيص الأورام السرطانية، يتمثل خطأ الإيجابية الخاطئة في تصنيف ورم حميد على أنه خبيث، مما يقود المريض إلى الخضوع لإجراءات جراحية وعلاجية قاسية وغير ضرورية تسبب أضراراً جسدية ونفسية فادحة. وفي قطاع الأمن السيبراني، يمثل تصنيف معاملة مالية مشروعة أو بريد إلكتروني اعتيادي على أنه هجوم اختراق أو رسالة احتيالية نموذجاً مباشراً لخطأ النوع الأول، مما يؤدي إلى تعطيل الأعمال وتجربة المستخدم.
تترتب على الإيجابيات الخاطئة كلفة اقتصادية وبحثية معتبرة؛ إذ تتطلب التحقق اليدوي المتكرر وإهدار الموارد التشغيلية في التعامل مع أحداث وهمية. لذا، يركز مهندسو النماذج في البيئات عالية التكلفة على خفض هذا المكون إلى أدنى حد ممكن عن طريق رفع عتبات الحذر الاحتمالي للنموذج.
2.3 السلبيات الخاطئة (False Negatives – خطأ النوع الثاني)
المكون الرابع الحاسم في مصفوفة الارتباك هو “السلبيات الخاطئة” ويرمز له بـ (FN – False Negatives)، ويمثل إحصائياً ما يُعرف بـ خطأ النوع الثاني (Type II Error) أو “بيتا” ($\beta$). يقع هذا الخطأ عندما يتنبأ النموذج بأن الحالة سلبية (أي عدم وجود الظاهرة)، بينما هي في الواقع إيجابية بالكامل. يمثل هذا الموقف فشلاً ذريعاً للنموذج في التقاط الإشارة الحقيقية، ويُشار إليه تقنياً بـ “التفويت” (Miss).
تعتبر السلبيات الخاطئة في معظم التطبيقات الحيوية أشد فتكاً وخطورة من الإيجابيات الخاطئة بمراحل؛ ففي المجال الطبي، يعني تشخيص مريض مصاب بمرض قاتل بأنه سليم وسلبي إغفال التدخل العلاجي المبكر، مما قد يؤدي حتماً إلى تدهور حالته الصحية والوفاة. وفي سياق رصد الزلازل أو الأعاصير، فإن السلبية الخاطئة تعني عدم إطلاق صافرات الإنذار لكارثة قادمة، مما ينتج عنه خسائر بشرية ومادية هائلة.
تبرز المقارنة بين خطأ النوع الأول وخطأ النوع الثاني المقايضة الجوهرية (Trade-off) المتأصلة في نظرية التعلم الإحصائي؛ إذ إن خفض السلبيات الخاطئة يتطلب غالباً التساهل في عتبة القرار، مما يؤدي بالضرورة إلى زيادة الإيجابيات الخاطئة، والعكس صحيح. وتوفر مصفوفة الارتباك المنصة الرياضية الدقيقة لقياس هذه التكلفة التبادلية والموازنة بينهما وفقاً للمحددات الأخلاقية والمادية للمشروع.
3. إعداد وتجهيز بيئة العمل البرمجية في بايثون
3.1 تثبيت واستدعاء المكتبات الحسابية الأساسية
تتطلب معالجة وتوليد مصفوفات الارتباك في بايثون بنية تحتية برمجية مستقرة تعتمد على الحزم الحسابية القياسية في منظومة علوم البيانات. تبدأ العملية بتهيئة مكتبة NumPy التي توفر هياكل مصفوفات متعددة الأبعاد عالية الأداء وتتيح إجراء العمليات الجبرية المتجهية (Vectorized Operations) بسرعة استثنائية مكتوبة بلغة C، وهو أمر أساسي للتعامل مع متجهات التنبؤ والتسميات الحقيقية ذات الأحجام الضخمة.
إلى جانب ذلك، تُعد مكتبة Pandas الأداة المركزية لإدارة واستكشاف وتنظيف مجموعات البيانات الجدولية (DataFrames)؛ حيث تُستخدم لتجهيز مصفوفات الميزات وإجراء عمليات الترميز الفئوي والتعامل مع القيم المفقودة قبل تمرير المتغيرات للنماذج. يمكن تثبيت هذه الحزم عبر مدير الحزم القياسي من خلال تشغيل الأمر التالي في بيئة الطرفية أو دفاتر جوبيتر:
pip install numpy pandas scikit-learn matplotlib seaborn
بعد اكتمال عملية التثبيت، يتم استدعاء المكتبات داخل بيئة العمل البرمجية بالأسماء المستعارة المتفق عليها عالمياً لضمان وضوح الكود وقابليته للقراءة والصيانة وفق المعايير البرمجية الصارمة:
import numpy as np
import pandas as pd
3.2 تضمين مكتبة Scikit-Learn المتخصصة
تُعد حزمة Scikit-Learn (sklearn) المكتبة المعيارية الذهبية لتعلم الآلة في بايثون؛ إذ توفر ترسانة متكاملة من الخوارزميات ووحدات القياس الإحصائي الدقيقة. للاستفادة من وظائف تقييم التصنيف، يتم استيراد وحدة المقاييس المخصصة sklearn.metrics، والتي تحتوي على دوال حساب مصفوفة الارتباك وكافة المقاييس الفرعية المستنبطة منها، بالإضافة إلى أدوات التقسيم الإحصائي للبيانات والتحقق المتقاطع.
يتم تضمين الوحدات المسؤولة عن بناء مصفوفة الارتباك وتوليد تقارير الأداء التفصيلية عبر التعليمات البرمجية التالية:
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.model_selection import train_test_split
تتميز أدوات Scikit-Learn بتوافقها الرياضي التام مع هياكل مصفوفات NumPy وسلاسل Pandas، مما يتيح التبديل السلس بين التنسيقات البرمجية المختلفة دون إهدار للذاكرة الحسابية أو حدوث أخطاء في تتبع الأنواع البيانية (Data Type Inconsistencies).
3.3 تهيئة أدوات التمثيل البصري والرسومي
على الرغم من إمكانية طباعة مصفوفة الارتباك كمصفوفة رقمية نصية خام، إلا أن التمثيل البصري يظل الخطوة الحاسمة لتحليل الأنماط وفهم تركز التنبؤات بسرعة ووضوح. تعتمد منظومة بايثون الرسومية على مكتبة Matplotlib لتوفير التحكم الهندسي الدقيق في أبعاد اللوحات البيانية وتدرجات المحاور والخطوط ودقة المخرجات.
ولإضفاء طابع إحصائي واحترافي على المخططات، يتم دمج مكتبة Seaborn المبنية فوق Matplotlib، والتي توفر دوال متخصصة في رسم الخرائط الحرارية (Heatmaps) ذات التدرجات اللونية المعايرة إحصائياً لعرض المصفوفات بكفاءة. يتم استدعاء الأدوات وضبط بيئة العرض التنسيقية كما يلي:
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import ConfusionMatrixDisplay
# ضبط المظهر الجمالي العام للمخططات
sns.set_theme(style="whitegrid", palette="muted")
plt.rcParams['font.sans-serif'] = 'DejaVu Sans'
plt.rcParams['axes.unicode_minus'] = False
4. إنشاء مصفوفة الارتباك برمجياً باستخدام Scikit-Learn
4.1 استخدام دالة confusion_matrix الأساسية
توفر وحدة sklearn.metrics الدالة القياسية confusion_matrix() التي تقوم بعمليات الحوسبة الإحصائية اللازمة لتقاطع المتجهات التنبؤية مع المتجهات الحقيقية. تقبل الدالة عدة معاملات مدخلة جوهرية تحدد كيفية حساب المصفوفة وتنسيق مخرجاتها، وأهم هذه المعاملات:
y_true: المتجه أحادي البعد الذي يحتوي على التسميات الفئوية الحقيقية (Ground Truth) للعينات المدروسة.y_pred: المتجه المقابل الذي يحتوي على القيم التنبؤية التي ولدها النموذج الخوارزمي لنفس العينات.labels: قائمة اختيارية تحدد ترتيب ومجموعة الفئات التي ستظهر في المصفوفة، وهو مفيد لترتيب المصفوفة أو تقييدها بفئات فرعية.sample_weight: مصفوفة اختيارية تحدد أوزان العينات في حال كانت بعض الملاحظات ذات أهمية إحصائية مضاعفة.normalize: معامل نصي يحدد ما إذا كان المطلوب تطبيع مخرجات المصفوفة كنسب مئوية؛ ويقبل القيم'true'للتطبيع عبر الصفوف الحقيقية، أو'pred'للتطبيع عبر الأعمدة المتوقعة، أو'all'للتطبيع عبر الحجم الكلي للعينة.
4.2 كتابة وتطبيق الكود البرمجي للمصفوفة الثنائية
لتوضيح الآلية البرمجية بأسلوب عملي مباشر، سنفترض وجود مجموعة بيانات محاكاة تتكون من تصنيفات ثنائية حقيقية وتنبؤات مقابلة مستخرجة من نموذج تصنيفي. يتم تمثيل القيم الحقيقية كمتجه أصفار وآحاد (حيث 0 يمثل السلبية و1 يمثل الإيجابية)، ثم تمرير المتجهين إلى الدالة للحصول على مصفوفة 2×2:
# تعريف التسميات الحقيقية والتنبؤات الافتراضية
y_actual = np.array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0])
y_predicted = np.array([1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1])
# حساب مصفوفة الارتباك الإحصائية
cm = confusion_matrix(y_actual, y_predicted)
print("مصفوفة الارتباك الناتجة:n", cm)
تقوم الخوارزمية الداخلية لـ Scikit-Learn بفرز التسميات تصاعدياً افتراضياً؛ وبالتالي فإن الصف الأول والعمود الأول يمثلان الفئة (0 – السلبية)، بينما يمثل الصف الثاني والعمود الثاني الفئة (1 – الإيجابية)، وهو المعيار الرياضي الذي يجب الانتباه إليه بدقة عند قراءة النتائج.
4.3 استخراج وتفكيك عناصر المصفوفة برمجياً
في بيئة التحليل البرمجي، يحتاج الباحث غالباً إلى استخراج قيم الخلايا الفردية لمصفوفة الارتباك لاستخدامها في حساب معادلات مخصصة أو لتسجيلها في قواعد بيانات التقييم. توفر مكتبة NumPy الدالة الرياضية .ravel() التي تقوم بتسطيح (Flattening) المصفوفة ثنائية الأبعاد وتحويلها إلى مصفوفة خطية أحادية البعد.
في حالة التصنيف الثنائي المنظم وفق الترتيب القياسي، يمكن تفكيك المتغيرات الأربعة في سطر برمجي واحد وبكفاءة رياضية مطلقة كما يلي:
# تفكيك عناصر المصفوفة إلى المتغيرات الأربعة الأساسية
tn, fp, fn, tp = confusion_matrix(y_actual, y_predicted).ravel()
# طباعة القيم المستخرجة والتحقق من المجموع الكلي
print(f"السلبيات الحقيقية (TN): {tn}")
print(f"الإيجابيات الخاطئة (FP): {fp}")
print(f"السلبيات الخاطئة (FN): {fn}")
print(f"الإيجابيات الحقيقية (TP): {tp}")
total_samples = tn + fp + fn + tp
assert total_samples == len(y_actual), "خطأ: مجموع عناصر المصفوفة لا يطابق حجم العينة الكلي!"
5. التحليل الإحصائي لمخرجات مصفوفة الارتباك في بايثون
5.1 قراءة وتفسير مصفوفة النتائج الناتجة
تتطلب القراءة العلمية لمصفوفة الارتباك فهماً دقيقاً للمنظور التوزيعي للبيانات داخل الخلايا؛ فالصفوف تمثل الواقع المرجعي القطعي (Ground Truth Rows)، بينما تمثل الأعمدة آراء وتخمينات الخوارزمية الرياضية (Prediction Columns). عند النظر إلى تقاطع الصف الأول (الفئة الحقيقية 0) مع العمود الأول (الفئة المتوقعة 0)، نجد عدد الحالات السلبية التي أصاب النموذج في تحديدها (TN).
وعند الانتقال أفقياً في نفس الصف الأول إلى العمود الثاني (الفئة المتوقعة 1)، نجد الحالات السلبية التي أخطأ النموذج واعتبرها إيجابية (FP). وبالمثل، في الصف الثاني (الفئة الحقيقية 1)، يمثل العمود الأول الحالات الإيجابية التي فات على النموذج رصدها واعتبرها سلبية (FN)، بينما يمثل العمود الثاني الحالات الإيجابية المكتشفة بنجاح (TP).
يتيح هذا التحليل الأفقي والعمودي الكشف عن الانحيازات النمطية للخوارزمية؛ فإذا لاحظنا تراكماً ملحوظاً في عمود السلبيات مقارنة بالإيجابيات، دل ذلك على أن النموذج يعاني من تحفظ تنبؤي مفرط (Conservative Bias)، في حين يشير التراكم في عمود الإيجابيات إلى تساهل مفرط وارتفاع في معدل الإنذارات الكاذبة.
5.2 حساب معدلات الأخطاء الإحصائية
تتيح مصفوفة الارتباك استخراج معدلات أخطاء معيارية تلعب دوراً محورياً في نظرية الكشف عن الإشارات (Signal Detection Theory) وتقييم الأنظمة الحيوية. من أبرز هذه المقاييس نجد “معدل الإيجابيات الخاطئة” (False Positive Rate – FPR)، والذي يمثل النسبة المئوية للحالات السلبية التي صُنفت خطأً على أنها إيجابية، ويُحسب بالمعادلة الإحصائية التالية:
$$\text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}} = 1 – \text{Specificity}$$
في المقابل، يُعرف “معدل السلبيات الخاطئة” (False Negative Rate – FNR) بأنه نسبة الحالات الإيجابية التي فشل النموذج في رصدها وصنفها سلبية، ويُعبر عنه رياضياً بـ:
$$\text{FNR} = \frac{\text{FN}}{\text{TP} + \text{FN}} = 1 – \text{Sensitivity}$$
يمكن برمجة هذه المعدلات في بايثون بسهولة باستخدام القيم المفككة سابقاً، مما يوفر للمحلل مؤشرات رقمية واضحة حول طبيعة الأخطاء المرتكبة ومدى توازن حساسية الخوارزمية مع نوعيتها الإحصائية.
5.3 مقارنة دقة النموذج بقواعد التخمين العشوائي
لا تكتمل المعالجة الإحصائية لمصفوفة الارتباك دون مقارنة نتائج النموذج مع ما يُعرف بنماذج الأساس المرجعية (Baseline Models) أو التخمين العشوائي المتكافئ. إذا كانت لدينا مجموعة بيانات تحتوي على 70% من الفئة السلبية و30% من الفئة الإيجابية، فإن نموذج التخمين الأعمى الذي يختار الفئة الأكثر شيوعاً سيحقق دقة إجمالية تبلغ 70%، ولكنه سيولد مصفوفة ارتباك مشوهة تماماً تتضمن $\text{TP} = 0$ و $\text{FN} = 30%$.
من خلال مصفوفة الارتباك، يمكن تقييم ما إذا كان النموذج المتعلم يكتسب قدرة حقيقية على التمييز (Discriminative Power) تتفوق على التوزيع الاحتمالي القبلي (Prior Probability Distribution) للبيانات. يتيح حساب معامل كابا لكوهين (Cohen’s Kappa Coefficient) المشتق مباشرة من خلايا المصفوفة قياس درجة الاتفاق بين القيم الحقيقية والتنبؤية مع تصحيح أثر الاتفاق الناتج عن الصدفة المحضة:
$$\kappa = \frac{p_o – p_e}{1 – p_e}$$
حيث تمثل $p_o$ الدقة الملاحظة الفعلية و $p_e$ الدقة المتوقعة بالصدفة العشوائية، مما يمنح التقييم موثوقية أكاديمية رصينة.
6. استخراج وحساب مقاييس الأداء المتقدمة من المصفوفة
6.1 حساب مقاييس الدقة (Accuracy) والدقة التنبؤية (Precision)
تنبثق من خلايا مصفوفة الارتباك مجموعة من المقاييس الإحصائية المتقدمة التي تقيم جوانب مختلفة من أداء الخوارزمية. المقياس الأول هو “الدقة الإجمالية” (Accuracy)، والتي تمثل نسبة كافة التنبؤات الصحيحة بالنسبة لإجمالي العينات، وتُحسب وفق المعادلة التالية:
$$\text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}$$
أما المقياس الثاني فهو “الدقة التنبؤية” أو “الضبط” (Precision / Positive Predictive Value)، وهو يقيس مدى مصداقية النموذج عندما يعلن أن حالة ما إيجابية؛ أي نسبة الحالات الإيجابية الحقيقية من بين جميع الحالات التي صنفها النموذج على أنها إيجابية:
$$\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}$$
في بايثون، يمكن حساب هذه المقاييس إما يدوياً عبر القيم المفككة أو باستخدام الدوال الجاهزة في Scikit-Learn كما يلي:
# حساب الدقة والدقة التنبؤية برمجياً
acc_manual = (tp + tn) / (tp + tn + fp + fn)
prec_manual = tp / (tp + fp) if (tp + fp) > 0 else 0
# الحساب باستخدام دوال sklearn
acc_sklearn = accuracy_score(y_actual, y_predicted)
prec_sklearn = precision_score(y_actual, y_predicted)
print(f"الدقة الإجمالية: {acc_sklearn:.4f} | الدقة التنبؤية (Precision): {prec_sklearn:.4f}")
6.2 حساب الحساسية (Recall) والتحديدية (Specificity)
المقياس الثالث الجوهري هو “الحساسية” أو “معدل الاستدعاء” (Recall / Sensitivity / True Positive Rate)، والذي يقيس قدرة النموذج على التقاط واكتشاف كافة الحالات الإيجابية الموجودة بالفعل في العينة دون تفويت، وتُعطى معادلته بالشكل التالي:
$$\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}$$
يقابل الحساسية مقياس مكمل يُعرف بـ “التحديدية” أو “الخصوصية” (Specificity / True Negative Rate)، والذي يقيس قدرة النموذج على تحديد الحالات السلبية واستبعاد غير المصابين بالظاهرة بدقة:
$$\text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}}$$
يتم حساب الحساسية والتحديدية برمجياً في بايثون كما يوضح الكود التالي:
# حساب الحساسية والتحديدية
recall_manual = tp / (tp + fn) if (tp + fn) > 0 else 0
specificity_manual = tn / (tn + fp) if (tn + fp) > 0 else 0
recall_sklearn = recall_score(y_actual, y_predicted)
print(f"الحساسية (Recall): {recall_sklearn:.4f} | التحديدية (Specificity): {specificity_manual:.4f}")
6.3 حساب المقياس التوافقي F1-Score واستخراج تقرير التصنيف الشامل
نظراً لوجود تعارض بنيوي متكرر بين الدقة التنبؤية (Precision) والحساسية (Recall)، تم تطوير مقياس F1-Score ليمثل الوسط التوافقي (Harmonic Mean) لهذين المقياسين. يتميز الوسط التوافقي بأنه يعاقب النماذج التي تحقق تفوقاً كاسحاً في أحدهما على حساب انهيار الآخر، مما يجعله المقياس الأمثل لتقييم البيانات غير المتوازنة:
$$\text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} = \frac{2\text{TP}}{2\text{TP} + \text{FP} + \text{FN}}$$
توفر Scikit-Learn دالة متكاملة فائقة القوة تُدعى classification_report()، والتي تقوم بحساب واستعراض مصفوفة شاملة تتضمن مقاييس الدقة التنبؤية، والحساسية، و F1-Score، وحجم الدعم (Support) لكل فئة على حدة، بالإضافة إلى المتوسطات الحسابية والموزونة:
# توليد واستعراض تقرير التصنيف الإحصائي الشامل
f1 = f1_score(y_actual, y_predicted)
report = classification_report(y_actual, y_predicted, target_names=['فئة سلبية (0)', 'فئة إيجابية (1)'])
print(f"مقياس F1 الإجمالي: {f1:.4f}n")
print("تقرير التصنيف التفصيلي:n", report)
7. التمثيل البصري لمصفوفة الارتباك باستخدام Seaborn و Matplotlib
7.1 رسم الخريطة الحرارية (Heatmap) المخصصة
يمثل تحويل مصفوفة الارتباك من مصفوفة أرقام جافة إلى خريطة حرارية تفاعلية ملونة خطوة محورية في تبسيط تفسير النتائج ونقلها إلى أصحاب المصلحة وصناع القرار. تُعد دالة sns.heatmap() من مكتبة Seaborn الأداة الأكثر مرونة لتنفيذ هذا الرسم؛ حيث تقوم بربط الكثافة العددية للخلايا بتدرجات لونية متباينة تلفت الانتباه الفوري لمواضع الخطأ والتركيز الإحصائي.
لتفعيل القراءة الواضحة، يجب تمرير المعامل annot=True لإظهار القيم الرقمية الصريحة داخل كل خلية، مع تحديد معامل التنسيق الرقمي fmt='d' لضمان ظهور الأعداد كأرقام صحيحة دون تحويلها تلقائياً إلى صيغ نقطية عائمة أو رموز علمية. كما يُفضل اختيار خريطة ألوان معيارية ذات تباين بصري مريح مثل 'Blues' أو 'YlGnBu' أو 'Purples' لتعزيز الوضوح الأكاديمي للوحة البيانية.
7.2 تخصيص المحاور والعناوين التوضيحية
لضمان استيفاء المخطط البياني للمعايير الأكاديمية الصارمة، يجب تخصيص تسميات المحاور بشكل قاطع لا لبس فيه، وتعيين أسماء الفئات الصريحة بدلاً من الاكتفاء بالأرقام المجردة 0 و 1. يوضح الكود التالي البنية البرمجية المتكاملة لتوليد مخطط حراري احترافي لمصفوفة الارتباك:
# إعداد أبعاد الشكل البياني
plt.figure(figsize=(7, 5))
# رسم الخريطة الحرارية المخصصة
class_names = ['سليم / سلبي', 'مصاب / إيجابي']
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=True,
xticklabels=class_names, yticklabels=class_names,
annot_kws={"size": 14, "weight": "bold"})
# ضبط العناوين والمحاور الإحصائية
plt.title('مصفوفة الارتباك التشخيصية للنموذج', fontsize=16, pad=15, weight='bold')
plt.xlabel('التصنيف المتوقع من النموذج (Predicted Class)', fontsize=12, labelpad=10)
plt.ylabel('التصنيف الفعلي الحقيقي (Actual Class)', fontsize=12, labelpad=10)
plt.tight_layout()
plt.show()
7.3 تصدير وحفظ المخططات البيانية بجودة عالية
عند إعداد أوراق بحثية موجهة للنشر في المجلات العلمية المحكمة أو تقارير فنية رفيعة المستوى، تبرز أهمية تصدير المخططات البيانية بدقة رسومية فائقة وتنسيقات قابلة للتكبير دون فقدان الجودة (Vector Formats). توفر دالة plt.savefig() في مكتبة Matplotlib معايير ضبط متقدمة للتحكم في دقة البكسل لكل بوصة عبر المعامل dpi (Dots Per Inch).
يُنصح دائماً بضبط الدقة على 300 أو 600 DPI للمنشورات الطباعية، مع استخدام معامل bbox_inches='tight' لقص الهوامش البيضاء الزائدة تلقائياً ومنع اقتطاع التسميات النصية للمحاور. كما يمكن تصدير المخطط بصيغ متعددة تشمل الصيغ النقطية مثل PNG والصيغ المتجهية غير المحدودة مثل PDF و SVG كما يوضح المثال التالي:
# حفظ المخطط البياني بجودة نشر علمي فائقة
plt.savefig('confusion_matrix_publication.png', dpi=300, bbox_inches='tight')
plt.savefig('confusion_matrix_vector.pdf', format='pdf', bbox_inches='tight')
plt.savefig('confusion_matrix_vector.svg', format='svg', bbox_inches='tight')
8. استخدام فئة ConfusionMatrixDisplay الحديثة في Scikit-Learn
8.1 الرسم المباشر باستخدام ConfusionMatrixDisplay
في الإصدارات الحديثة من مكتبة Scikit-Learn، تم تقديم فئة مخصصة ومطورة تُعرف بـ ConfusionMatrixDisplay تهدف إلى توحيد وتبسيط عمليات التمثيل البصري لمصفوفات الارتباك دون الحاجة إلى كتابة تعليمات معقدة في Seaborn. تتيح هذه الفئة بناء كائن رسومي مباشرة من مصفوفة الحسابات الرقمية وتمرير أسماء الفئات عبر معاملات مدمجة واضحة.
يتم استخدام هذه الطريقة عبر إنشاء كائن من الفئة وتمرير المصفوفة المحسوبة مسبقاً cm ثم استدعاء دالة .plot()، مما ينتج رسماً بيانيا متوافقاً تماماً مع محاور Matplotlib، ويتيح للمستخدم تمرير خرائط الألوان وخيارات الخطوط بسهولة تامة كما في الكود التالي:
# الرسم المباشر عبر ConfusionMatrixDisplay
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['سلبي', 'إيجابي'])
fig, ax = plt.subplots(figsize=(6, 6))
disp.plot(ax=ax, cmap='crest', values_format='d')
plt.title("عرض مصفوفة الارتباك عبر Scikit-Learn Display", fontsize=14)
plt.show()
8.2 الرسم التلقائي عبر ConfusionMatrixDisplay.from_predictions
لتقليص خطوات سير العمل البرمجي، توفر الفئة الدالة الثابتة (Class Method) الحديثة ConfusionMatrixDisplay.from_predictions(). تقوم هذه الدالة باستقبال متجهات التسميات الحقيقية y_true والتنبؤية y_pred مباشرة، وتتولى داخلياً حساب مصفوفة الارتباك وتوليد المخطط البياني في خطوة تنفيذية واحدة دون الحاجة لاستدعاء دالة confusion_matrix() المنفصلة.
تتميز هذه الدالة بدعمها المدمج لخاصية التطبيع الإحصائي عبر المعامل normalize؛ مما يتيح عرض النسب المئوية بدلاً من الأعداد الصحيحة الخام بمرونة تامة، وهو أمر بالغ الأهمية عند مقارنة أداء النماذج عبر مجموعات بيانات مختلفة الأحجام:
# توليد الرسم وتطبيع القيم تلقائياً من التنبؤات مباشرة
ConfusionMatrixDisplay.from_predictions(
y_actual,
y_predicted,
display_labels=['فئة 0', 'فئة 1'],
normalize='true', # تطبيع كنسب مئوية عبر الصفوف الحقيقية
cmap='Blues',
values_format='.2%' # عرض النتائج كنسب مئوية بدقة منزلتين عشريتين
)
plt.title("مصفوفة الارتباك المطبّعة إحصائياً", fontsize=14)
plt.grid(False)
plt.show()
8.3 الرسم من النموذج المدرب ConfusionMatrixDisplay.from_estimator
يمثل الخيار الأكثر تكاملاً وأتمتة في بيئات الإنتاج البرمجية استخدام الدالة المتقدمة ConfusionMatrixDisplay.from_estimator(). لا تتطلب هذه الدالة حتى استخراج التنبؤات مسبقاً، بل تستقبل مباشرة كائن النموذج الخوارزمي المدرب مسبقاً ومصفوفة الميزات المستقلة لبيانات الاختبار X_test والمتجه الحقيقي y_test.
تقوم الدالة آلياً بتنفيذ دالة التنبؤ estimator.predict(X_test) خلف الكواليس، وتوليد مصفوفة الارتباك ورسمها على الفور. يسهم هذا النمط البرمجي في تقليل احتمالات الخطأ البشري الناتج عن تمرير متجهات غير متطابقة أو حدوث تسريب في البيانات (Data Leakage) بين مراحل التقييم المختلفة، مما يجعله الأسلوب المفضل في خطوط أنابيب التعلم الآلي الحديثة (ML Pipelines).
9. تطبيق عملي كامل: تدريب نموذج انحدار لوجستي وتقييمه بمصفوفة الارتباك
9.1 إعداد مجموعة البيانات وتقسيمها إحصائياً
لترسيخ المعرفة النظرية والبرمجية السابقة، سنقوم ببناء تطبيق عملي متكامل يبدأ من توليد مجموعة بيانات تصنيفية واقعية، وتدريب نموذج انحدار لوجستي متقدم، وانتهاءً بتقييمه الشامل باستخدام مصفوفة الارتباك. سنستخدم دالة make_classification لتوليد مجتمع بيانات محايد يحتوي على علاقات خطية وغير خطية معقدة بين الميزات:
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
# 1. توليد مجموعة بيانات تصنيفية اصطناعية تحاكي الواقع
X, y = make_classification(
n_samples=2000,
n_features=10,
n_informative=7,
n_redundant=3,
n_classes=2,
weights=[0.70, 0.30], # محاكاة عدم توازن الفئات بنسبة 70% إلى 30%
random_state=42
)
# 2. تقسيم البيانات إلى مجموعتي تدريب واختبار مع الحفاظ على التوزيع الطبقي
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
يضمن استخدام المعامل stratify=y توزيع نسب الفئات بشكل متطابق إحصائياً في كل من مجموعتي التدريب والاختبار، مما يمنع التحيز التوزيعي أثناء عملية التقييم.
9.2 بناء وتدريب نموذج الانحدار اللوجستي (Logistic Regression)
نقوم الآن بتهيئة نموذج الانحدار اللوجستي مع ضبط معامل التنظيم الإحصائي وحل المشكلة التحسينية باستخدام خوارزمية lbfgs، ومن ثم تدريبه على بيانات التدريب، واستخراج كل من التنبؤات القاطعة والاحتمالات المستمرة المقابلة لبيانات الاختبار المستقلة:
# 3. تهيئة وتدريب نموذج الانحدار اللوجستي
model = LogisticRegression(solver='lbfgs', max_iter=1000, random_state=42)
model.fit(X_train, y_train)
# 4. استخراج التنبؤات الفئوية والاحتمالات التنبؤية لبيانات الاختبار
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1] # احتمالية الانتماء للفئة الإيجابية
تتيح لنا مصفوفة الاحتمالات y_prob المرونة الكاملة لدراسة سلوك النموذج عند مستويات ثقة مختلفة وفهم الآلية التي اعتمدت عليها الخوارزمية في توليد مصفوفة الارتباك اللاحقة.
9.3 توليد مصفوفة الارتباك الشاملة وتفسير نتائج الاختبار
نصل الآن إلى الخطوة المركزية، وهي توليد مصفوفة الارتباك لبيانات الاختبار وتحليل مخرجاتها تحليلاً نقدياً شاملاً يربط بين الأرقام المحسوبة والقرارات العملية:
# 5. بناء المخطط الشامل لمصفوفة الارتباك وتقييم النموذج
fig, ax = plt.subplots(1, 2, figsize=(14, 5))
# الرسم الأول: الأعداد المطلقة
ConfusionMatrixDisplay.from_estimator(
model, X_test, y_test, cmap='Blues', values_format='d', ax=ax[0]
)
ax[0].set_title("مصفوفة الارتباك (الأعداد المطلقة)", fontsize=13, weight='bold')
ax[0].grid(False)
# الرسم الثاني: النسب المطبّعة إحصائياً
ConfusionMatrixDisplay.from_estimator(
model, X_test, y_test, cmap='Greens', normalize='true', values_format='.1%', ax=ax[1]
)
ax[1].set_title("مصفوفة الارتباك (النسب المئوية الحقيقية)", fontsize=13, weight='bold')
ax[1].grid(False)
plt.tight_layout()
plt.show()
# طباعة التقرير الإحصائي الكامل
print("تقرير الأداء الإحصائي التفصيلي:n")
print(classification_report(y_test, y_pred, digits=4))
يكشف هذا التحليل المزدوج فوراً عن الأداء المتمايز للنموذج؛ حيث يوضح الرسم الأول الحجم الحقيقي للعينات المدروسة، بينما يكشف الرسم الثاني أن النموذج نجح مثلاً في رصد 85% من الحالات الإيجابية الفعلية واستبعد 92% من الحالات السلبية بنجاح، مما يعطي رؤية شاملة تمكن الفريق الإحصائي من البت في جاهزية النموذج للنشر العملي.
10. إنشاء مصفوفة الارتباك للتصنيف متعدد الفئات (Multi-class Classification)
10.1 بنية مصفوفة الارتباك للنماذج متعددة الفئات (NxN)
عند الانتقال من التصنيف الثنائي إلى فضاء التصنيف متعدد الفئات (Multi-class Classification) الذي يضم $N$ من الفئات المتمايزة (مثل تصنيف أنواع الصور، أو تصنيف المشاعر إلى: إيجابي، محايد، سلبي)، تتوسع مصفوفة الارتباك هندسياً لتصبح مصفوفة مربعة بأبعاد $N \times N$. في هذا الهيكل المتقدم، يمثل كل صف $i$ الفئة الحقيقية الفعلية، بينما يمثل كل عمود $j$ الفئة التي توقعها النموذج.
تظل القاعدة الجوهرية ثابتة؛ حيث يمثل القطر الرئيسي للمصفوفة (الخلايا التي يكون فيها $i = j$) جميع التنبؤات الصائبة لكل فئة على حدة. بينما تعكس كافة الخلايا الواقعة خارج القطر الرئيسي ($i \neq j$) حالات التداخل والالتباس المتبادل بين الفئات؛ حيث يوضح الصف $i$ والعمود $j$ عدد المرات التي أخطأ فيها النموذج وصنف عينة تنتمي حقيقة للفئة $i$ على أنها تنتمي للفئة $j$.
تسمح هذه المصفوفة الموسعة بتشخيص عيوب التصنيف الدقيقة؛ فبدلاً من معرفة أن النموذج يرتكب خطأً عاماً، تكشف المصفوفة المتعددة أن النموذج يخلط تحديداً وبشكل متكرر بين الفئة “أ” والفئة “ج”، في حين يميز الفئة “ب” بدقة متناهية، مما يوجه جهود هندسة الميزات نحو البحث عن ميزات فارقة تفصل حصراً بين الفئتين الملتبستين.
10.2 تطبيق برمجي على مصفوفة متعددة الفئات في بايثون
لتطبيق هذا المفهوم عملياً، سنقوم بتوليد بيانات اختبار تحاكي تصنيفاً ثلاثي الفئات واستدعاء دالة confusion_matrix مع تمرير التسميات النصية الصريحة:
# تعريف تنبؤات متعددة الفئات (3 فئات: منخفض، متوسط، مرتفع)
y_true_multi = ['منخفض', 'مرتفع', 'متوسط', 'منخفض', 'متوسط', 'مرتفع', 'منخفض', 'متوسط', 'مرتفع', 'منخفض']
y_pred_multi = ['منخفض', 'متوسط', 'متوسط', 'منخفض', 'مرتفع', 'مرتفع', 'متوسط', 'متوسط', 'مرتفع', 'منخفض']
labels_order = ['منخفض', 'متوسط', 'مرتفع']
# حساب ورسم مصفوفة الارتباك متعددة الفئات
cm_multi = confusion_matrix(y_true_multi, y_pred_multi, labels=labels_order)
plt.figure(figsize=(8, 6))
sns.heatmap(cm_multi, annot=True, fmt='d', cmap='Oranges',
xticklabels=labels_order, yticklabels=labels_order,
annot_kws={"size": 13, "weight": "bold"})
plt.title('مصفوفة الارتباك لتصنيف ثلاثي الفئات', fontsize=14, weight='bold')
plt.xlabel('الفئة المتوقعة', fontsize=12)
plt.ylabel('الفئة الفعلية', fontsize=12)
plt.show()
10.3 حساب المتوسطات الإحصائية (Macro, Micro, Weighted Averages)
في النماذج متعددة الفئات، تتفرع مقاييس الدقة التنبؤية والحساسية و F1-Score إلى استراتيجيات تجميعية متعددة لاحتساب المتوسط الكلي عبر جميع الفئات، وتوفر كل استراتيجية منظوراً إحصائياً فريداً:
- المتوسط الجزئي (Micro Average): يقوم بجمع كافة قيم TP و FP و FN و TN عبر جميع الفئات أولاً ثم حساب المقياس العام، مما يجعله يعطي وزناً متساوياً لكل عينة فردية بغض النظر عن فئتها، وهو ما يجعله يتأثر بشدة بالفئات الكبيرة.
- المتوسط الكلي (Macro Average): يقوم بحساب المقياس الإحصائي لكل فئة بشكل مستقل ومعزول، ثم يأخذ المتوسط الحسابي البسيط للنتائج دون مراعاة لحجم الفئة، مما يمنح الفئات النادرة والصغيرة نفس الأهمية والوزن الممنوح للفئات الضخمة.
- المتوسط الموزون (Weighted Average): يقوم بحساب المقياس لكل فئة على حدة، ثم يضرب كل نتيجة في نسبة تمثيل تلك الفئة (Support) في مجتمع البيانات الكلي، مما يوفر توازناً دقيقاً يعكس التوزيع الحقيقي للملاحظات.
يوضح الكود التالي كيفية استخراج هذه المتوسطات برمجياً عبر Scikit-Learn:
# حساب المتوسطات المختلفة لمقياس F1 في التصنيف متعدد الفئات
f1_macro = f1_score(y_true_multi, y_pred_multi, labels=labels_order, average='macro')
f1_micro = f1_score(y_true_multi, y_pred_multi, labels=labels_order, average='micro')
f1_weighted = f1_score(y_true_multi, y_pred_multi, labels=labels_order, average='weighted')
print(f"Macro F1 (المتوسط الكلي غير الموزون): {f1_macro:.4f}")
print(f"Micro F1 (المتوسط الجزئي المجمع): {f1_micro:.4f}")
print(f"Weighted F1 (المتوسط الموزون بأحجام الفئات): {f1_weighted:.4f}")
11. أفضل الممارسات والأخطاء الشائعة عند التعامل مع مصفوفة الارتباك
11.1 معالجة مشكلة البيانات غير المتوازنة (Imbalanced Data)
تفرض مشكلة عدم توازن البيانات تحديات إحصائية جسيمة عند تفسير مصفوفة الارتباك؛ فعندما تحتوي فئة الأغلبية على 10,000 عينة بينما تحتوي فئة الأقلية على 100 عينة فقط، فإن الأعداد المطلقة داخل خلايا المصفوفة تصبح خادعة بصرياً وتطغى أرقام فئة الأغلبية على المشهد التحليلي بالكامل.
للتغلب على هذا التشوه، يُعد تطبيق التطبيع عبر الأسطر الحقيقية باستخدام المعامل normalize='true' أفضل ممارسة إحصائية إلزامية؛ إذ يحول الأعداد المطلقة إلى نسب مئوية مستقلة لكل فئة تعكس معدل الحساسية الخاص بها مباشرة. بالإضافة إلى ذلك، يجب ربط تقييم المصفوفة بتطبيق أساليب معالجة عدم التوازن المتقدمة مثل تقنيات الإفراط في أخذ العينات من الفئة الأقلية (SMOTE – Synthetic Minority Over-sampling Technique) أو تقنيات تقليص الفئة الأكثرية (Random Undersampling) وملاحظة التحسن النوعي على القطر الرئيسي للمصفوفة المطبّعة.
11.2 تعديل عتبة القرار التنبؤي (Classification Threshold Tuning)
من الأخطاء التحليلية الشائعة الاعتقاد بأن عتبة القرار التنبؤي يجب أن تظل ثابتة دائماً عند القيمة الافتراضية 0.5. في الواقع العملي، فإن تعديل هذه العتبة يمثل أداة المعايرة الأساسية لإعادة توزيع الأخطاء داخل مصفوفة الارتباك وفق متطلبات التطبيق ومصفوفة الخسائر المالية أو الأخلاقية.
إذا كان الهدف الأساسي هو تقليص السلبيات الخاطئة (FN) بأي ثمن في تطبيق طبي حرج، يمكن خفض عتبة القرار التنبؤي من 0.5 إلى 0.2 أو 0.3، مما يجبر الخوارزمية على تصنيف الحالات المشكوك فيها كحالات إيجابية، وبالتالي زيادة الإيجابيات الحقيقية وخفض السلبيات الخاطئة على حساب زيادة طفيفة ومقبولة في الإيجابيات الخاطئة. يرتبط هذا المفهوم ارتباطاً وثيقاً بـ منحنى خاصية تشغيل المتلقي (ROC Curve) ومنحنى الدقة والاستدعاء (Precision-Recall Curve) اللذين يعرضان تطور خلايا مصفوفة الارتباك عبر جميع العتبات الممكنة من 0 إلى 1.
11.3 الأخطاء البرمجية الشائعة وتجنبها
يقع الكثير من المبرمجين في أخطاء تقنية متكررة عند التعامل مع دوال Scikit-Learn لمصفوفة الارتباك، ويأتي على رأسها خطأ “عكس الترتيب البرمجي للمدخلات”. تقبل الدالة confusion_matrix(y_true, y_pred) المتجه الحقيقي كمدخل أول والمتجه التنبؤي كمدخل ثانٍ. وإذا تم عكس هذا الترتيب عن طريق الخطأ وكتابة confusion_matrix(y_pred, y_true)، فإن ذلك يؤدي إلى تبديل محاور المصفوفة بالكامل؛ حيث تتحول قيم الإيجابيات الخاطئة إلى سلبيات خاطئة والعكس صحيح، مما يقود إلى استنتاجات كارثية مقلوبة تماماً حول أداء النموذج.
الخطأ الشائع الثاني يتعلق بعدم توافق أبعاد المتجهات الممررة أو وجود قيم مفقودة (NaNs) غير معالجة؛ لذا يجب التأكد دائماً من أن y_true.shape == y_pred.shape وأنهما متجهات أحادية البعد. كما يجب الحذر عند التعامل مع التسميات الفئوية النصية، والتأكد من تحديد المعامل labels صراحة لضمان ثبات ترتيب الصفوف والأعمدة عند تكرار التجارب البرمجية.
12. الخلاصة والتطبيقات النفسية والسلوكية المتقدمة لنماذج التصنيف
12.1 ملخص الخطوات البرمجية لبناء مصفوفة الارتباك في بايثون
لقد استعرضنا في هذا الدليل المسار الهندسي والإحصائي المتكامل لبناء مصفوفة الارتباك في لغة بايثون. تتلخص الخطوات المعيارية الموصى بها لأي مشروع تعلم آلي في التسلسل المنهجي التالي:
- تجهيز وتقسيم البيانات مع ضمان التمثيل الطبقي السليم للفئات عبر
train_test_split(..., stratify=y). - تدريب الخوارزمية التصنيفية المناسبة واستخراج التنبؤات القطعية والاحتمالات التنبؤية لبيانات الاختبار المستقلة.
- حساب مصفوفة الارتباك بدقة عبر
confusion_matrix(y_test, y_pred)وتفكيك عناصرها الأساسية عبر.ravel(). - استخراج تقرير التصنيف الإحصائي الشامل
classification_report()لتقييم مقاييس Precision و Recall و F1-Score بالتفصيل. - تمثيل المصفوفة بصرياً كخريطة حرارية مطبّعة وموثقة المحاور باستخدام
ConfusionMatrixDisplay.from_predictions()وتصديرها بدقة عالية للنشر الأكاديمي.
12.2 أهمية مصفوفة الارتباك في القياسات السلوكية والتشخيص النفسي
تمتد التطبيقات المتقدمة لمصفوفة الارتباك إلى ما وراء علوم الحاسوب والهندسة لتشكل أداة بالغة الأهمية في ميادين القياس النفسي (Psychometrics) والعلوم السلوكية والتشخيص الإكلينيكي لاضطرابات الصحة النفسية. فعند بناء نماذج تنبؤية تعتمد على التعلم الآلي للكشف المبكر عن اضطرابات مثل الاكتئاب السريري، أو اضطراب ما بعد الصدمة (PTSD)، أو مخاطر الانتحار عبر تحليل النصوص وسلوكيات التفاعل الرقمي، تصبح مصفوفة الارتباك أداة تقييم أخلاقية ومنهجية لا غنى عنها.
في هذا السياق الإنساني الحساس، يُعد خطأ السلبية الخاطئة (FN) إخفاقاً مأساوياً يعني فشل النظام في رصد شخص يعاني من أزمة نفسية حادة، مما يحرمه من الدعم النفسي والتدخل العلاجي المنقذ للحياة. وفي المقابل، فإن خطأ الإيجابية الخاطئة (FP) يحمل تبعات اجتماعية ونفسية خطيرة قد تؤدي إلى وصم الفرد (Stigmatization) أو إخضاعه لتقييمات تشخيصية قسرية بناءً على استدلالات خوارزمية غير دقيقة. تمكن مصفوفة الارتباك علماء النفس والباحثين السلوكيين من معايرة حساسية النماذج وضبط العتبات بما يحقق أقصى درجات الأمان النفسي والأخلاقي للمفحوصين.
12.3 آفاق التطوير المستقبلية لتقييم النماذج الخوارزمية
مع تسارع وتيرة التحول نحو نماذج الذكاء الاصطناعي التكيفية والمستمرة (Adaptive & Continual Learning Systems)، تتجه الممارسات الهندسية الحديثة نحو دمج مصفوفات الارتباك التفاعلية داخل لوحات القيادة والمراقبة الحية (Real-time Monitoring Dashboards) مثل أدوات MLflow و Weights & Biases و TensorBoard. يتيح هذا التكامل رصد ظاهرة “انحراف المفاهيم” (Concept Drift) وتدهور أداء النماذج المنشورة عبر الزمن؛ حيث يظهر الانحراف على شكل تآكل تدريجي في تركيز القطر الرئيسي للمصفوفة وزيادة مطردة في معدلات الأخطاء غير القطرية.
إن استيعاب البنية الرياضية والبرمجية لمصفوفة الارتباك في بايثون يزود الباحث ومهندس البيانات بالأساس المتين لتطوير أنظمة ذكاء اصطناعي تتسم بالشفافية، والعدالة الإحصائية، والقابلية للتفسير العلمي الرصين، مما يضمن اتخاذ قرارات قائمة على البيانات تتسم بأعلى معايير الدقة والموثوقية.
المراجع (References)
- Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer. https://www.springer.com/gp/book/9780387310732
- Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8), 861–874. https://doi.org/10.1016/j.patrec.2005.10.010
- Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction (2nd ed.). Springer. https://doi.org/10.1007/978-0-387-84858-7
- Kuhn, M., & Johnson, K. (2013). Applied Predictive Modeling. Springer. https://doi.org/10.1007/978-1-4614-6849-3
- Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M., & Duchesnay, É. (2011). Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12, 2825–2830. https://scikit-learn.org/
- Powers, D. M. W. (2011). Evaluation: from precision, recall and F-measure to ROC, informedness, markedness and correlation. Journal of Machine Learning Technologies, 2(1), 37–63.
- Sokolova, M., & Lapalme, G. (2009). A systematic analysis of performance measures for classification tasks. Information Processing & Management, 45(4), 427–437. https://doi.org/10.1016/j.ipm.2009.03.002
- Waskom, M. L. (2021). Seaborn: statistical data visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021