برمجة R والتحليل الإحصائيعلم البيانات والتعلم الآلي

كيفية حساب مقياس F1 في لغة R (مع مثال)

دليل أكاديمي شامل يشرح كيفية حساب مقياس F1 (F1 Score) في لغة R خطوة بخطوة مع أمثلة عملية ومعادلات رياضية وتطبيقات عبر حزم caret وMLmetrics.

تاريخ النشر

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

في هذا السياق المتشابك، يبرز مقياس F1 (F1 Score) كأحد أكثر المقاييس شيوعاً وأعلاها رصانة في الأوساط الأكاديمية والمهنية، نظراً لقدرته الفائقة على التوفيق المتوازن بين مفهومين إحصائيين متعارضين في كثير من الأحيان: الدقة التنبؤية (Precision) والاسترجاع أو الحساسية (Recall / Sensitivity). ويعد هذا المقياس بديلاً جوهرياً يتفوق بوضوح على مقياس دقة التصنيف العام (Accuracy)، لا سيما في البيئات التي تعاني من اختلال التوازن بين الفئات (Imbalanced Datasets)، حيث تصبح المقاييس التقليدية مضللة وتخفي وراءها عجز النموذج عن رصد الفئات النادرة أو الحرجة التي تمثل في الغالب صلب اهتمام الباحث.

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

1. مقدمة إلى مقياس F1 وأهميته في نماذج التعلم الآلي

1.1 المفهوم النظري لمقياس F1 كأداة تقييم إحصائية

يُعرَّف مقياس F1، والذي يُطلق عليه أحياناً مقياس F-Score أو F-Measure، بأنه مقياس إحصائي يُستخدم لقياس واختبار دقة نماذج التصنيف الثنائي (Binary Classification) والمتعدد (Multiclass Classification). يقوم المقياس في جوهره على دمج مقياسين أساسيين من مقاييس الأداء هما: الدقة التنبؤية (Precision)، التي تقيس مدى صحة التنبؤات الإيجابية الصادرة عن النموذج، والاسترجاع (Recall)، الذي يقيس مدى قدرة النموذج على اكتشاف ورصد جميع الحالات الإيجابية الفعلية الموجودة في مجتمع الدراسة. وبدلاً من النظر إلى هذين المقياسين بشكل منفصل ومحاولة المفاضلة الذاتية بينهما، يدمج مقياس F1 كلاً من الدقة والاسترجاع في قيمة عددية قياسية موحدة تتراوح دائماً بين الصفر (0) والواحد الصحيح (1)، حيث تعبر القيمة 1 عن تنبؤ كامل وخالٍ من الأخطاء، بينما تدل القيمة 0 على فشل تام للنموذج التنبؤي.

تتجلى الأهمية الإحصائية لمقياس F1 في قدرته على حل معضلة المقايضة (Trade-off) الدائمة بين الدقة والاسترجاع؛ إذ غالباً ما يؤدي رفع عتبة القرار (Decision Threshold) لزيادة الدقة إلى انخفاض معدل الاسترجاع، والعكس بالعكس. ومن ثم، فإن وجود معيار يجمع بينهما يعطي الباحثين تقييماً متوازناً لا يميل إلى تضخيم أحد الجوانب على حساب الآخر. ويُعتمد مقياس F1 على نطاق واسع في الأبحاث الطبية لتشخيص الأمراض النادرة، وفي النظم المالية للكشف عن الاحتيال المصرفي، وفي معالجة اللغات الطبيعية (Natural Language Processing) لاسترجاع المعلومات وتصنيف النصوص، حيث يشترط في هذه المجالات تقليل الأخطاء الإيجابية والسلبية على حد سواء لضمان أعلى درجات الموثوقية التنبؤية.

1.2 مقارنة نقدية بين دقة التصنيف (Accuracy) ومقياس F1

على الرغم من أن مقياس دقة التصنيف العام (Classification Accuracy)، المحسوب بقسمة مجموع التنبؤات الصحيحة على إجمالي عدد العينات، يمثل المقياس الأكثر بديهية واستخداماً في المراحل التعليمية الأولى، إلا أنه يعاني من قصور منهجي فادح عند تطبيقه في سيناريوهات الواقع العملي. يتجلى هذا القصور في ظاهرة إحصائية شهيرة تُعرف باسم “مفارقة دقة التصنيف” (Accuracy Paradox). تحدث هذه المفارقة عندما يكون توزيع الفئات في مجموعة البيانات غير متوازن بصورة حادة؛ فعلى سبيل المثال، إذا كانت لدينا مجموعة بيانات طبية تحتوي على 99 حالة سليمة وحالة واحدة فقط مصابة بمرض خطير، فإن أي نموذج ساذج يتنبأ بأن جميع الحالات سليمة سيحقق دقة تصنيف عامة تصل إلى 99%، على الرغم من أنه فشل بنسبة 100% في اكتشاف الحالة المصابة الوحيدة التي أُنشئ النموذج من أجلها أصلاً.

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

1.3 دواعي استخدام مقياس F1 في التحليلات الإحصائية

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

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

2. الأسس الرياضية والمعادلات التفصيلية لمقياس F1

2.1 مفهوم الدقة التنبؤية (Precision) وصياغتها الرياضية

تُعرف الدقة التنبؤية (Precision)، والتي يشار إليها في الأدبيات الإحصائية بالقيمة التنبؤية الإيجابية (Positive Predictive Value – PPV)، بأنها النسبة المئوية للحالات الإيجابية الحقيقية التي تم تصنيفها بشكل صحيح من بين جميع الحالات التي توقع النموذج أنها إيجابية. تعكس الدقة درجة نقاء النتائج التنبؤية؛ فكلما ارتفعت قيمتها، دل ذلك على أن النموذج لا يميل إلى تصنيف الحالات السلبية عشوائياً كحالات إيجابية. وتُصاغ الدقة التنبؤية رياضياً وفق المعادلة التالية:

Precision = TP / (TP + FP)

حيث تمثل TP عدد الإيجابيات الحقيقية (True Positives)، بينما تمثل FP عدد الإيجابيات الكاذبة (False Positives)، ويمثل مجموعهما (TP + FP) إجمالي الحالات المصنفة إيجابياً بواسطة الخوارزمية. ويظهر الأثر النظري للأخطاء الإيجابية الكاذبة بوضوح في مقام المعادلة؛ فكلما تزايد عدد الحالات السلبية التي أخطأ النموذج وصنفها كإيجابية (FP)، كَبُرَ المقام، مما يؤدي تلقائياً إلى انخفاض قيمة الدقة التنبؤية واقترابها من الصفر، وهو ما يعد مؤشراً على تدني موثوقية إنذارات النموذج.

2.2 مفهوم الاسترجاع والحساسية (Recall / Sensitivity) وصياغتها الرياضية

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

Recall = TP / (TP + FN)

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

2.3 المتوسط التوافقي (Harmonic Mean) ودوره في حساب F1

يُحسب مقياس F1 الرياضي بالاعتماد على المتوسط التوافقي (Harmonic Mean) لكل من قيمتي الدقة والاسترجاع، وليس بالاعتماد على المتوسط الحسابي البسيط (Arithmetic Mean). وتُكتب المعادلة الشاملة لمقياس F1 بالشكل التالي:

F1 = 2 * ((Precision * Recall) / (Precision + Recall))

يعود السبب الجوهري لاختيار المتوسط التوافقي في بناء هذا المقياس إلى خصائصه الرياضية الفريدة؛ فالمتوسط التوافقي يُعاقب بشدة التفاوت الكبير أو القيم المتطرفة الهابطة بين المتغيرين المقارنين. فإذا قمنا باستخدام المتوسط الحسابي البسيط لنموذج يمتلك دقة تساوي 1.0 (100%) واسترجاعاً يساوي 0.0 (0%)، فإن المتوسط الحسابي سيعطي نتيجة مضللة تبلغ 0.5 (50%)، مما يوحي بأن النموذج يتمتع بأداء متوسط ومقبول. أما المتوسط التوافقي في معادلة F1، فإنه سيهبط بالنتيجة فوراً إلى الصفر المطلق، لأن حاصل ضرب البسط (Precision * Recall) سيكون صفراً.

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

3. مصفوفة الارتباك (Confusion Matrix) ومكوناتها الأساسية

3.1 تصنيف التوقعات: الإيجابيات الحقيقية والسلبيات الحقيقية

تُعد مصفوفة الارتباك (Confusion Matrix) حجر الزاوية الإحصائي والبنية التحتية الأساسية التي تُشتق منها كافة مقاييس تقييم أداء المصنفات الثنائية والمتعددة. تقوم المصفوفة على تقاطع بُعدين رئيسيين: البُعد الأول يمثل القيم الحقيقية أو المرجعية (Actual / Reference Classes)، بينما يمثل البُعد الثاني القيم المتوقعة الصادرة عن النموذج الإحصائي (Predicted Classes). ويتفرع عن هذا التقاطع أربعة تصنيفات رئيسية للتوقعات، يبدأ أولها بالحالات الإيجابية الحقيقية (True Positives – TP)، وهي الحالات التي تنتمي فعلياً للفئة المستهدفة ونجح النموذج في التنبؤ بها بدقة كفئة إيجابية.

أما المكون الثاني فهو السلبيات الحقيقية (True Negatives – TN)، وهي الحالات التي تنتمي في الواقع للفئة السلبية ونجح النموذج في التنبؤ بكونها سلبية تماماً دون لبس. وتلعب هذه الحالات الحقيقية (TP و TN) دوراً محورياً في تثبيت المعالم المرجعية للأداء التنبؤي، حيث تعكس دقة النموذج واستقراره في التمييز الصحيح بين مختلف الفئات دون خلط أو تشويش، وتعد بمثابة البسط الرئيسي لكافة معادلات التقييم الإحصائي السليم.

3.2 أنماط الخطأ الإحصائي: الخطأ من النوع الأول والثاني

تتضمن مصفوفة الارتباك تصنيفاً دقيقاً لأنماط الأخطاء التنبؤية التي تقع فيها الخوارزميات، وتتماشى هذه الأنماط مع المفاهيم الإحصائية الكلاسيكية لاختبار الفرضيات. يُعرف النمط الأول بالإيجابيات الكاذبة (False Positives – FP)، وهي تمثل إحصائياً ما يُعرف باسم “الخطأ من النوع الأول” (Type I Error) أو رفض الفرضية الصفرية وهي صحيحة. يحدث هذا الخطأ عندما يتوقع النموذج أن الحالة إيجابية، في حين أنها سلبية في الواقع، ومثال ذلك إطلاق إنذار بوجود حريق في حين لا يوجد أي حريق.

أما النمط الثاني فيتمثل في السلبيات الكاذبة (False Negatives – FN)، وهي تعادل “الخطأ من النوع الثاني” (Type II Error) أو قبول الفرضية الصفرية وهي خاطئة. ويحدث هذا الخطأ عندما يتنبأ النموذج بأن الحالة سلبية في حين أنها إيجابية في الواقع، كأن يشخص النموذج مريضاً مصاباً بالسرطان على أنه معافى تماماً. إن التحليل المتباين لكلا النوعين من الأخطاء ذو أهمية تفسيرية بالغة؛ إذ يتيح للباحث معرفة نمط الضعف في الخوارزمية، وما إذا كان النموذج يعاني من إفراط في التفاؤل (زيادة FP) أو إفراط في التحفظ (زيادة FN)، وهو ما يؤثر مباشرة على حساب قيمتي الدقة والاسترجاع اللتين تشكلان مقياس F1.

3.3 هيكلة مصفوفة الارتباك وجدولتها

تتخذ مصفوفة الارتباك للتصنيف الثنائي هيكل الجدول المتقاطع المزدوج (2×2 Contingency Table)، حيث تُنظم الحالات في شكل صفوف وأعمدة متقابلة. ويمكن تمثيل هيكل هذا الجدول بيانياً كالتالي: يمثل الصف الأول عادة التنبؤات الإيجابية (Predicted Positive) موزعة على (TP) و (FP)، بينما يمثل الصف الثاني التنبؤات السلبية (Predicted Negative) موزعة على (FN) و (TN)، في حين تمثل الأعمدة الحالات الفعلية الإيجابية (TP + FN) والحالات الفعلية السلبية (FP + TN).

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

4. مثال يدوي توضيحي لحساب مقياس F1 خطوة بخطوة

4.1 توصيف سياق المثال الإحصائي وبياناته

لترسيخ المفاهيم الرياضية السابقة ونقلها من الإطار النظري المجرد إلى الحيز التطبيقي الملموس، سنفترض دراسة إحصائية تطبيقية قام فيها باحث رياضي ببناء نموذج انحدار لوجستي (Logistic Regression) للتنبؤ باحتمالية اختيار لاعبي كرة السلة في الدوري الاحترافي بناءً على مؤشرات الأداء البدني والمهاري لعدد 400 لاعب واعد. في هذا النموذج، تُمثل الفئة الإيجابية (Target Class = 1) اللاعبين الذين تم اختيارهم بالفعل في الدوري، بينما تُمثل الفئة السلبية (Class = 0) اللاعبين الذين لم يتم اختيارهم.

بعد تطبيق النموذج التنبؤي ومقارنة التوقعات بالبيانات الفعلية على عينة الاختبار المكونة من 400 لاعب، أسفرت مصفوفة الارتباك الناتجة عن التوزيع الرقمي الدقيق الآتي:

  • عدد الحالات الإيجابية الحقيقية (True Positives – TP): 120 لاعباً توقع النموذج اختيارهم وتم اختيارهم فعلياً.
  • عدد الحالات الإيجابية الكاذبة (False Positives – FP): 70 لاعباً توقع النموذج اختيارهم ولكنهم لم يُختاروا في الواقع.
  • عدد الحالات السلبية الكاذبة (False Negatives – FN): 40 لاعباً توقع النموذج عدم اختيارهم ولكن تم اختيارهم في الواقع.
  • عدد الحالات السلبية الحقيقية (True Negatives – TN): 170 لاعباً توقع النموذج عدم اختيارهم ولم يُختاروا بالفعل.

4.2 التطبيق الحسابي اليدوي للدقة والاسترجاع

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

Precision = TP / (TP + FP)
Precision = 120 / (120 + 70)
Precision = 120 / 190
Precision = 0.6315789 (أو ما يعادل 63.16%)

توضح هذه النتيجة الإحصائية أنه عندما يتنبأ النموذج بأن لاعباً ما سيتم اختياره في الدوري، فإن هذا التنبؤ يكون صحيحاً بنسبة تقارب 63.16% من إجمالي التنبؤات الإيجابية الصادرة.

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

Recall = TP / (TP + FN)
Recall = 120 / (120 + 40)
Recall = 120 / 160
Recall = 0.7500000 (أو ما يعادل 75.00%)

تشير هذه القيمة الإحصائية إلى أن النموذج نجح في رصد واكتشاف 75% من إجمالي اللاعبين الذين تم اختيارهم فعلياً، في حين فاتت عليه نسبة 25% من اللاعبين المؤهلين وصنفهم خطأً كحالات سلبية (FN).

4.3 استخراج قيمة مقياس F1 النهائية وتفسيرها

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

F1 = 2 * ((Precision * Recall) / (Precision + Recall))
F1 = 2 * ((0.6315789 * 0.7500000) / (0.6315789 + 0.7500000))
F1 = 2 * (0.4736842 / 1.3815789)
F1 = 2 * 0.3428571
F1 = 0.6857143 (أو بالتقريب: 0.6857)

تُظهر القراءة الإحصائية المعمقة لهذه النتيجة (F1 ≈ 0.6857) أن النموذج يقدم أداءً تصنيفياً فوق المتوسط، ويحقق توازناً متيناً بين دقة التنبؤ وشمولية الاسترجاع. وتعد هذه القيمة التوافقية معياراً دقيقاً يعكس الكفاءة الشاملة للنموذج في ظل وجود 70 حالة إيجابية كاذبة و40 حالة سلبية كاذبة، وهو الناتج الرياضي المستهدف الذي سنقوم بمطابقته برمجياً في الأقسام القادمة داخل بيئة لغة R.

5. إعداد بيئة العمل البرمجية في لغة R وتثبيت الحزم اللازمة

5.1 تثبيت واستدعاء حزمة caret المتخصصة

تُعد حزمة caret، وهي اختصار لعبارة (Classification And REgression Training)، الحزمة البرمجية الأكثر شهرة وشمولية في لغة R لبناء وتقييم نماذج التعلم الآلي. تحتوي هذه الحزمة على ترسانة متكاملة من الدوال الإحصائية المصممة لتبسيط كافة مراحل النمذجة التنبؤية، بدءاً من تقسيم البيانات والتحقق المتقاطع (Cross-Validation)، وصولاً إلى حساب المقاييس الإحصائية المعقدة واستخراج مصفوفات الارتباك بمختلف خصائصها.

لتثبيت حزمة caret من المستودع الرسمي لشبكة أرشيف R الشاملة (CRAN)، يُنفذ الأمر البرمجي التالي داخل نافذة الأوامر (Console) في بيئة RStudio:

install.packages("caret")

وبعد اكتمال عملية التثبيت بنجاح، يتم استدعاء الحزمة إلى بيئة العمل الجلسية عبر الدالة المرجعية:

library(caret)

تجدر الإشارة إلى أن حزمة caret تعتمد على منظومة واسعة من الاعتماديات البرمجية (Dependencies) المساعدة، ولذلك يُنصح بالتأكد من تحديث كافة الحزم التابعة لضمان التوافق التام أثناء تنفيذ عمليات التقييم الإحصائي المتقدمة.

5.2 تجهيز الحزم الإضافية المساعدة للتحليل

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

install.packages("e1071")
library(e1071)

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

install.packages("MLmetrics")
install.packages("yardstick")
library(MLmetrics)
library(yardstick)

كما يجب التأكد من استخدام إصدار حديث من لغة R (الإصدار 4.0.0 فما فوق) ونظام بيئي مستقر داخل RStudio لضمان التوافق السلس بين مختلف الحزم والمكتبات الإحصائية المستخدمة في التحليل.

6. حساب مقياس F1 عملياً في R باستخدام حزمة caret

6.1 تمثيل البيانات والمتجهات التنبؤية كعوامل (Factors)

تفرض بيئة البرمجة في لغة R، وخاصة حزمة caret، شرطاً صارماً يتمثل في ضرورة تحويل المتجهات التنبؤية والمرجعية إلى متغيرات فئوية من نوع عوامل (Factors) مع اشتراط تطابق تام في المستويات (Factor Levels). لإعادة بناء بيانات المثال اليدوي السابق بدقة داخل لغة R (حيث TP=120, FP=70, FN=40, TN=170)، نقوم بإنشاء متجهين يمثلان القيم الفعلية (Actuals) والقيم المتوقعة (Predictions) باستخدام دالة التكرار rep():

# إنشاء متجهات القيم الفعلية والمتوقعة بناءً على أرقام مصفوفة الارتباك
actual_values <- factor(c(rep("1", 120), rep("0", 70), rep("1", 40), rep("0", 170)), levels = c("1", "0"))
predicted_values <- factor(c(rep("1", 120), rep("1", 70), rep("0", 40), rep("0", 170)), levels = c("1", "0"))

في الكود البرمجي أعلاه، تم تحديد الفئة “1” لتمثل الاختيار في الدوري (الفئة الإيجابية) والفئة “0” لتمثل عدم الاختيار. كما تم تمرير المعامل levels = c("1", "0") صراحةً لضمان أن تُعامل الفئة “1” كفئة إيجابية ذات أولوية في الترتيب الرياضي لمستويات العامل، وهو إجراء محوري لتفادي احتساب المقياس للفئة العكسية بطريق الخطأ.

6.2 تنفيذ دالة confusionMatrix() واستعراض المخرجات

بعد تجهيز المتجهات بصيغة العوامل، يتم استدعاء الدالة المحورية confusionMatrix() من حزمة caret لإجراء التقييم الإحصائي الشامل. لتفعيل حساب واستخراج مقياس F1 ومقاييس الدقة والاسترجاع التفصيلية، يجب تمرير المعامل mode = "everything"، بالإضافة إلى تعيين الفئة الإيجابية المرجعية صراحةً عبر المعامل positive = "1"، كما يوضح الكود التالي:

# توليد مصفوفة الارتباك الشاملة وحساب كافة المقاييس الإحصائية
cm_result <- confusionMatrix(data = predicted_values, reference = actual_values, positive = "1", mode = "everything")
print(cm_result)

عند تنفيذ هذا الأمر، تولد دالة confusionMatrix() تقريراً إحصائياً متكاملاً يتضمن جدول مصفوفة الارتباك الأساسية، ومعدل دقة التصنيف العام (Accuracy)، ومجال الثقة الإحصائي (95% CI)، ومقياس كابا (Kappa)، بالإضافة إلى قسم تفصيلي كامل تحت مسمى byClass يحتوي على الحساسية (Sensitivity)، والنوعية (Specificity)، والقيمة التنبؤية الإيجابية (Precision)، والاسترجاع (Recall)، ومقياس F1 بدقة متناهية.

6.3 استخلاص قيمة F1 الدقيقة من هيكل المخرجات

يتميز كائن المخرجات cm_result الناتج عن دالة confusionMatrix() بكونه قائمة إحصائية مهيكلة (List) تحتوي على عدة عناصر فرعية. للوصول البرمجي المباشر إلى قيمة مقياس F1 واستخلاصها لاستخدامها في تقارير لاحقة أو مقارنات نمذجة، نستخدم عامل الفهرسة للوصول إلى المتجه byClass كالتالي:

# استخلاص قيمة مقياس F1 بصورة مباشرة ومستقلة
f1_score_value <- cm_result$byClass['F1']
cat("قيمة مقياس F1 المحسوبة عبر حزمة caret هي:", round(f1_score_value, 4), "n")

عند طباعة هذه النتيجة في بيئة R، ستكون المخرجات النصية مطابقة تماماً للمثال اليدوي السابق:

قيمة مقياس F1 المحسوبة عبر حزمة caret هي: 0.6857

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

7. طرق برمجية بديلة لحساب مقياس F1 في لغة R

7.1 بناء دالة مخصصة باستخدام دوال R الأساسية (Base R)

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

# بناء دالة إحصائية مخصصة لحساب F1 باستخدام Base R
calculate_f1_base <- function(actual, predicted, positive_label = "1") {
  conf_tab <- table(Predicted = predicted, Actual = actual)
  tp <- conf_tab[positive_label, positive_label]
  fp <- sum(conf_tab[positive_label, ]) - tp
  fn <- sum(conf_tab[, positive_label]) - tp
  precision <- tp / (tp + fp)
  recall <- tp / (tp + fn)
  if ((precision + recall) == 0) return(0)
  f1 <- 2 * (precision * recall) / (precision + recall)
  return(as.numeric(f1))
}
# اختبار الدالة المخصصة على بيانات المثال
base_r_f1 <- calculate_f1_base(actual_values, predicted_values, positive_label = "1")
print(round(base_r_f1, 4)) # النتيجة: 0.6857

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

7.2 الحساب السريع باستخدام حزمة MLmetrics

تقدم حزمة MLmetrics نهجاً برمجياً مبسطاً وخفيف الوزن للغاية لتقييم النماذج في لغة R، حيث توفر دوالاً مستقلة لكل مقياس إحصائي دون الحاجة إلى توليد مصفوفة ارتباك كاملة ومعقدة مثلما تفعل حزمة caret. لحساب مقياس F1 مباشرة عبر هذه الحزمة، تُستخدم الدالة الصريحة F1_Score() كما يلي:

# استدعاء الحزمة وتنفيذ دالة F1_Score المباشرة
library(MLmetrics)
mlmetrics_f1 <- F1_Score(y_pred = predicted_values, y_true = actual_values, positive = "1")
print(round(mlmetrics_f1, 4)) # النتيجة: 0.6857

يتميز هذا النهج بسرعته الكبيرة وسهولة دمجه داخل حلقات التكرار (Loops) وخوارزميات تحسين النماذج، حيث يتم تمرير متجه التنبؤات y_pred ومتجه القيم الحقيقية y_true مع تحديد الفئة الموجبة positive في سطر برمجي واحد، مما يجعلها الخيار المفضل لتطبيقات هندسة الخصائص والتقييم السريع والمكثف.

7.3 استخدام حزمة yardstick ضمن منظومة tidymodels

مع التطور الحديث في منظومة علوم البيانات داخل لغة R، أصبحت منظومة tidymodels وحزمة yardstick التابعة لها المعيار القياسي الجديد للبرمجة الإحصائية الأنيقة والمنظمة المتوافقة مع مبادئ tidy data. لحساب مقياس F1 باستخدام yardstick، يتم تنظيم البيانات داخل إطار بيانات منظم (Tibble / Data Frame) وتمريرها إلى الدالة المخصصة f_meas() كالتالي:

# إعداد البيانات داخل إطار بيانات منظم وتطبيق yardstick
library(yardstick)
library(tibble)
eval_df <- tibble(truth = actual_values, estimate = predicted_values)
# حساب المقياس مع تحديد الفئة المستهدفة الأولى
yardstick_f1 <- f_meas(data = eval_df, truth = truth, estimate = estimate, event_level = "first")
print(yardstick_f1)

تُرجع دالة f_meas() إطار بيانات أنيقاً يحتوي على اسم المقياس ونوعه وقيمته العددية الدقيقة. ويعتبر هذا الأسلوب مثالياً للمشاريع الكبيرة المعتمدة على بيئة tidyverse، حيث يمكن ربط الدالة بسلاسة عبر عامل الربط الأنبوبي (Pipe Operator %>% أو |>) مع دوال التحليل الأخرى لتوليد تقارير أداء متكاملة ومرنة للغاية.

8. حساب مقياس F1 في التصنيف متعدد الفئات (Multiclass Classification)

8.1 توسيع مفهوم مصفوفة الارتباك لأكثر من فئتين

عند الانتقال من التصنيف الثنائي البسيط إلى التصنيف متعدد الفئات (Multiclass Classification) الذي يحتوي على ثلاثة فئات أو أكثر (مثل تصنيف أنواع الزهور في بيانات Iris الشهيرة إلى: Setosa، Versicolor، Virginica)، تتوسع مصفوفة الارتباك لتصبح مصفوفة مربعة من الحجم (N x N)، حيث يمثل N عدد الفئات المستهدفة في الدراسة. في هذا الهيكل الممتد، يمثل القطر الرئيسي للمصفوفة التنبؤات الصحيحة لكل فئة على حدة، بينما تمثل كافة الخلايا الواقعة خارج القطر الأخطاء التوزيعية المتشابكة بين مختلف الفئات.

لحساب مقياس F1 في مثل هذه البيئات المعقدة، يتم تفكيك المشكلة المتعددة إلى سلسلة من المشكلات الثنائية المستقلة باستخدام استراتيجية “فئة مقابل البقية” (One-vs-Rest / One-vs-All). وفقاً لهذه المنهجية، تُعامل كل فئة مستقلة كفئة إيجابية، بينما تُدمج جميع الفئات المتبقية الأخرى معاً لتشكل الفئة السلبية. وبناءً على هذا التقسيم، يُحسب مقياس الدقة والاسترجاع وقيمة F1 الخاصة بكل فئة من فئات النموذج بشكل منفصل، مما ينتج عنه متجه كامل من قيم F1 الفردية يصف أداء الخوارزمية تجاه كل فئة على حدة.

8.2 المتوسط الكلي (Macro-averaged F1) والمجهري (Micro-averaged F1)

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

أما المتوسط المجهري (Micro F1)، فيتم حسابه عن طريق تجميع إجمالي عدد الحالات الإيجابية الحقيقية (Total TP)، والإيجابيات الكاذبة (Total FP)، والسلبيات الكاذبة (Total FN) عبر جميع الفئات مجتمعة في خطوة واحدة، ثم تطبيق معادلة F1 الرياضية الشاملة على هذه المجاميع الكلية. يركز Micro F1 على الأداء التنبؤي الإجمالي للنظام ككتلة واحدة، وتتأثر قيمته بشدة بالفئات الأكبر حجماً التي تساهم بالعدد الأكبر من الحالات، مما يجعله ملائماً عندما يكون الهدف هو تقييم كفاءة التنبؤ على المستوى الفردي العام للعينات.

8.3 المتوسط الموزون (Weighted F1) في بيئة R

يمثل المتوسط الموزون (Weighted-averaged F1) حلاً توفيقياً إحصائياً ممتازاً يجمع بين مزايا Macro F1 ومراعاة واقع التوزيع التكراري للفئات في بيانات الاختبار. يُحسب Weighted F1 بأخذ متوسط قيم F1 الفردية لكل فئة بعد ترجيحها (ضربها) بنسبة تواجد تلك الفئة وحجم دعمها العددي (Class Support / Prevalence) في مجتمع العينة الكلي.

يوضح الكود البرمجي التالي في لغة R كيفية بناء مصفوفة متعددة الفئات وحساب الأنواع المختلفة لمقاييس F1 المتعددة (Macro و Micro و Weighted) بدقة:

# تمثيل بيانات تصنيفية ثلاثية الفئات (Class A, Class B, Class C)
set.seed(123)
true_labels <- factor(sample(c("A", "B", "C"), size = 300, replace = TRUE, prob = c(0.6, 0.3, 0.1)))
pred_labels <- true_labels
# إدخال بعض الأخطاء العشوائية لمحاكاة النموذج التنبؤي
noise_idx <- sample(1:300, size = 50)
pred_labels[noise_idx] <- factor(sample(c("A", "B", "C"), size = 50, replace = TRUE))
# حساب مصفوفة الارتباك عبر حزمة caret
cm_multi <- confusionMatrix(data = pred_labels, reference = true_labels, mode = "everything")
# استخراج مقاييس F1 الفردية لكل فئة
f1_by_class <- cm_multi$byClass[, "F1"]
print(f1_by_class)
# حساب Macro F1 (المتوسط البسيط)
macro_f1 <- mean(f1_by_class, na.rm = TRUE)
cat("Macro-averaged F1:", round(macro_f1, 4), "n")
# حساب Weighted F1 (المتوسط الموزون بحجم العينات)
class_weights <- table(true_labels) / length(true_labels)
weighted_f1 <- sum(f1_by_class * class_weights)
cat("Weighted-averaged F1:", round(weighted_f1, 4), "n")

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

9. مقارنة مقياس F1 بمقاييس الأداء المتقدمة الأخرى في R

9.1 المقارنة مع منحنى خاصية تشغيل المستقبِل (ROC-AUC)

يُعد منحنى خاصية تشغيل المستقبِل والمساحة الواقعة تحته (Receiver Operating Characteristic – Area Under Curve – ROC-AUC) أحد أبرز المقاييس الشائعة لتقييم النماذج التنبؤية الاحتمالية. ومع ذلك، توجد فروق جوهرية بين مقياس F1 ومنحنى ROC-AUC من الناحية الهيكلية والإحصائية. يقيس منحنى ROC-AUC العلاقة التبادلية بين معدل الإيجابيات الحقيقية (الحساسية) ومعدل الإيجابيات الكاذبة (1 – النوعية / Specificity) عبر كافة عتبات التصنيف المحتملة من 0 إلى 1، مما يجعله مقياساً مستقلاً عن عتبة القرار (Threshold-Independent).

في المقابل، يُحسب مقياس F1 عند عتبة قرار ثابتة ومحددة (تكون عادة 0.5 افتراضياً)، ويعتمد حصرياً على الدقة والاسترجاع دون إدخال السلبيات الحقيقية (TN) في بسط أو مقام معادلته. لهذا السبب، يُفضل مقياس F1 ومنحنى الدقة-الاسترجاع (Precision-Recall Curve / PR-AUC) بشكل قاطع على منحنى ROC-AUC في حالات التحيز الشديد للفئات وندرة الفئة الإيجابية؛ حيث يميل منحنى ROC-AUC إلى إعطاء تقييمات متفائلة ومبالغ فيها نتيجة للعدد الهائل من السلبيات الحقيقية (TN) التي تُخفّض معدل الإيجابيات الكاذبة اصطناعياً.

9.2 المقارنة مع مقياس كابا لكوهين (Cohen’s Kappa)

يُعد مقياس كابا لكوهين (Cohen’s Kappa) مقياساً إحصائياً دقيقاً يقيس درجة التوافق بين القيم المتوقعة والقيم الفعلية بعد استبعاد وتصحيح التوافق الذي يمكن أن يحدث بمحض الصدفة العشوائية (Agreement by Chance). تتراوح قيمة كابا من -1 إلى +1، حيث تعبر القيمة 0 عن توافق مطابق تماماً للصدفة العشوائية، في حين تعبر القيم الأكبر من 0.8 عن توافق ممتاز وقوي جداً.

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

9.3 مقياس F-Beta المعمم: ترجيح الدقة أو الاسترجاع

يُمثل مقياس F-Beta الصيغة الرياضية المعممة لمقياس F1، حيث يسمح للباحث والمحلل الإحصائي بضبط الوزن النسبي والأهمية المعطاة للدقة مقابل الاسترجاع من خلال معامل تفاضلي يُرمز له بالحرف الإغريقي بيتا (β). وتُصاغ معادلة F-Beta العامة بالشكل الآتي:

F_beta = (1 + beta^2) * ((Precision * Recall) / ((beta^2 * Precision) + Recall))

وعندما تكون قيمة بيتا مساوية للواحد الصحيح (β = 1)، نحصل على مقياس F1 الكلاسيكي المتوازن الذي يعطي وزناً متساوياً للدقة والاسترجاع. أما في الحالات التطبيقية الخاصة، فيمكن تعديل قيمة المعامل على النحو التالي:

  • مقياس F2 (β = 2): يعطي وزناً وأهمية للاسترجاع تعادل ضعف الأهمية المعطاة للدقة. ويُستخدم هذا المقياس في التشخيص الطبي والأورام السرطانية، حيث يكون تقليل السلبيات الكاذبة (عدم تفويت المرضى) أولى بكثير من تجنب الإنذارات الكاذبة.
  • مقياس F0.5 (β = 0.5): يعطي وزناً للدقة يعادل ضعف الأهمية المعطاة للاسترجاع. ويُستخدم بكثرة في أنظمة تصفية البريد المزعج (Spam Filtering) وتوصيات الاستثمار المالي، حيث تكون تكلفة الخطأ الإيجابي الكاذب (حذف بريد عمل هام) باهظة جداً ولا تُغتفر.

10. التعامل مع البيانات غير المتوازنة وتأثيرها على مقياس F1

10.1 أثر اختلال التوازن الفئوي (Class Imbalance) على المقاييس

يُعد اختلال التوازن بين الفئات (Class Imbalance) من أكثر التحديات تعقيداً وشيوعاً في نمذجة التعلم الآلي والتحليل الإحصائي الحديث؛ ويحدث عندما يفوق التكرار العددي لإحدى الفئات (الفئة السائدة) تكرار الفئة الأخرى (فئة الأقلية / Minority Class) بفارق شاسع قد يصل إلى نسب مثل 95:5 أو 99:1. في ظل هذه الظروف غير المتكافئة، تفقد المقاييس التقليدية المعتمدة على إجمالي العينات — كدقة التصنيف العامة — مصداقيتها الإحصائية بالكامل وتتحول إلى مؤشرات مضللة للغاية تخفي فشل النموذج في رصد فئة الأقلية.

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

10.2 تطبيق تقنيات إعادة العينات (Resampling) وتحسين F1 في R

لتحسين قيمة مقياس F1 ورفع كفاءة النماذج التنبؤية عند التعامل مع قواعد بيانات تعاني من اختلال التوازن، يلجأ المبرمجون في لغة R إلى تطبيق تقنيات إعادة العينات (Resampling Techniques) المتطورة. تنقسم هذه التقنيات إلى أسلوبين رئيسيين: أسلوب الإفراط في أخذ العينات (Oversampling) لفئة الأقلية، وأسلوب التنقيص من أخذ العينات (Undersampling) للفئة السائدة لتوليد توزيع متكافئ ومتوازن إحصائياً.

تُعد خوارزمية توليد العينات الاصطناعية للأقلية (SMOTE – Synthetic Minority Over-sampling Technique) من أقوى الحلول الحسابية في هذا المجال؛ حيث تقوم بتوليد عينات اصطناعية ذكية ومحسوبة رياضياً لفئة الأقلية بناءً على خوارزمية الجيران الأقرب (k-Nearest Neighbors)، بدلاً من مجرد التكرار الميكانيكي للبيانات. يوضح الكود البرمجي التالي كيفية تطبيق تقنيات إعادة التوازن عبر حزمة ROSE أو دالة downSample المضمنة في caret ومراقبة الارتفاع الإحصائي الملموس في مقياس F1:

# استدعاء أدوات إعادة موازنة البيانات
library(caret)
# إنشاء مجموعة بيانات افتراضية شديدة الاختلال (90% فئة 0 و 10% فئة 1)
set.seed(42)
features <- matrix(rnorm(1000 * 4), ncol = 4)
labels <- factor(ifelse(features[,1] + features[,2] + rnorm(1000) > 2.5, "1", "0"))
table(labels) # معاينة الاختلال الحاد
# تطبيق تقنية Down-sampling لإعادة التوازن
balanced_data <- downSample(x = features, y = labels, yname = "Class")
table(balanced_data$Class) # فئات متساوية تماماً
# تدريب النموذج وتقييم التحسن في F1
ctrl <- trainControl(method = "cv", number = 5, summaryFunction = prSummary, classProbs = TRUE)

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

11. استكشاف الأخطاء البرمجية الشائعة وحلها في R

11.1 مشكلة ترتيب مستويات العوامل (Factor Levels Mismatch)

تُعد مشكلة عدم تطابق أو انعكاس ترتيب مستويات العوامل (Factor Levels Mismatch) الخطأ البرمجي والمنهجي الأكثر شيوعاً الذي يقع فيه مستخدمو لغة R عند حساب مقاييس الأداء التنبؤي. تفترض دوال التقييم الإحصائي، مثل confusionMatrix() في حزمة caret، بشكل افتراضي أن المستوى الأول في العامل (First Level) هو الفئة الإيجابية المرجعية المستهدفة ما لم يُنص على خلاف ذلك صراحةً.

إذا كانت بياناتك تحتوي على المستويات c("0", "1")، فإن الترتيب الأبجدي الافتراضي في R سيجعل “0” هو المستوى الأول، وبالتالي ستقوم الدالة بحساب مقياس F1 للفئة “0” (الفئة السلبية) بدلاً من الفئة “1” المستهدفة، مما يولد نتائج مقلوبة تماماً ومضللة للمحلل. لتفادي هذا الخطأ البرمجي الجسيم، يجب دائماً فحص مستويات العوامل باستخدام دالة levels()، وتحديد الفئة الإيجابية بوضوح باستخدام المعامل positive = "1"، أو إعادة ترتيب المستويات يدوياً كالتالي:

# ضبط وتوحيد مستويات العوامل بصورة صريحة وقاطعة
actual <- factor(actual, levels = c("1", "0"))
predicted <- factor(predicted, levels = c("1", "0"))
# التحقق من تطابق المستويات قبل إرسالها للتقييم
stopifnot(identical(levels(actual), levels(predicted)))

11.2 معالجة القيم المفقودة (NA / NaN) أثناء التقييم

يتسبب وجود القيم المفقودة أو الفارغة (NA / NaN Values) داخل متجهات القيم التنبؤية أو المرجعية في توقف دوال التقييم وإطلاق أخطاء تشغيلية تعطل المسار البرمجي بالكامل. وتحدث هذه المشكلة عادة نتيجة وجود بيانات خام غير مكتملة أو فشل النموذج في توليد تنبؤات لبعض الحالات الشاذة أو القسمة على صفر عند انعدام التوقعات الإيجابية بالكامل (TP + FP = 0).

للتعامل المنهجي والآمن مع القيم المفقودة وضمان استمرار التحليل بسلاسة، يُنصح بتطبيق عمليات التصفية الشرطية والتحقق الوقائي قبل تمرير المتجهات لدوال مصفوفة الارتباك عبر استخدام دالة complete.cases() أو الدالة المساعدة na.omit() كما هو موضح في الكود التالي:

# فحص واستبعاد القيم المفقودة من المتجهات التنبؤية
valid_indices <- complete.cases(actual_values, predicted_values)
clean_actual <- actual_values[valid_indices]
clean_predicted <- predicted_values[valid_indices]
# التحقق من خلو البيانات من قيم NA تماماً
if (anyNA(clean_actual) || anyNA(clean_predicted)) {
  stop("تحذير: لا تزال هناك قيم مفقودة في المتجهات!")
}

11.3 الأخطاء في ضبط معاملات دالة confusionMatrix

يواجه العديد من الممارسين إرباكاً عند استخدام دالة confusionMatrix() في حزمة caret نتيجة نسيان تمرير بعض المعاملات الحيوية. فالوضع الافتراضي للدالة يقتصر على استخراج مقاييس دقة التصنيف العامة ومقياس كابا والحساسية والنوعية الأساسية، دون طباعة مقياس F1 والدقة التنبؤية ضمن المخرجات الافتراضية.

لحل هذه المشكلة وإظهار كافة المقاييس الإحصائية المتقدمة بما فيها F1، يجب دائماً تعيين المعامل mode = "everything" أو mode = "prec_rec" عند استدعاء الدالة. كما يجب التأكد من تطابق نوع البيانات المدخلة؛ فإذا تم تمرير متجهات رقمية (Numeric) أو سلاسل نصية بسيطة (Character) بدلاً من عوامل مهيكلة (Factors)، ستتوقف الدالة فوراً عن العمل وتُصدر رسالة خطأ تطلب تحويل المدخلات إلى فئات عاملية متطابقة الأطوال والمستويات.

12. أفضل الممارسات المنهجية والتطبيقات المتقدمة في مشاريع النمذجة

12.1 دمج مقياس F1 في عمليات التحقق المتقاطع (Cross-Validation)

في مشاريع التعلم الآلي الاحترافية، لا يُكتفى بحساب مقياس F1 على عينة تقسيم عشوائية واحدة (Holdout Split)، بل يُشترط دمجه منهجياً داخل إجراءات التحقق المتقاطع المتكرر (k-Fold Cross-Validation) لضمان تعميم النموذج وعدم تأثره بتوزيع جزئي غير ممثل للبيانات. توفر حزمة caret مرونة فائقة لتنفيذ هذا الإجراء المتقدم عبر دالة trainControl من خلال ضبط دالة التلخيص لتصبح prSummary التي تحسب الدقة والاسترجاع و F1 عبر كافة طيات البيانات التدريبية (Folds).

يوضح الكود التالي كيفية إعداد وضبط عملية التدريب المتقاطع باستخدام مقياس F1 كموجه رئيسي للتقييم:

# إعداد التحقق المتقاطع ذو 10 طيات مكرر 3 مرات لتحسين F1
train_control_f1 <- trainControl(
  method = "repeatedcv",
  number = 10,
  repeats = 3,
  summaryFunction = prSummary,
  classProbs = TRUE,
  savePredictions = "final"
)

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

12.2 ضبط المعلمات الفائقة (Hyperparameter Tuning) بالاعتماد على F1

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

يمكن تطبيق هذا النهج عملياً داخل لغة R عند استدعاء دالة train() من خلال تحديد المعامل metric = "F"، كما هو موضح في المثال البرمجي التالي لتدريب نموذج الغابات العشوائية (Random Forest):

# تدريب النموذج وضبط المعلمات الفائقة لتعظيم مقياس F1 مباشرة
# ملاحظة: يتطلب هذا الكود وجود بيانات تدريب ذات احتمالات فئوية صريحة
model_tuned <- train(
  Class ~ .,
  data = balanced_data,
  method = "rf",
  metric = "F", # توجيه التحسين نحو مقياس F
  trControl = train_control_f1,
  tuneLength = 5
)
# استعراض المعلمات المثلى التي حققت أعلى قيمة F1
print(model_tuned$bestTune)

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

12.3 توثيق وتصدير تقارير الأداء الإحصائي

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

يوضح الكود التالي كيفية إنشاء رسم بياني احترافي لمصفوفة الارتباك وتصدير النتائج الإحصائية إلى ملف خارجي منظم:

# بناء وتصدير تمثيل بصري أنيق لمصفوفة الارتباك باستخدام ggplot2
library(ggplot2)
conf_df <- as.data.frame(cm_result$table)
plot_cm <- ggplot(data = conf_df, aes(x = Reference, y = Prediction, fill = Freq)) +
  geom_tile(color = "white") +
  geom_text(aes(label = Freq), size = 6, fontface = "bold", color = "black") +
  scale_fill_gradient(low = "#EBF5FB", high = "#2E86C1") +
  theme_minimal(base_size = 14) +
  labs(title = "مصفوفة الارتباك ومخرجات مقياس F1",
       subtitle = paste("F1 Score:", round(cm_result$byClass['F1'], 4)),
       x = "القيم الفعلية المرجعية", y = "توقعات النموذج")
print(plot_cm)
# تصدير ملخص المقاييس الإحصائية إلى ملف CSV خارجي
metrics_summary <- data.frame(Metric = names(cm_result$byClass), Value = cm_result$byClass)
write.csv(metrics_summary, file = "Model_Performance_Report.csv", row.names = FALSE)

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

خاتمة

استعرض هذا الدليل المرجعي الشامل الإطار النظري والرياضي والبرمجي المتكامل لكيفية حساب وتفسير مقياس F1 في لغة البرمجة الإحصائية R. وتبيّن لنا من خلال التفكيك المفاهيمي أن مقياس F1 يمثل الركيزة الإحصائية الأكثر اتزاناً وموثوقية لتقييم مصنفات التعلم الآلي، نظراً لجمعه المتناسق بين الدقة التنبؤية (Precision) وشمولية الاسترجاع (Recall) عبر المتوسط التوافقي، مما يجعله محصناً ضد مفارقة دقة التصنيف ومشاكل البيانات غير المتوازنة التي تعاني منها معظم التطبيقات الواقعية المعاصرة.

كما أثبتت التجارب البرمجية المطروحة عبر حزم R المتنوعة — كحزمة caret المرجعية، وحزمة MLmetrics الخفيفة، ومنظومة tidymodels / yardstick الحديثة، بالإضافة إلى الدوال الرياضية الذاتية في Base R — أن بيئة R توفر مرونة مطلقة وإمكانات حوسبية متطورة تُمكّن الباحث من حساب المقياس بمختلف أشكاله الثنائية والمتعددة (Macro و Micro و Weighted F1) وتطبيقه بكفاءة ضمن مسارات التحقق المتقاطع وضبط المعلمات الفائقة بأعلى معايير الدقة العلمية والمنهجية.

المراجع المعتمدة (References)

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

looti, M. (2026, أغسطس 30). كيفية حساب مقياس F1 في لغة R (مع مثال). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-calculate-f1-score-in-r/
looti, Mohammed. “كيفية حساب مقياس F1 في لغة R (مع مثال).” عرب سايكلوجي, 30 أغسطس 2026, https://arabpsychology.com/statistics/how-to-calculate-f1-score-in-r/.
looti, Mohammed. “كيفية حساب مقياس F1 في لغة R (مع مثال).” عرب سايكلوجي. أغسطس 30, 2026. https://arabpsychology.com/statistics/how-to-calculate-f1-score-in-r/.