التعلم الآليبايثونعلم البيانات

كيفية رسم منحنيات ROC متعددة في بايثون (مع مثال)

دليل أكاديمي شامل يشرح كيفية رسم ومقارنة منحنيات ROC متعددة في لغة بايثون لتقييم أداء نماذج التعلم الآلي بدقة خطوة بخطوة مع أمثلة برمجية وتطبيقية.

تاريخ النشر

يعد تقييم أداء نماذج التعلم الآلي والنمذجة الإحصائية أحد الركائز الجوهرية في علوم البيانات والذكاء الاصطناعي، حيث لا يكفي تدريب النماذج المعقدة دون امتلاك أدوات قياس دقيقة قادرة على كشف سلوك الخوارزمية عبر مختلف الظروف التشغيلية. في سياق التصنيف الثنائي والمتعدد، يبرز منحنى خصائص تشغيل المستقبل (Receiver Operating Characteristic – ROC) كأحد أقوى المعايير البصرية والإحصائية لتحليل كفاءة النماذج التنبؤية. يتيح هذا المنحنى للباحثين والممارسين الانتقال من التقييم النقطي الساذج إلى فهم ديناميكي متكامل لكيفية موازنة النموذج بين رصد الحالات الإيجابية بدقة وتجنب الإنذارات الكاذبة.

تتعاظم أهمية هذا التحليل عند الانتقال من تقييم نموذج منفرد إلى المفاضلة المباشرة بين خوارزميات متعددة تتنافس على معالجة ذات المشكلة الحسابية. إن رسم منحنيات ROC متعددة في مخطط بياني واحد يوفر إطاراً موحداً للمقارنة البصرية والكمية، مما يسمح بتحديد النموذج المتفوق ليس فقط عبر مقياس إجمالي مثل المساحة تحت المنحنى (AUC)، بل وأيضاً عبر نطاقات تشغيلية محددة ترتبط ارتباطاً وثيقاً بالتكلفة الاقتصادية أو الطبية المترتبة على أخطاء التصنيف. تقدم لغة Python، بفضل منظومتها البيئية الغنية بمكتبات مثل Scikit-Learn وMatplotlib وNumPy، بيئة برمجية مرنة وقوية لتنفيذ هذه التحليلات بأعلى درجات الدقة والجاهزية الأكاديمية للنشر العلمي.

يهدف هذا الدليل الأكاديمي الشامل إلى استعراض الأسس النظرية والرياضية العميقة الكامنة خلف بناء منحنيات ROC، وتفكيك مصفوفة الارتباك وميكانيكا تحريك عتبات القرار الاحتمالية، وصولاً إلى التطبيق البرمجي المتكامل لرسم منحنيات متعددة على مخطط بياني واحد. سيتم التطرق إلى السيناريوهات المتقدمة، مثل معالجة مشكلات عدم توازن الفئات، وتطبيق تقنيات التحقق المتقاطع (Cross-Validation)، والتصنيف متعدد الفئات، مع استعراض كود برمجي معياري يلبي متطلبات النشر في الدوريات العلمية المحكمة والمشاريع الصناعية الحساسة.

جدول المحتويات

1. مقدمة نظرية حول منحنى خصائص تشغيل المستقبل (ROC) وأهميته الإحصائية

1.1 التعريف الرياضي لمنحنى ROC وسياقه التاريخي

تعود الجذور التاريخية لمنحنى خصائص تشغيل المستقبل (Receiver Operating Characteristic) إلى حقبة الحرب العالمية الثانية، وتحديداً في أعقاب الهجوم على بيرل هاربر، حيث طور مهندسو الرادار في بريطانيا والولايات المتحدة هذه الأداة الرياضية لقياس قدرة مشغلي أجهزة الرادار على التمييز بين الإشارات الحقيقية العائدة لطائرات العدو وبين الضجيج العشوائي الناتج عن الظواهر الجوية أو أسراب الطيور. كان التحدي يكمن في تحسين قدرة المشغل (Receiver) على اتخاذ القرار الصحيح في ظل التداخل العالي، ومن هنا اشتق اسم المقياس الذي يعبر عن الخصائص التشغيلية لنظام الاستقبال والتمييز.

انتقلت هذه النظرية لاحقاً خلال عقدي الخمسينيات والستينيات من القرن العشرين إلى مجالات علم النفس القياسي ونظرية الكشف عن الإشارة (Signal Detection Theory) عبر أبحاث تانر وسويتس (Tanner & Swets)، لتفسير كيفية إدراك الحواس البشرية للمثيرات المشوبة بالضوضاء. ومع مطلع الثمانينيات، تم تبني المنحنى في التشخيص الطبي والمصادقة الوبائية للمفاضلة بين دقة الاختبارات المعملية، قبل أن يستقر كمعيار ذهبي في تقييم خوارزميات التعلم الآلي واستخراج البيانات مع مطلع الألفية الجديدة.

رياضياً، يعرف منحنى ROC بأنه رسم بياني ثنائي الأبعاد يمثل الدالة التبادلية بين المعدل الإيجابي الحقيقي (True Positive Rate – TPR) الواقع على المحور الرأسي ($y$)، والمعدل الإيجابي الكاذب (False Positive Rate – FPR) الواقع على المحور الأفقي ($x$). يتم رسم هذا المسار الهندسي عن طريق تغيير عتبة القرار الاحتمالية ($Threshold – \theta$) بشكل مستمر عبر المجال المغلق $[0, 1]$، مما يعكس الأداء التمييزي للمصنف الإحصائي عند كل نقطة تشغيلية محتملة دون الاعتماد على عتبة افتراضية مفردة.

1.2 أهمية منحنى ROC في تقييم النماذج التصنيفية الثنائية

في العديد من التطبيقات التطبيقية للتعلم الآلي، يثبت مقياس الدقة التقليدي (Classification Accuracy) عجزه التام عن تقديم تقييم موثوق، لا سيما في مجموعات البيانات غير المتوازنة (Imbalanced Datasets). فعلى سبيل المثال، في تطبيقات الكشف عن الاحتيال المالي أو تشخيص الأورام الخبيثة النادرة حيث تشكل الفئة الإيجابية 1% فقط من البيانات، يمكن لنموذج ساذج يتنبأ دائماً بالفئة السلبية أن يحقق دقة تصل إلى 99%، على الرغم من فشله الكلي في اكتشاف أي حالة إيجابية مستهدفة. هنا تكمن قوة منحنى ROC، حيث يفصل تقييم الفئة الإيجابية عن الفئة السلبية عبر حساب نسب مستقلة لكل فئة على حدة.

تتمثل الميزة الجوهرية لمنحنى ROC في استقلاليته التامة عن عتبة التصنيف الثابتة (Classification Threshold). في النماذج الاحتمالية، مثل الانحدار اللوجستي أو الشبكات العصبية، يولد النموذج قيمة احتمالية مستمرة تنتمي للمجال $[0, 1]$. في التطبيق التقليدي، يتم استخدام العتبة الافتراضية $0.5$ لتحويل الاحتمال إلى قرار ثنائي قطعي، إلا أن هذه العتبة قد لا تكون الخيار الأمثل في التطبيقات الحساسة. يوفر منحنى ROC رؤية بانورامية تمكن مهندس البيانات والباحث من تقييم القدرة التمييزية المطلقة للخوارزمية عبر كافة العتبات الممكنة، مما يتيح اختيار نقطة التشغيل التي تتناسب مع متطلبات التطبيق الميداني.

علاوة على ذلك، يمنح المنحنى فهماً عميقاً للمفاضلة بين الحساسية والنوعية. فكل محاولة لزيادة رصد الحالات الموجبة (زيادة الحساسية أو TPR) تقابلها ضريبة رياضية تتمثل في زيادة الإنذارات الخاطئة (ارتفاع FPR وانخفاض Specificity). يسمح التحليل البصري لمنحنى ROC باستكشاف هذه المقايضة الرياضية بصرياً، وتحديد العتبة المثلى التي تعظم المنفعة وتقلل المخاطر بناءً على مصفوفة التكاليف التشغيلية المعتمدة في الدراسة.

1.3 المقارنة بين دقة النموذج والمساحة تحت المنحنى (AUC-ROC)

بينما يمثل منحنى ROC أداة تقييم بصرية، تبرز الحاجة إلى مقياس كمي موحد يلخص هذا المنحنى في قيمة رقمية مفردة لتسهيل المقارنة بين النماذج؛ هذا المقياس هو المساحة تحت منحنى خصائص تشغيل المستقبل (Area Under the ROC Curve – AUC). تتراوح قيمة AUC رياضياً بين $0.0$ و $1.0$، حيث تعبر القيمة $0.5$ عن أداء يماثل التخمين العشوائي البحت (مثل رمي عملة نقدية غير متحيزة)، في حين تشير القيمة $1.0$ إلى مصنف مثالي خالٍ تماماً من الأخطاء قادر على فصل الفئتين فصلاً تاماً دون أي تداخل احتمالي.

من المنظور الإحصائي والاحتمالي الصارم، تعبر قيمة AUC عن احتمالية أن يعطي النموذج التصنيفي درجة احتمالية لعينة موجبة تم اختيارها عشوائياً أعلى من الدرجة الاحتمالية المعطاة لعينة سالبة تم اختيارها عشوائياً. يوضح هذا التفسير سبب كون AUC مقياساً لجودة الترتيب (Ranking Quality) وليس لمعايرة الاحتمالات المطلقة. إذا كانت الخوارزمية قادرة على فرز وتصنيف الحالات الموجبة فوق الحالات السالبة، فإن قيمة AUC ستكون مرتفعة حتى وإن كانت الاحتمالات بحاجة إلى إعادة معايرة (Calibration).

يوضح الجدول المقارن التالي الفروق الأساسية بين دقة التصنيف التقليدية ومقياس المساحة تحت المنحنى AUC-ROC من منظور التحليل الإحصائي والنمذجة التنبؤية:

  • حساسية التوزيع الفئوي: تتأثر الدقة التقليدية بشدة بالتوزيع المسبق للفئات وتنهار في البيانات غير المتوازنة، بينما يتميز مقياس AUC بمناعته الإحصائية ضد التغير في النسب النسبية بين الفئات الموجبة والسالبة.
  • الاعتماد على عتبة القرار: ترتبط الدقة بنقطة عتبية محددة مسبقاً (غالباً 0.5)، في حين يقيم AUC الأداء الشامل للنموذج عبر كافة العتبات الممكنة بين 0 و 1.
  • التفسير الاحتمالي: تقيس الدقة نسبة الحالات المصنفة تصنيفاً صحيحاً من إجمالي العينات، بينما يقيس AUC قدرة النموذج على الترتيب التمييزي العشوائي بين الأزواج الموجبة والسالبة.
  • القوة التفضيلية في مقارنة الخوارزميات: يوفر AUC معياراً موحداً وقوياً للمقارنة المستقلة عن تكاليف الأخطاء، مما يجعله المقياس المفضل في الأبحاث الأكاديمية المقارنة.

2. المفاهيم الرياضية والإحصائية الحاكمة لبناء مصفوفة الارتباك ومنحنيات ROC

2.1 تفكيك مصفوفة الارتباك وحساب المعدلات الأساسية

لتأسيس الفهم الرياضي لمنحنى ROC، يجب أولاً تفكيك مصفوفة الارتباك (Confusion Matrix)، وهي جدول تقاطع ثنائي البعد يلخص نتائج المقارنة بين التصنيفات الفعلية والتنبؤات الصادرة عن النموذج. تشتمل المصفوفة على أربع خانات أساسية تمثل التوزيع الشامل لنتائج الاختبار الإحصائي:

  • الإيجابيات الحقيقية (True Positives – TP): عدد الحالات التي تنتمي فعلياً للفئة الإيجابية وتنبأ النموذج بكونها إيجابية بشكل صحيح.
  • السلبيات الحقيقية (True Negatives – TN): عدد الحالات التي تنتمي فعلياً للفئة السلبية وتنبأ النموذج بكونها سلبية بشكل صحيح.
  • الإيجابيات الكاذبة (False Positives – FP): عدد الحالات السلبية في الأصل ولكن النموذج أخطأ وصنفها كإيجابية (خطأ من النوع الأول – Type I Error).
  • السلبيات الكاذبة (False Negatives – FN): عدد الحالات الإيجابية في الأصل ولكن النموذج أخطأ وصنفها كسلبيات (خطأ من النوع الثاني – Type II Error).

انطلاقاً من هذه القيم الأساسية الأربع، يتم اشتقاق المعدلين الجوهريين المكونين لمنحنى ROC. يمثل المعدل الأول المعدل الإيجابي الحقيقي (True Positive Rate – TPR)، والمعروف في الأوساط الطبية والإحصائية باسم الحساسية (Sensitivity) وفي علوم استرجاع المعلومات باسم الاستدعاء (Recall). يحسب هذا المعدل وفق المعادلة الرياضية التالية:

$$TPR = \text{Sensitivity} = \text{Recall} = \frac{TP}{TP + FN}$$

يعبر هذا الكسر عن النسبة المئوية للحالات الإيجابية الفعلية التي نجح النموذج في رصدها والتعرف عليها بشكل صحيح. في المقابل، يعرف المعدل الثاني بالمعدل الإيجابي الكاذب (False Positive Rate – FPR)، والذي يقيس نسبة الإنذارات الخاطئة من إجمالي العينات السلبية الأصلية. يرتبط هذا المعدل ارتباطاً مباشراً بمعدل النوعية (Specificity)، حيث تحكمه العلاقات الرياضية الآتية:

$$\text{Specificity} = \frac{TN}{TN + FP}$$

$$FPR = 1 – \text{Specificity} = \frac{FP}{TN + FP}$$

يعد الحفاظ على توازن منضبط بين TPR و FPR التحدي الأكبر في تدريب النماذج؛ إذ إن أي تحسين غير مدروس لرفع TPR غالباً ما يقود إلى تمرير عينات سالبة كإيجابيات كاذبة، مما يرفع قيمة FPR.

2.2 تأثير تغير عتبات القرار (Classification Thresholds) على مسار المنحنى

في معظم خوارزميات التعلم الآلي الحديثة، لا تنتج النماذج قرارات قطعية بشكل مباشر، بل تحسب قيماً احتمالية مستمرة تقع في النطاق $P(Y=1|X) in [0, 1]$. لتحويل هذا الاحتمال إلى تصنيف قطعي، يجب تطبيق دالة عتبية تعتمد على وسيط العتبة $\theta$. إذا كانت القيمة الاحتمالية $P ge \theta$ يصنف النموذج العينة كإيجابية، وإذا كانت $P < \theta$ تصنف كعينة سلبية.

عندما نضع العتبة عند أقصى قيمة ممكنة ($\theta = 1.0$)، يرفض النموذج تصنيف أي عينة كإيجابية إلا إذا كان متأكداً بنسبة مطلقة. في هذه الحالة المتطرفة، تنعدم الإيجابيات الكاذبة ($FP = 0$) مما يجعل $FPR = 0$، ولكن في المقابل تنعدم الإيجابيات الحقيقية أيضاً ($TP = 0$) مما يجعل $TPR = 0$. تتوافق هذه الحالة هندسياً مع نقطة الأصل $(0, 0)$ في المستوى الإحداثي لمنحنى ROC.

وعلى النقيض من ذلك، عندما نخفض العتبة إلى أدنى قيمة ($\theta = 0.0$)، يقبل النموذج تصنيف جميع العينات بلا استثناء كحالات إيجابية. يؤدي ذلك إلى رصد كافة الحالات الإيجابية الفعلية بنجاح ($TPR = 1.0$)، ولكن على حساب تصنيف كافة الحالات السلبية كإيجابيات كاذبة ($FPR = 1.0$). يمثل هذا الوضع النقطة العليا اليمنى $(1, 1)$ على المنحنى البياني.

تتولد النقاط الإحداثية المتوسطة على منحنى ROC من خلال عملية مسح تصاعدي أو تنازلي لقيم الاحتمالات المتوقعة لجميع عينات الاختبار. يتم فرز الاحتمالات ترتيباً تنازلياً، ثم تعامل كل قيمة احتمالية فريدة كعتبة قرار مستقلة ($\theta_i$). عند كل عتبة، يعاد حساب مصفوفة الارتباك وتستخرج النقطة الإحداثية $(FPR_i, TPR_i)$. من خلال توصيل هذه النقاط المتتالية، يتشكل المسار الهندسي للمنحنى الذي يوضح بدقة كيفية استجابة المصنف للتغير في حساسية اتخاذ القرار.

2.3 التفسير الهندسي والاحتمالي لمساحة AUC

من المنظور الهندسي والتحليلي، تحسب المساحة تحت المنحنى (AUC) عن طريق إجراء التكامل الرياضي المحدود للدالة المعرفة لمنحنى ROC على امتداد المجال الأفقي للمعدل الإيجابي الكاذب من 0 إلى 1:

$$AUC = \int_{0}^{1} TPR(FPR) , d(FPR)$$

نظراً لأن مجموعات الاختبار تتألف من عدد محدود من العينات المنفصلة، يتم حساب هذا التكامل عملياً باستخدام تقريب قاعدة شبه المنحرف (Trapezoidal Rule) لحساب المساحات المتتالية تحت القطع المستقيمة الواصلة بين النقاط الإحداثية المتجاورة.

يرتبط هذا التعريف الهندسي برابط إحصائي عميق بـ اختبار مان-ويتني (Mann-Whitney U Test) واختبار ويلكوكسون لمجموع الرتب (Wilcoxon Rank-Sum Test). تثبت النظرية الإحصائية أن حساب قيمة AUC لمصنف ثنائي يكافئ تماماً حساب إحصاءة مان-ويتني مقسومة على حاصل ضرب عدد العينات الموجبة ($n_1$) في عدد العينات السالبة ($n_0$):

$$AUC = \frac{U}{n_1 n_0} = P(S_{\text{positive}} > S_{\text{negative}})$$

حيث تمثل $S_{\text{positive}}$ الدرجة التنبؤية المعطاة لعينة موجبة عشوائية، و $S_{\text{negative}}$ الدرجة المعطاة لعينة سالبة عشوائية. يبرهن هذا التطابق الرياضي أن مقياس AUC هو مقياس غير معلمي (Non-parametric) يقيم جودة ترتيب الاحتمالات بدقة بالغة دون افتراض أي توزيع احتمالي مسبق للبيانات.

ومع ذلك، يجب الحذر عند التعامل مع المنحنيات المتقاطعة (Crossing ROC Curves). قد يتساوى نموذجان في القيمة الإجمالية لمقياس AUC (مثلاً $AUC = 0.85$ لكلا النموذجين)، إلا أن مساريهما الهندسيين يتقاطعان داخل المخطط البياني. في مثل هذه الحالات، يتفوق أحد النموذجين في النطاقات ذات معدلات FPR المنخفضة جداً، بينما يتفوق الآخر عند الرغبة في تحقيق TPR فائق. يؤكد هذا السيناريو أهمية التحليل البصري المتزامن للمنحنيات وعدم الاكتفاء بالقيمة الرقمية المنفردة لـ AUC.

3. دواعي وأهمية رسم منحنيات ROC متعددة في مخطط بياني واحد

3.1 المقارنة المباشرة بين الخوارزميات التعليمية المتنافسة

عند بناء المشاريع التطبيقية وتطوير الحلول الذكية، يندر الاعتماد على خوارزمية تعليمية واحدة دون اختبار طيف واسع من البنى الرياضية المتباينة، مثل الانحدار اللوجستي، وأشجار القرارات، والغابات العشوائية، وآلات المتجهات الداعمة، وشبكات التعلم العميق. يتيح دمج منحنيات هذه النماذج في لوحة بصرية موحدة إجراء مقارنة مرئية فورية تكشف الفروق الدقيقة في الأداء التمييزي لكل بنية خوارزمية على مجموعة البيانات المستهدفة.

تساعد المقارنة المتعددة في تقييم المفاضلة الجوهرية بين تعقيد النموذج وقدرته التفسيرية (Model Complexity vs. Interpretability). فقد يظهر الرسم البياني أن نموذجاً بسيطاً مثل الانحدار اللوجستي يقدم أداءً تمييزياً يقترب بشدة من نماذج التجميع المعقدة مثل تعزيز التدرج (Gradient Boosting). في مثل هذه الحالات، تمنح الرؤية البصرية الباحث الثقة لاعتماد النموذج الأبسط والأسرع في الاستدلال والأقل استهلاكاً للموارد الحسابية.

بالإضافة إلى ذلك، يكشف المخطط الموحد عن مدى استقرار النماذج عبر المستويات المختلفة من عتبات الحساسية؛ فالنموذج الذي يحقق أعلى قيمة AUC إجمالية قد لا يكون بالضرورة هو الأفضل عند العتبة التشغيلية المحددة التي تعتزم المؤسسة العمل عندها، وهو ما لا يمكن اكتشافه بسهولة من خلال استعراض الجداول الرقمية الصماء.

3.2 المفاضلة السريرية والتطبيقية وفقاً لتكلفة الأخطاء

تختلف البيئات التطبيقية للتعلم الآلي في طريقة تعاملها مع كلفة الأخطاء الإحصائية. ففي التطبيقات الطبية الحرجة، مثل تشخيص الأورام الخبيثة أو التنبؤ بالنوبات القلبية، تتجاوز تكلفة السلبية الكاذبة (عدم اكتشاف المريض المصاب) بمراحل تكلفة الإيجابية الكاذبة (إجراء فحص تأكيدي إضافي لشخص سليم). في هذا السياق، يبحث الأطباء عن نموذج يحقق أعلى معدل حساسية ممكن ($TPR ge 0.95$) مع الحفاظ على معدل إنذار كاذب ($FPR$) مقبول ضمن هذا النطاق الضيق.

وعلى النقيض من ذلك، في أنظمة حظر البريد العشوائي (Spam Filtering) أو منصات كشف المعاملات المالية المشبوهة اللحظية، تكون تكلفة الإيجابية الكاذبة باهظة جداً؛ إذ إن حظر بريد إلكتروني هام أو تجميد بطاقة بنكية لعميل دون وجه حق يتسبب في استياء واسع وخسائر تشغيلية. تتطلب هذه الأنظمة العمل في النطاق التشغيلي الأيسر من منحنى ROC، حيث يكون المطلوب إبقاء معدل $FPR$ قريباً من الصفر المطلق ($FPR le 0.01$).

يتيح رسم المنحنيات المتعددة على مخطط واحد إجراء تقييم موضعي مستهدف ضمن النطاق التشغيلي الحرج (Critical Operational Region). من خلال الفحص البصري للمنطقة المحددة على المحور الأفقي، يمكن لصانع القرار اختيار الخوارزمية التي تعلو جميع الخوارزميات الأخرى داخل ذلك النطاق بالتحديد، حتى لو كانت قيمة AUC الكلية لتلك الخوارزمية أقل قليلاً من منافساتها على كامل المنحنى.

3.3 تحسين الوضوح البصري في الأوراق العلمية والتقارير الأكاديمية

تفرض التقاليد الأكاديمية ومعايير النشر في المجلات العلمية المحكمة ضوابط صارمة على تمثيل النتائج التجريبية. إن تقديم مخططات بيانية منفصلة لكل نموذج يؤدي إلى تشتيت انتباه القارئ، ويزيد من استهلاك المساحة المحددة للأوراق العلمية، ويعقد عملية المقارنة الذهنية بين النماذج بسبب احتمالية اختلاف مقاييس المحاور أو أحجام الرسوم.

يعمل توحيد المنحنيات في إطار بياني واحد على توفير وسيلة إيضاح قياسية موحدة تخضع لنفس الإحداثيات والحدود الصارمة $[0, 1]$. كما يتيح دمج قيم مقياس AUC لكل نموذج مباشرة داخل وسيلة الإيضاح (Legend) للقارئ استيعاب الأداء الإجمالي والجزئي في نظرة واحدة شاملة وسلسة.

علاوة على ذلك، يسهل هذا التمثيل الموحد صياغة نقاشات علمية رصينة في قسم النتائج (Results and Discussion)، حيث يمكن للباحث الإشارة مباشرة إلى نقاط التقاطع بين المنحنيات، وتفسير سلوك الخوارزميات المختلفة استناداً إلى خصائصها البنيوية، مما يرفع من جودة الورقة العلمية وقيمتها الإقناعية لدى المراجعين.

4. إعداد بيئة العمل البرمجية واستيراد المكتبات الأساسية في بايثون

4.1 تجهيز بيئة التطوير وتثبيت الحزم اللازمة

لضمان الحصول على نتائج علمية موثوقة وقابلة للتكرار (Reproducible)، يجب تهيئة بيئة تطوير برمجية معزولة باستخدام أدوات إدارة البيئات مثل Conda أو بيئات العمل الافتراضية Virtualenv في بايثون. يمنع هذا الإجراء تضارب الاعتماديات بين إصدارات المكتبات المختلفة ويضمن تشغيل الشفرات البرمجية بسلاسة عبر مختلف منصات الحوسبة.

تعتمد المعالجة الإحصائية ورسم المنحنيات على ثلاث مكتبات رئيسية تشكل العمود الفقري لعلوم البيانات في بايثون: مكتبة NumPy لإدارة المصفوفات والعمليات الحسابية المتجهية، ومكتبة Scikit-Learn لبناء وتقييم نماذج التعلم الآلي، ومكتبة Matplotlib لتوليد الرسوم البيانية التوضيحية بجودة عالية. يمكن تثبيت هذه الحزم في بيئة العمل باستخدام مدير الحزم بالشكل التالي:

pip install numpy matplotlib scikit-learn seaborn

يوصى دائماً بتوثيق أرقام إصدارات المكتبات المستخدمة داخل البيئة البحثية لضمان تطابق المخرجات الرياضية وتجنب التغييرات التي قد تطرأ على الدوال البرمجية في التحديثات المستقبلية.

4.2 استيراد دوال ومقاييس Scikit-Learn المتخصصة

تتضمن مكتبة Scikit-Learn ترسانة متكاملة من الوحدات البرمجية المخصصة لحساب المقاييس الإحصائية المتقدمة. نحتاج بصفة أساسية إلى استيراد دوال تقييم منحنيات ROC وحساب المساحات المحصورة، بالإضافة إلى وحدات بناء النماذج وتقسيم مجموعات البيانات.

في الشفرة البرمجية التالية، نستورد الوحدات الأساسية اللازمة للتحليل، بما في ذلك دالة roc_curve المسؤولة عن حساب مصفوفات FPR و TPR وسلسلة العتبات، ودالة roc_auc_score لحساب التكامل العددي للمساحة تحت المنحنى بدقة:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, roc_auc_score, RocCurveDisplay
import numpy as np
import matplotlib.pyplot as plt

يوفر هذا البناء المعياري وصولاً مباشراً إلى الخوارزميات المتنوعة التي سيتم تدريبها ومقارنتها عبر نفس خط الأنابيب البرمجي المتكامل.

4.3 إعداد وتخصيص مكتبة Matplotlib للرسم الإحصائي

لإنتاج رسومات بيانية تلبي المتطلبات الصارمة للمجلات الأكاديمية والمؤتمرات الدولية، يجب ضبط المعلمات الجمالية والهندسية لمكتبة Matplotlib بشكل مسبق. يشمل ذلك تحديد كثافة النقاط لكل بوصة (DPI) لضمان وضوح الرسم عند الطباعة، واختيار أبعاد المخطط المناسبة، وتفعيل الخطوط القياسية الواضحة.

يمكن تهيئة معلمات النظام الرسومي عبر واجهة rcParams لتوحيد المظهر العام لكافة العناصر البصرية، كما يوضح المقطع البرمجي التالي:

plt.rcParams['font.sans-serif'] = 'DejaVu Sans'
plt.rcParams['axes.edgecolor'] = '#333333'
plt.rcParams['axes.linewidth'] = 1.2
plt.rcParams['figure.dpi'] = 300

تسهم هذه التعديلات المسبقة في منح الرسوم البيانية مظهراً احترافياً يعكس الدقة المنهجية المتبعة في التحليل الإحصائي ويسهل عملية دمج الأشكال مباشرة في الأوراق البحثية بصيغ متعددة.

5. بناء وتجهيز مجموعة البيانات وتوزيعها وفق معايير البحث العلمي

5.1 توليد بيانات تصنيفية اصطناعية مضبوطة الخصائص

لإجراء تجربة منضبطة تسمح بفحص السلوك التمييزي للخوارزميات المتنافسة بدقة، يفضل استخدام مجموعة بيانات اصطناعية مضبوطة الخصائص الرياضية باستخدام الدالة make_classification من مكتبة Scikit-Learn. تتيح هذه الدالة التحكم الدقيق في عدد العينات الإجمالي، وعدد السمات المفيدة، ومستوى التداخل الإحصائي بين الفئات.

في التطبيق العملي، نقوم بإنشاء مجموعة بيانات تتكون من 2000 عينة موزعة على 20 متغيراً تفسيرياً، مع ضبط معامل التداخل ليعكس سيناريو واقعي يحتوي على قدر محسوب من الضوضاء الإحصائية، مع تثبيت البذرة العشوائية (random_state=42) لضمان قابلية تكرار التجربة:

X, y = make_classification(
    n_samples=2000,
    n_features=20,
    n_informative=12,
    n_redundant=4,
    n_clusters_per_class=2,
    flip_y=0.05,
    random_state=42
)

يضمن هذا الإعداد الرياضي توليد حدود قرار غير خطية ومعقدة تختبر القدرات التمييزية لمختلف البنى الخوارزمية بشكل عادل وموضوعي.

5.2 تقسيم البيانات إلى مجموعات تدريب واختبار متوازنة

وفقاً للأعراف المنهجية الصارمة في التعلم الآلي، لا يجوز بأي حال من الأحوال تقييم النماذج التنبؤية أو حساب منحنيات ROC على نفس البيانات المستخدمة في تدريب الخوارزميات؛ إذ يؤدي ذلك إلى وقوع ظاهرة التوافق الزائد (Overfitting) وتقديم تقييمات مفرطة في التفاؤل لا تعكس قدرة النموذج على التعميم على بيانات واقعية غير مرئية.

يتم عزل مجموعة اختبار مستقلة بنسبة 30% من البيانات الكلية باستخدام دالة train_test_split، مع الحرص على تطبيق التقسيم الطبقي (Stratification) من خلال ضبط المعلمة stratify=y. يضمن التقسيم الطبقي الحفاظ على نفس النسبة المئوية لتوزيع الفئات الأصلية في كل من مصفوفة التدريب ومصفوفة الاختبار:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.30, random_state=42, stratify=y
)

يعزز هذا الإجراء من التوازن الإحصائي للتحليل، ويمنع نشوء أي انحياز تركيبي قد ينتج عن العشوائية البسيطة في عزل العينات.

5.3 معالجة البيانات والتحقق من التوزيعات الإحصائية

تتطلب العديد من الخوارزميات التصنيفية، وخاصة النماذج الخطية وآلات المتجهات الداعمة، أن تكون المتغيرات التفسيرية على نفس المقياس الحسابي لتجنب هيمنة السمات ذات القيم الرقمية الكبيرة على دالة الهدف أثناء عملية التحسين الرياضي. يتم تحقيق ذلك عبر تطبيق التقييس القياسي (StandardScaler) لضبط المتوسط الحسابي عند الصفر والانحراف المعياري عند الواحد الصحيح.

لتفادي الوقوع في خطأ تسريب المعلومات (Data Leakage)، يتم حساب معلمات التقييس (المتوسط والانحراف المعياري) حصرياً من مجموعة التدريب X_train، ثم تطبق نفس هذه المعلمات المحسوبة لتحويل مجموعة الاختبار X_test دون إعادة حسابها من عينة الاختبار:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

يحافظ هذا الالتزام المنهجي الصارم على الاستقلالية المطلقة لمجموعة الاختبار، مما يضمن أن منحنيات ROC الناتجة تعكس أداء التعميم الفعلي للنماذج في بيئة الإنتاج الواقعية.

6. تدريب نماذج خوارزمية متعددة ومتباينة البنية الرياضية

6.1 تدريب نموذج الانحدار اللوجستي (Logistic Regression)

يعد نموذج الانحدار اللوجستي (Logistic Regression) النموذج الخطي المرجعي الأساسي (Baseline Model) في مهام التصنيف الثنائي. يعتمد النموذج على ربط التركيبة الخطية للمتغيرات المستقلة بالاحتمال التنبؤي عبر دالة لوجستية قياسية (Sigmoid Function)، مما يسمح بإنتاج احتمالات معايرة بشكل طبيعي تقع داخل المجال $[0, 1]$.

نقوم بتهيئة النموذج وملاءمته على بيانات التدريب المعالجة باستخدام خوارزمية التحسين ‘lbfgs’ مع تحديد حد أقصى مناسب لعدد التكرارات لضمان التقارب الحسابي التام:

model_lr = LogisticRegression(random_state=42, max_iter=1000)
model_lr.fit(X_train, y_train)

يعمل هذا النموذج الخطي كمعيار مرجعي لقياس مدى الحاجة إلى استخدام نماذج لاخطية أكثر تعقيداً في معالجة مجموعة البيانات محل الدراسة.

6.2 تدريب نموذج تعزيز التدرج (Gradient Boosting Classifier)

يمثل نموذج تعزيز التدرج (Gradient Boosting Classifier) أحد أقوى نماذج التجميع التسلسلي القائمة على أشجار القرارات (Boosting Ensemble). تقوم الخوارزمية ببناء سلسلة متتالية من الأشجار الضحلة، حيث تختص كل شجرة جديدة بمعالجة وتصحيح الأخطاء المتبقية (Residuals) الناتجة عن الأشجار السابقة عبر تقليل دالة الخسارة باستخدام خوارزمية الانحدار التدريجي.

يتم ضبط المعلمات الفائقة الأساسية للنموذج، مثل عدد المقدرات (n_estimators=150) ومعدل التعلم (learning_rate=0.1) والعمق الأقصى للأشجار (max_depth=3)، لتوفير قدرة عالية على نمذجة التفاعلات اللاخطية المعقدة دون الانزلاق إلى التوافق الزائد:

model_gb = GradientBoostingClassifier(
    n_estimators=150, learning_rate=0.1, max_depth=3, random_state=42
)
model_gb.fit(X_train, y_train)

تتيح هذه البنية المرنة للنموذج اكتشاف أنماط تمييزية دقيقة قد تعجز النماذج الخطية عن استيعابها، مما ينعكس عادة في شكل تحسن ملموس على مسار منحنى ROC.

6.3 إضافة نماذج إضافية لتعزيز المقارنة (Random Forest & SVM)

لتوسيع نطاق المقارنة البصرية والإحصائية، نقوم بدمج خوارزميتين إضافيتين تنتميان لعائلات رياضية مختلفة تماماً: خوارزمية الغابات العشوائية (Random Forest) التي تعتمد على تقنية التجميع المتوازي للأشجار المستقلة (Bagging)، وخوارزمية آلات المتجهات الداعمة (Support Vector Machines – SVM) ذات النواة الشعاعية (RBF Kernel).

في حالة نموذج SVM، يجب تفعيل المعلمة probability=True أثناء التهيئة؛ إذ تعتمد الخوارزمية في الأصل على حساب المسافة الهندسية عن المستوى الفاصل الفائق، ويؤدي تفعيل هذه الخاصية إلى تدريب نموذج معايرة بلات (Platt Scaling) إضافي لحساب الاحتمالات المستمرة المطلوبة لرسم منحنى ROC:

model_rf = RandomForestClassifier(n_estimators=150, random_state=42)
model_rf.fit(X_train, y_train)

model_svm = SVC(kernel='rbf', probability=True, random_state=42)
model_svm.fit(X_train, y_train)

بهذا التنوع البنيوي، نكون قد أسسنا منصة تجريبية متكاملة تضم أربعة نماذج متباينة تمثل النماذج الخطية، والتجميع التسلسلي، والتجميع المتوازي، والفصل الهندسي الفائق.

7. استخراج الاحتمالات المتوقعة وحساب إحداثيات منحنى ROC برمجياً

7.1 استخدام دالة `predict_proba` لاستخراج الاحتمالات المستمرة

من الأخطاء الشائعة والجسيمة في تقييم النماذج التصنيفية استخدام دالة predict لتوليد مخرجات التقييم؛ إذ تنتج هذه الدالة تسميات فئوية قطعية ثنائية (0 أو 1) تم تحديدها بناءً على عتبة افتراضية ثابتة ($0.5$). يؤدي تمرير هذه التسميات الثنائية إلى دالة roc_curve إلى تقليص المنحنى إلى نقطة تشغيلية واحدة فقط متصلة بنقطتي البداية والنهاية، مما يدمر الطبيعة المستمرة لمنحنى ROC ويفقده قيمته التحليلية.

بدلاً من ذلك، يجب استخدام دالة predict_proba التي ترجع مصفوفة ذات عمودين تحتوي على الاحتمال المقدر لكل فئة على حدة. نقوم باستخلاص العمود الثاني حصرياً (الفهرس 1) الذي يعبر عن احتمال الانتماء للفئة الإيجابية المستهدفة $P(Y=1|X)$:

# استخراج الاحتمالات المتوقعة للفئة الإيجابية
prob_lr = model_lr.predict_proba(X_test)[:, 1]
prob_gb = model_gb.predict_proba(X_test)[:, 1]
prob_rf = model_rf.predict_proba(X_test)[:, 1]
prob_svm = model_svm.predict_proba(X_test)[:, 1]

تمثل هذه الاحتمالات المستمرة المدخلات الحسابية الدقيقة اللازمة لمسح كافة العتبات الممكنة وإنشاء المسار الهندسي الكامل للمنحنيات.

7.2 استدعاء دالة `roc_curve` وتوليد قيم FPR وTPR والعتبات

تتولى دالة roc_curve تنفيذ الحسابات الرياضية الموضحة في القسم الثاني تلقائياً. عند تمرير المتجه الفعلي للقيم الحقيقية y_test ومتجه الاحتمالات المتوقعة prob_*، تقوم الدالة بفرز الاحتمالات وحساب مصفوفة الارتباك عند كل قيمة فريدة، لتعيد ثلاث مصفوفات عددية متوافقة الأبعاد:

  • fpr: مصفوفة تحتوي على قيم المعدل الإيجابي الكاذب المحسوبة عند كل عتبة، والتي تمثل إحداثيات المحور الأفقي.
  • tpr: مصفوفة تحتوي على قيم المعدل الإيجابي الحقيقي المقابلة، والتي تمثل إحداثيات المحور الرأسي.
  • thresholds: مصفوفة تحتوي على قيم عتبات القرار المقابلة لكل نقطة إحداثية، مرتبة من أعلى احتمال إلى أدناه.

يوضح المثال البرمجي التالي كيفية استدعاء الدالة واستخراج الإحداثيات لكل نموذج:

fpr_lr, tpr_lr, thresholds_lr = roc_curve(y_test, prob_lr)
fpr_gb, tpr_gb, thresholds_gb = roc_curve(y_test, prob_gb)
fpr_rf, tpr_rf, thresholds_rf = roc_curve(y_test, prob_rf)
fpr_svm, tpr_svm, thresholds_svm = roc_curve(y_test, prob_svm)

تشكل هذه المصفوفات النقطية الهيكل الرياضي الأساسي الذي سيتم إسقاطه على اللوحة البيانية لإنشاء المنحنيات المتراكبة.

7.3 حساب المساحة تحت المنحنى بدقة باستخدام `roc_auc_score`

لتلخيص الأداء التمييزي الشامل لكل نموذج في قيمة قياسية موحدة، نستخدم دالة roc_auc_score لحساب المساحة المحصورة تحت كل منحنى. تقوم هذه الدالة بتطبيق التكامل الرياضي شبه المنحرف على الإحداثيات المستخرجة:

auc_lr = roc_auc_score(y_test, prob_lr)
auc_gb = roc_auc_score(y_test, prob_gb)
auc_rf = roc_auc_score(y_test, prob_rf)
auc_svm = roc_auc_score(y_test, prob_svm)

نقوم بتخزين هذه القيم العددية لتضمينها لاحقاً داخل مفتاح الرسم البياني (Legend) بجانب اسم كل خوارزمية، مما يمنح القارئ فهماً فورياً لترتيب النماذج من حيث القوة التمييزية الإجمالية بدقة تصل إلى ثلاثة أو أربعة أرقام عشرية.

8. التطبيق البرمجي الكامل لرسم منحنيات ROC متعددة باستخدام Matplotlib

8.1 كتابة الشفرة البرمجية الموحدة للمقارنة الثنائية

بعد حساب الإحداثيات وقيم AUC لجميع النماذج، ننتقل إلى مرحلة البناء البصري للرسم البياني باستخدام مكتبة Matplotlib. تبدأ العملية بإنشاء كائن اللوحة البيانية وتحديد أبعادها المناسبة لضمان وضوح المسارات وتفادي تداخل الخطوط.

يتم رسم كل منحنى على حدة باستخدام الدالة plt.plot مع تمرير مصفوفتي fpr و tpr وتعيين نص وصفي داخل المعلمة label يدمج اسم النموذج وقيمة AUC المحسوبة له:

plt.figure(figsize=(10, 8))

# رسم منحنيات النماذج الأساسية
plt.plot(fpr_lr, tpr_lr, label=f'Logistic Regression (AUC = {auc_lr:.3f})', linewidth=2)
plt.plot(fpr_gb, tpr_gb, label=f'Gradient Boosting (AUC = {auc_gb:.3f})', linewidth=2)
plt.plot(fpr_rf, tpr_rf, label=f'Random Forest (AUC = {auc_rf:.3f})', linewidth=2)
plt.plot(fpr_svm, tpr_svm, label=f'Support Vector Machine (AUC = {auc_svm:.3f})', linewidth=2)

يسمح هذا التراكب البصري المباشر برصد الفروق الهندسية الدقيقة بين مسارات الخوارزميات وتحديد النموذج المتفوق في كل قطاع من المخطط.

plot multiple ROC curves in Python
plot multiple ROC curves in Python

8.2 إضافة الخط المرجعي للتخمين العشوائي (Random Chance Line)

من المعايير الأساسية في رسم منحنيات ROC تضمين خط التخمين العشوائي المرجعي (Baseline Random Guessing Line). يمتد هذا الخط قطرياً من نقطة الأصل $(0, 0)$ إلى النقطة العليا اليمنى $(1, 1)$، ويمثل أداء مصنف وهمي لا يمتلك أي قدرة تمييزية ويعتمد كلياً على الصدفة البحتة، محققاً قيمة $AUC = 0.50$.

يتم رسم هذا الخط بنمط متقطع وتلوينه بدرجة رمادية داكنة أو لون حيادي لتجنب تشتيت الانتباه عن منحنيات النماذج الفعلية، كما يوضح المقطع التالي:

plt.plot([0, 1], [0, 1], linestyle='--', color='gray', linewidth=1.5, label='Random Classifier (AUC = 0.500)')

يعمل هذا الخط كمرجع إحصائي بديهي؛ إذ يجب أن تبتعد منحنيات النماذج الحقيقية المقبولة عن هذا الخط نحو الزاوية العليا اليسرى للمخطط، والتي تمثل نقطة التصنيف المثالي $(0, 1)$.

8.3 إضافة العناوين، والتسميات المحورية، وشبكة الإحداثيات

لإكمال البناء الجمالي والوظيفي للشكل البياني، يجب إضافة تسميات محورية دقيقة لا لبس فيها، وتحديد نطاق المحاور بصرامة داخل المجال $[0.0, 1.0]$، وتفعيل شبكة إحداثيات خفيفة تساعد العين البشرية على قراءة القيم المتقابلة بسهولة.

توضح الشفرة التالية استكمال كافة العناصر التوضيحية للشكل البياني وتثبيت مفتاح الرسم في الركن السفلي الأيمن، وهو الموضع التقليدي الأنسب الذي يندر أن تتداخل فيه وسيلة الإيضاح مع مسارات المنحنيات الصاعدة:

plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (1 - Specificity)', fontsize=12, fontweight='bold')
plt.ylabel('True Positive Rate (Sensitivity / Recall)', fontsize=12, fontweight='bold')
plt.title('Receiver Operating Characteristic (ROC) Multi-Model Comparison', fontsize=14, fontweight='bold', pad=15)
plt.legend(loc='lower right', fontsize=10, frameon=True, shadow=True)
plt.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()

يقدم هذا المخطط النهائي وثيقة إحصائية بصرية متكاملة تلخص نتائج المقارنة التجريبية بأعلى معايير الدقة والاحترافية.

9. أتمتة العملية البرمجية لمقارنة عدد غير محدود من النماذج

9.1 بناء قاموس برمجي ديناميكي لاحتواء النماذج وخوارزمياتها

على الرغم من فاعلية النهج اليدوي السابق في المقارنات المحدودة، إلا أنه يصبح غير عملي وعرضة للأخطاء عند الرغبة في مقارنة عشرات النماذج أو اختبار مجموعات متنوعة من المعلمات الفائقة. يقتضي مبدأ البرمجة النظيفة (DRY – Don’t Repeat Yourself) أتمتة هذه العملية بالكامل من خلال هيكلة النماذج داخل قاموس برمجي ديناميكي (Dictionary).

نقوم بتعريف قاموس يربط الأسماء التوضيحية للنماذج ككائنات مفتاحية (Keys) بنسخ الخوارزميات المهيأة كقيم برمجية (Values):

models_dict = {
    'Logistic Regression': LogisticRegression(random_state=42, max_iter=1000),
    'Gradient Boosting': GradientBoostingClassifier(n_estimators=150, random_state=42),
    'Random Forest': RandomForestClassifier(n_estimators=150, random_state=42),
    'Support Vector Machine': SVC(kernel='rbf', probability=True, random_state=42)
}

تسمح هذه البنية المرنة بإضافة أو استبعاد أي نموذج بمجرد تعديل سطر واحد داخل القاموس دون المساس بالبنية الأساسية لكود التدريب والتقييم والرسم.

9.2 استخدام الحلقات التكرارية (Loops) للتدريب والاستخراج والرسم التلقائي

باستخدام حلقة تكرارية مفردة (For Loop)، يمكننا المرور تلقائياً على كافة عناصر القاموس لتنفيذ دورة العمل الكاملة: تدريب النموذج على مجموعة التدريب، واستخراج الاحتمالات المتوقعة لمجموعة الاختبار، وحساب مصفوفات roc_curve وقيمة roc_auc_score، ثم رسم المنحنى مباشرة على نفس كائن اللوحة البيانية.

يوضح الكود التالي تنفيذ هذه الأتمتة الشاملة مع تعيين لوحة ألوان ديناميكية لضمان تباين ألوان الخطوط تلقائياً:

plt.figure(figsize=(10, 8))

for name, model in models_dict.items():
    # التدريب والاستدلال
    model.fit(X_train, y_train)
    y_prob = model.predict_proba(X_test)[:, 1]
    
    # الحساب الإحصائي
    fpr, tpr, _ = roc_curve(y_test, y_prob)
    auc_val = roc_auc_score(y_test, y_prob)
    
    # الرسم التراكمي
    plt.plot(fpr, tpr, linewidth=2, label=f'{name} (AUC = {auc_val:.3f})')

# إضافة الملحقات البصرية القياسية
plt.plot([0, 1], [0, 1], 'k--', linewidth=1.5, label='Random Chance (AUC = 0.500)')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate', fontsize=12)
plt.ylabel('True Positive Rate', fontsize=12)
plt.title('Automated Multi-Model ROC Evaluation', fontsize=14, fontweight='bold')
plt.legend(loc='lower right', fontsize=10)
plt.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()

تختزل هذه الشفرة المؤتمتة عشرات الأسطر المتكررة في هيكل برمجي أنيق وقابل للتوسع اللانهائي في المشروعات التجريبية الكبرى.

9.3 استخدام فئة `RocCurveDisplay` الحديثة من مكتبة Scikit-Learn

في الإصدارات الحديثة من مكتبة Scikit-Learn، تم تقديم واجهة برمجية متطورة عبر فئة RocCurveDisplay لتسهيل رسم المنحنيات مباشرة من النماذج المدربة دون الحاجة إلى استدعاء دوال الحساب والرسم المنفصلة يدوياً.

تتيح الدالة RocCurveDisplay.from_estimator تمرير النموذج المدرب مباشرة مع مصفوفة الاختبار X_test والهدف y_test وكائن المحاور الرسومية ax ليتم حساب المنحنى والمساحة ورسم الخط بخطوة برمجية واحدة مدمجة:

fig, ax = plt.subplots(figsize=(10, 8))

for name, model in models_dict.items():
    RocCurveDisplay.from_estimator(
        model, X_test, y_test, name=name, ax=ax, linewidth=2
    )

plt.plot([0, 1], [0, 1], 'k--', label='Chance (AUC = 0.50)')
plt.title('ROC Curves using RocCurveDisplay API', fontsize=14, fontweight='bold')
plt.grid(True, linestyle=':', alpha=0.6)
plt.show()

تتميز هذه الواجهة الحديثة بالسرعة والموثوقية والتكامل التام مع بنية كائنات Scikit-Learn، مما يجعلها الخيار المفضل في بيئات التطوير السريع والنماذج الأولية.

10. تخصيص التنسيق البصري للرسوم البيانية لمعايير النشر الأكاديمي

10.1 اختيار لوحات الألوان المتوافقة مع النشر العلمي والميسرة لعمى الألوان

تفرض المجلات الأكاديمية المرموقة (مثل Nature وIEEE وElsevier) معايير بصرية صارمة تتطلب إمكانية قراءة المخططات والرسوم البيانية من قبل الأشخاص المصابين بمختلف درجات عمى الألوان (Color Vision Deficiency)، بالإضافة إلى الحفاظ على وضوح التباين عند طباعة الأوراق العلمية بالأبيض والأسود والتدرج الرمادي (Grayscale).

يعد استخدام لوحات الألوان الإدراكية الموحدة (Perceptually Uniform Colormaps) مثل ‘viridis’ أو ‘cividis’ أو لوحة ألوان ColorBrewer الخيار الأمثل لتحقيق هذه المتطلبات. علاوة على ذلك، يوصى بالجمع بين تنويع الألوان وتنويع أنماط الخطوط (Linestyles)؛ كاستخدام الخط المتصل للنموذج الأفضل، والخط المنقط، والخط ذي الشرطات، لضمان التمييز التام حتى في حال انعدام الألوان تماماً:

linestyles = ['-', '--', '-.', ':']
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']

for (name, model), ls, color in zip(models_dict.items(), linestyles, colors):
    fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
    auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
    plt.plot(fpr, tpr, linestyle=ls, color=color, linewidth=2.2, label=f'{name} ({auc:.3f})')

يعزز هذا النهج التصميمي من شمولية البحث العلمي ويضمن سهولة تفسير النتائج لكافة فئات القراء والمحكمين الدوليين.

10.2 التحكم في الخطوط، والتسميات التوضيحية، وحجم المخرجات

عند إعداد الرسوم البيانية لتناسب المقالات ذات العمودين (Two-column format) الشائعة في النشر الأكاديمي، تصبح مشكلة تداخل النصوص وصغر حجم الخطوط عند تصغير الشكل عائقاً كبيراً أمام القراءة السلسة. يجب ضبط أحجام الخطوط ونسب تباعد التسميات بدقة تتناسب مع حجم الشكل النهائي.

ينصح باستخدام خطوط خالية من التذييلات (Sans-serif) مثل Arial أو Helvetica أو DejaVu Sans لضمان وضوح الأحرف اللاتينية والأرقام عند الطباعة المصغرة. كما يجب تجنب الإفراط في وضع التسميات داخل مساحة الرسم والاعتماد على مفاتيح واضحة ذات إطارات مظللة خفيفة تمنع التداخل البصري مع خطوط الشبكة الإحداثية.

10.3 تصدير وحفظ الأشكال البيانية بدقة عالية متجهة ونقطية

تمثل مرحلة تصدير الأشكال الرسومية الخطوة الختامية لخط الأنابيب التحليلي. تتطلب دور النشر تقديم الأشكال البيانية إما بصيغ متجهة (Vector Formats) مثل PDF أو SVG أو EPS التي تحافظ على حدة الخطوط اللانهائية عند التكبير والطباعة بدقة عالية، أو بصيغ نقطية عالية الكثافة (Raster Formats) مثل TIFF أو PNG بدقة لا تقل عن 300 إلى 600 نقطة في البوصة (DPI).

توفر دالة plt.savefig في Matplotlib التحكم الكامل في معايير التصدير. يجب دائماً استخدام المعلمة bbox_inches='tight' لمنع قص الهوامش الخارجية أو التسميات المحورية عند حفظ الملف:

# تصدير الشكل بصيغة متجهة للأبحاث الأكاديمية
plt.savefig('roc_curves_academic.pdf', format='pdf', dpi=300, bbox_inches='tight')

# تصدير الشكل بصيغة نقطية عالية الدقة للتقارير الرقمية
plt.savefig('roc_curves_high_res.png', format='png', dpi=600, bbox_inches='tight')

يضمن هذا التصدير الاحترافي جاهزية الأشكال للإدراج المباشر في أنظمة التنضيد الطباعي مثل LaTeX دون أي فقدان في الجودة البصرية.

11. تطبيقات متقدمة: التصنيف متعدد الفئات، والتحقق المتقاطع، والبيانات غير المتوازنة

11.1 رسم منحنيات ROC للتصنيف متعدد الفئات (Multiclass ROC)

في المشكلات التصنيفية التي تتجاوز الفئتين الثنائيتين (Multiclass Classification)، لا يمكن تطبيق معادلات ROC الكلاسيكية بشكل مباشر؛ إذ لا توجد فئة سالبة واحدة واضحة. لمعالجة هذا التحدي، يتم تفكيك المشكلة متعددة الفئات إلى سلسلة من المشكلات الثنائية باستخدام استراتيجية “واحد مقابل البقية” (One-vs-Rest / OvR).

تتطلب هذه العملية تحويل مصفوفة الأهداف المتعددة إلى ترميز ثنائي متناثر باستخدام دالة label_binarize. يتم بعد ذلك حساب منحنى ROC مستقل لكل فئة تصنيفية مع معاملة كافة الفئات الأخرى كفئة سلبية مركبة. بالإضافة إلى ذلك، يتم حساب المتوسطات التجميعية للأداء، والتي تشمل المتوسط الصغير (Micro-average) الذي يجمع إسهامات كافة العينات لحساب المعدلات الكلية، والمتوسط الكبير (Macro-average) الذي يحسب المتوسط الحسابي البسيط لمنحنيات الفئات بصرف النظر عن حجم كل فئة:

from sklearn.preprocessing import label_binarize

# تحويل الأهداف إلى تمثيل ثنائي متعدد الأعمدة
y_bin = label_binarize(y_multi, classes=[0, 1, 2])
n_classes = y_bin.shape[1]

# حساب منحنى ROC لكل فئة على حدة
fpr_dict = dict()
tpr_dict = dict()
roc_auc_dict = dict()

for i in range(n_classes):
    fpr_dict[i], tpr_dict[i], _ = roc_curve(y_test_bin[:, i], y_score[:, i])
    roc_auc_dict[i] = roc_auc_score(y_test_bin[:, i], y_score[:, i])

يتيح رسم هذه المنحنيات المتعددة في مخطط واحد كشف التباين في قدرة النموذج على تمييز كل فئة، وتحديد الفئات المعقدة التي تشهد أعلى معدلات تداخل ولبس تنبؤي.

11.2 دمج منحنيات ROC مع التحقق المتقاطع (K-Fold Cross-Validation)

لتقديم تقييم إحصائي متين لا يتأثر بطريقة تقسيم عينة التدريب والاختبار الفردية، يتم دمج حساب منحنيات ROC مع تقنية التحقق المتقاطع الطبقي (Stratified K-Fold Cross-Validation). يتم تدريب النموذج وتقييمه عبر $K$ طية مستقلة (مثلاً $K=5$ أو $K=10$).

نظراً لأن كل طية تنتج مصفوفات FPR ذات أطوال ونقاط إحداثية متباينة، لا يمكن حساب المتوسط الحسابي البسيط مباشرة بين الطيات. يتم حل هذه المشكلة رياضياً عبر تطبيق الاستيفاء الخطي (Linear Interpolation) باستخدام دالة np.interp لتوحيد قيم TPR على امتداد شبكة موحدة من قيم FPR الممتدة بين 0 و 1:

from sklearn.model_selection import StratifiedKFold

cv = StratifiedKFold(n_splits=5)
mean_fpr = np.linspace(0, 1, 100)
tprs = []
aucs = []

for train_idx, test_idx in cv.split(X, y):
    model.fit(X[train_idx], y[train_idx])
    prob = model.predict_proba(X[test_idx])[:, 1]
    fpr, tpr, _ = roc_curve(y[test_idx], prob)
    
    # استيفاء المنحنى وتثبيت نقطة البداية
    interp_tpr = np.interp(mean_fpr, fpr, tpr)
    interp_tpr[0] = 0.0
    tprs.append(interp_tpr)
    aucs.append(roc_auc_score(y[test_idx], prob))

# حساب المنحنى المتوسط ومجال الثقة
mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = np.mean(aucs)
std_auc = np.std(aucs)

plt.plot(mean_fpr, mean_tpr, color='b', label=f'Mean ROC (AUC = {mean_auc:.2f} ± {std_auc:.2f})')

# رسم نطاق الانحراف المعياري (Confidence Interval)
std_tpr = np.std(tprs, axis=0)
tprs_upper = np.minimum(mean_tpr + std_tpr, 1)
tprs_lower = np.maximum(mean_tpr - std_tpr, 0)
plt.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=0.2, label=r'± 1 std. dev.')

يوفر هذا التحليل المتقدم تقديراً بصرياً لدرجة عدم اليقين (Uncertainty) والاستقرار الإحصائي للنموذج عبر عينات البيانات المختلفة، وهو ما يعد ركيزة أساسية في التحقق السريري والصناعي المتقدم.

11.3 التعامل مع مجموعات البيانات غير المتوازنة واستخدام منحنى الدقة والاستدعاء (PR Curve)

على الرغم من المناعة النسبية لمنحنى ROC ضد عدم توازن الفئات، إلا أنه قد يقدم في سيناريوهات عدم التوازن الحاد جداً (مثل نسبة إيجابيات 1 إلى 1000) انطباعاً مفرطاً في التفاؤل؛ إذ إن وجود عدد ضخم جداً من السلبيات الحقيقية ($TN$) في المقام يؤدي إلى إبقاء قيمة المعدل الإيجابي الكاذب ($FPR = FP / (TN + FP)$) منخفضة للغاية حتى وإن كان عدد الإيجابيات الكاذبة ($FP$) كبيراً جداً مقارنة بالإيجابيات الحقيقية.

في مثل هذه الحالات المعقدة، يوصى بالاعتماد على منحنى الدقة والاستدعاء (Precision-Recall Curve – PR Curve) كبديل أو مكمل أساسي لمنحنى ROC. يركز منحنى PR على العلاقة بين الدقة ($TP / (TP + FP)$) والاستدعاء ($TP / (TP + FN)$)، متجاهلاً السلبيات الحقيقية بالكامل، مما يجعله شديد الحساسية لأي زيادة في الإنذارات الكاذبة.

يوضح التحليل المقارن أنه بينما يجب استخدام منحنى ROC للحصول على تقييم عام لقدرة النموذج على الترتيب والتمييز المستقل عن نسب الفئات، فإن منحنى PR يظل الأداة الإلزامية عندما تكون الفئة الإيجابية نادرة جداً ومكلفة للغاية.

12. تفسير النتائج، وتجنب الأخطاء المنهجية، ودراسة حالة تطبيقية

12.1 التحليل الإحصائي والاستنتاج المقارن بين النماذج

لا يتوقف التقييم العلمي عند مجرد استعراض قيم AUC الأعلى، بل يتطلب تحليلاً إحصائياً دقيقاً لتحديد ما إذا كانت الفروق المشاهدة بين النماذج ذات دلالة إحصائية حقيقية (Statistically Significant) أم أنها ناتجة عن التباين العشوائي في عينة الاختبار. يعد اختبار دي-لونغ (DeLong’s Test) الاختبار الإحصائي غير المعلمي المعياري لمقارنة المساحات تحت منحنيات ROC المترابطة المحسوبة على نفس مجموعة البيانات.

عند قراءة المخطط البياني، يجب على الباحث فحص سلوك المنحنيات عند نهايات المحاور؛ فالنموذج ذو قيمة AUC الإجمالية البالغة $0.88$ قد يتفوق بوضوح على نموذج ذي قيمة $0.91$ في نطاق الحساسية العالية المطلوبة سريرياً. يتم تلخيص هذه الاستنتاجات في الأوراق العلمية لتقديم توصيات عملية واضحة توازن بين الأداء الحسابي والجدوى التطبيقية للحل المقترح.

12.2 الأخطاء المنهجية الشائعة عند تقييم ورسم منحنيات ROC وكيفية تجنبها

يقع العديد من الممارسين في أخطاء منهجية تؤدي إلى إفساد مصداقية التحليلات التقييمية؛ تشمل أبرز هذه الأخطاء الممارسات التالية وكيفية معالجتها:

  • حساب المنحنى على بيانات التدريب: يؤدي ذلك إلى تضخيم خادع لقيمة AUC يقترب من $1.0$ في نماذج مثل الغابات العشوائية، ولا يعكس الأداء الحقيقي للنموذج على البيانات الجديدة.
  • تمرير التنبؤات الفئوية بدلاً من الاحتمالات: يؤدي استخدام predict بدلاً من predict_proba إلى إنتاج منحنى متقطع ومساحة AUC مشوهة وغير دقيقة هندسياً.
  • إهمال معايرة الاحتمالات (Probability Calibration): قد يحقق النموذج ترتيباً جيداً وAUC مرتفعاً، ولكن احتمالاته غير متوافقة مع التكرار النسبي الفعلي للحدث، مما يتطلب تطبيق معايرة متساوية التوتر (Isotonic Regression) أو معايرة سيجمويد قبل الاستخدام الميداني.
  • تجاهل الانحياز الناتج عن التسريب البياني: إجراء عمليات التقييس أو اختيار السمات على كامل مجموعة البيانات قبل التقسيم يؤدي إلى تسريب معلومات الاختبار إلى التدريب وتشويه منحنى ROC.

12.3 دراسة حالة شاملة: مقارنة نماذج التنبؤ وتوثيق الكود الكامل

نستعرض فيما يلي البرنامج التنفيذي الكامل والموثق وفق معايير الجودة البرمجية (PEP 8)، والذي يدمج كافة المراحل المشروحة في هذا الدليل داخل خط أنابيب متكامل قابل لإعادة الاستخدام المباشر في المشاريع والأبحاث العلمية:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, roc_auc_score

# 1. توليد مجموعة البيانات الاصطناعية
X, y = make_classification(
    n_samples=2500, n_features=20, n_informative=12,
    n_redundant=4, flip_y=0.08, random_state=42
)

# 2. تقسيم ومعالجة البيانات مع منع التسريب
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.30, random_state=42, stratify=y
)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 3. تهيئة النماذج التصنيفية المستهدفة
models = {
    'Logistic Regression': LogisticRegression(random_state=42),
    'Random Forest': RandomForestClassifier(n_estimators=150, random_state=42),
    'Gradient Boosting': GradientBoostingClassifier(n_estimators=150, random_state=42),
    'Support Vector Machine': SVC(kernel='rbf', probability=True, random_state=42)
}

# 4. إعداد لوحة الرسم والأنماط البصرية
plt.figure(figsize=(10, 8), dpi=300)
colors = ['#1f77b4', '#2ca02c', '#d62728', '#9467bd']
styles = ['-', '--', '-.', ':']

# 5. التدريب التكراري وحساب المنحنيات والرسم
for (name, model), color, style in zip(models.items(), colors, styles):
    model.fit(X_train, y_train)
    y_prob = model.predict_proba(X_test)[:, 1]
    fpr, tpr, _ = roc_curve(y_test, y_prob)
    auc_val = roc_auc_score(y_test, y_prob)
    plt.plot(fpr, tpr, label=f'{name} (AUC = {auc_val:.3f})',
             color=color, linestyle=style, linewidth=2.2)

# 6. إضافة المرجع العشوائي والتنسيقات النهائية
plt.plot([0, 1], [0, 1], 'k--', linewidth=1.5, label='Random Chance (AUC = 0.500)')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (1 - Specificity)', fontsize=12, fontweight='bold')
plt.ylabel('True Positive Rate (Sensitivity)', fontsize=12, fontweight='bold')
plt.title('Multi-Algorithm ROC Performance Benchmark', fontsize=14, fontweight='bold', pad=12)
plt.legend(loc='lower right', fontsize=10, frameon=True, shadow=True)
plt.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.savefig('final_multi_roc_benchmark.png', format='png', dpi=300)
plt.show()

الخلاصة والتوصيات المستقبلية

يشكل منحنى خصائص تشغيل المستقبل (ROC) والمساحة المحصورة تحته (AUC) حجر الزاوية في التقييم الموضوعي للنماذج التصنيفية، حيث يوفران رؤية متكاملة تتجاوز قيود المقاييس النقطية التقليدية وتمنح فهماً عميقاً للقدرة التمييزية للخوارزميات عبر مختلف عتبات اتخاذ القرار. إن إتقان رسم منحنيات متعددة على مخطط بياني واحد في بايثون ليس مجرد مهارة برمجية، بل هو أداة تحليلية لا غنى عنها للمقارنة المنهجية الصارمة بين البنى الخوارزمية واختيار النموذج الأمثل بما يلائم متطلبات التطبيق الميداني وتكلفة الأخطاء الإحصائية.

يوصى الباحثون والمطورون دائماً باتباع أفضل الممارسات المنهجية: عزل بيانات الاختبار بشكل صارم لمنع تسريب المعلومات، والاعتماد على الاحتمالات المستمرة بدلاً من القرارات القطعية عند توليد الإحداثيات، وتطبيق تقنيات التحقق المتقاطع لتقدير مجالات الثقة الإحصائية، مع اللجوء إلى منحنيات الدقة والاستدعاء (PR Curves) في حالات عدم التوازن الحاد للبيانات. يضمن الالتزام بهذه القواعد البرمجية والإحصائية إنتاج دراسات علمية رصينة ونماذج ذكاء اصطناعي تتسم بأعلى درجات الموثوقية وقابلية التعميم في البيئات الحقيقية.

References

  • DeLong, E. R., DeLong, D. M., & Clarke-Pearson, D. L. (1988). Comparing the areas under two or more correlated receiver operating characteristic curves: A nonparametric approach. Biometrics, 44(3), 837–845. https://doi.org/10.2307/2531595
  • 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
  • Hanley, J. A., & McNeil, B. J. (1982). The meaning and use of the area under a receiver operating characteristic (ROC) curve. Radiology, 143(1), 29–36. https://doi.org/10.1148/radiology.143.1.7063747
  • Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90–95. https://doi.org/10.1109/MCSE.2007.55
  • 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, E. (2011). Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12, 2825–2830. https://scikit-learn.org/
  • Saito, T., & Rehmsmeier, M. (2015). The precision-recall plot is more informative than the ROC plot when evaluating binary classifiers on imbalanced datasets. PLOS ONE, 10(3), e0118432. https://doi.org/10.1371/journal.pone.0118432
  • Swets, J. A. (1988). Measuring the accuracy of diagnostic systems. Science, 240(4857), 1285–1293. https://doi.org/10.1126/science.3287615

اقتباس هذا المقال

looti, M. (2026, سبتمبر 1). كيفية رسم منحنيات ROC متعددة في بايثون (مع مثال). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-plot-multiple-roc-curves-in-python/
looti, Mohammed. “كيفية رسم منحنيات ROC متعددة في بايثون (مع مثال).” عرب سايكلوجي, 1 سبتمبر 2026, https://arabpsychology.com/statistics/how-to-plot-multiple-roc-curves-in-python/.
looti, Mohammed. “كيفية رسم منحنيات ROC متعددة في بايثون (مع مثال).” عرب سايكلوجي. سبتمبر 1, 2026. https://arabpsychology.com/statistics/how-to-plot-multiple-roc-curves-in-python/.