الدرس الثالث (٢)
انظر إلى الشيفرة البرمجية في الصفحة. لدينا ثلاثة مرضى، وكل مريض تظهر لديه أعراض مختلفة. في المريض الأول، الأعراض هي الصداع والإيعاء والسعال، وندخلها في الدالة diagnose_v3 لتفحص ملف symptom_mapping_v3.json. انظر إلى النتائج في الأسفل: المريض الأول تظهر النتيجة لديه أن تشخيصه المحتمل هو الإنفلونزا بدرجة قدرها 3. المريض الثاني لديه احتقان الأنف ورشح الأنف والعطاس والتهاب الحلق، ونتيجته هي نزلة برد بدرجة 4. أما المريض الثالث فلديه نفس أعراض المريض الثاني، لكنه مررنا للدالة معاملين إضافيين هما 1 و1، فتغيرت النتيجة لتعطي احتمالين معا هما نزلة البرد أو الإنفلونزا بدرجة 4. يوضح الشكل التوضيحي 2.12 هذا الإصدار الثالث كيف تربط قاعدة المعرفة الأعراض بالأمراض عبر أوزان مختلفة لكل عرض، فإذا تساوت الأوزان لعينات مختلفة تداخلت النتائج لتشخيصات متعددة كما رأيت في المريض الثالث.
يقوم الدرس على بناء نموذج ذكي لتشخيص الأمراض باستخدام تعلم الآلة وتقسيم البيانات إلى تدريب واختبار. الفكرة الأساسية هي الانتقال من الأنظمة القائمة على القواعد اليدوية إلى خوارزميات تتعلم تلقائياً عبر شجرة القرار. انظر إلى استخدام مصنف شجرة القرار DecisionTreeClassifier لبناء النموذج من بيانات تاريخية، ثم تقييم دقته عبر مصفوفة الدقة Confusion Matrix ومؤشر جيني Gini Index الذي يقيس الشوائب بالعقد. مثال سريع: إذا كان لدينا ١٤٠٠ نقطة بيانات للتدريب و٦٠٠ نقطة للاختبار، فإننا ندرب النموذج عليها ثم نختبره لنحصل على نسبة دقة تصل إلى ٨١.٦ بالمئة عبر دمج الأعراض بالتشخيصات المحتملة مثل كوفيد-١٩ والإنفلونزا.
الفكرة الأساسية
الانتقال من بناء قواعد المعرفة يدويا وتحديد الأوزان بشكل شاق إلى استخدام تعلم الآلة لتحديد القواعد تلقائيا، وتحديداً بناء أنظمة تشخيص طبي باستخدام خوارزمية شجرة القرار والتحقق من دقتها عبر بيانات التدريب والاختبار.
الشرح
عندما نعمل على تطوير نظام تشخيص، نبدأ بقراءة مجموعة بيانات طبية تحتوي على أعراض مرضية مثل الحمى والسعال والإعياء، وترميز كل عرض بعدد ثنائي إما واحد إذا كان المريض يعاني منه أو صفر إذا كان لا يعاني منه. بدلاً من وضع القواعد يدوياً، نستخدم تعلم الآلة Rule-Based Machine Learning أو ننتقل لتطبيق البايثون في الإصدار الرابع عبر مكتبة سكليرن sklearn لبناء نموذج شجرة القرار DecisionTreeClassifier. نقسم البيانات أولاً إلى مجموعتين باستخدام دالة train_test_split حيث تذهب سبعون بالمئة للتدريب وثلاثون بالمئة للاختبار. يقسم النموذج البيانات عبر التفرع الثنائي Binary Splits بناءً على فحص الأعراض مثل فحص الحمى ثم التهاب الحلق. يعتمد التفرع على مؤشر جيني Gini Index الذي يقيس الشوائب بالعقد، حيث تعني العقدة النقية تماماً خلوها من الشوائب وانخفاض معامل جيني ليؤكد دقة التصنيف. لتقييم أداء النموذج بعد الاختبار، نحسب دقة النموذج Model's Accuracy ونستخدم مصفوفة الدقة Confusion Matrix التي تقارن بين القيم الحقيقية والفعلية، حيث تمثل الأرقام الموجودة على الخط القُطري الحالات المتوقعة بشكل صحيح بينما تمثل الأرقام الخارجية أخطاء النموذج.
مثال محلول خطوة بخطوة
لدينا مجموعة بيانات تحتوي على ألفين حالة مرضية. نقسمها باستخدام train_test_split إلى قسمين: ١٤٠٠ نقطة بيانات للتدريب و٦٠٠ نقطة للاختبار. ندرب النموذج باستخدام الأمر model.fit على بيانات التدريب، ثم نختبره على بيانات الاختبار بمقارنة الأعراض بالتصخيصات المتوقعة. عند حساب دقة النموذج باستخدام accuracy_score نجد النتيجة تبلغ ٠.٨١٦٦ أي ٨١.٦ بالمئة، وهو ما يعني أن النموذج شخّص ٤٩٠ حالة من أصل ٦٠٠ حالة بشكل صحيح تماماً. وعند طباعة مصفوفة الدقة باستخدام confusion_matrix يظهر لنا جدول يوضح الحالات الصحيحة على الخط القطري مثل تصحيح ١٤٣ حالة حساسية، وحالات الخطأ خارج القُطري مثل تصنيف ٤٨ حالة نزلات برد على أنها إنفلونزا خطأً.
أخطاء شائعة
- الاعتقاد بأن مؤشر جيني المرتفع يعني دقة أفضل، والصحيح أن انخفاض معامل جيني هو ما يشير إلى ارتفاع درجة نقاء العقدة ودقة التصنيف.
- الخلط بين البيانات المستخدمة للتدريب والبيانات المستخدمة للاختبار، فالبيانات المخصصة لاختبار النموذج يجب أن تكون منفصلة تماماً عن بيانات التدريب.
- قراءة مصفوفة الدقة بطريقة خاطئة باعتبار الأرقام الواقعة خارج الخط القُطري تمثل تنبؤات صحيحة، بينما الصحيح أن الخط القُطري وحده يمثل الحالات المتوقعة بشكل صحيح.
سؤالان للتدريب مع الإجابة
- السؤال الأول: ما الذي يمثله الرقم الواقع على الخط القُطري في مصفوفة الدقة Confusion Matrix؟
- الإجابة: يمثل الحالات المتوقعة بشكل صحيح.
- السؤال الثاني: ماذا يقيس مؤشر جيني Gini Index في عقد شجرة القرار؟
- الإجابة: يقيس الشوائب بالعقد، وبالتحديد احتمال تصنيف محتويات العقدة بصورة خاطئة.