مقدمة
عند بناء نموذج تعلم آلي، لا يكفي أن نحصل على نتائج جيدة على بيانات التدريب فقط. قد يكون النموذج "حفظ" البيانات بدل أن "يتعلم" منها.
هنا يأتي دور التحقق المتقاطع (Cross Validation)، وهي تقنية أساسية لتقييم الأداء الحقيقي للنموذج.
ما هو التحقق المتقاطع؟
التحقق المتقاطع هو طريقة لتقسيم البيانات إلى عدة أجزاء (Folds)، بحيث يتم تدريب النموذج على جزء واختباره على الجزء الآخر بشكل متكرر.
الفكرة الأساسية: لا تعتمد على تقسيم واحد فقط (Train/Test Split)، بل على عدة تقسيمات للحصول على تقييم أكثر دقة.
لماذا نستخدم Cross Validation؟
- تقليل التحيز في تقييم النموذج
- الحصول على تقدير أكثر دقة للأداء
- تقليل مشكلة Overfitting
- استغلال البيانات بشكل أفضل
بدون Cross Validation قد تحصل على نموذج يبدو جيدًا لكنه يفشل في الواقع.
K-Fold Cross Validation
أشهر نوع من التحقق المتقاطع هو K-Fold.
في هذا الأسلوب يتم تقسيم البيانات إلى K أجزاء متساوية.
- تدريب النموذج K مرات
- كل مرة يتم استخدام Fold مختلف للاختبار
مثال عملي:
إذا كان K = 5:
- التكرار 1: Fold 1 اختبار والباقي تدريب
- التكرار 2: Fold 2 اختبار والباقي تدريب
- ... حتى Fold 5
Leave-One-Out Cross Validation
في هذا النوع يتم استخدام كل نقطة بيانات كاختبار مرة واحدة.
إذا كان لديك 1000 عينة، سيتم تدريب النموذج 1000 مرة.
Stratified K-Fold
يستخدم عندما تكون البيانات غير متوازنة (Imbalanced Data).
يحافظ على نفس نسبة الفئات داخل كل Fold.
- مفيد في تصنيف الأمراض
- مفيد في كشف الاحتيال
Cross Validation للبيانات الزمنية
لا يمكن خلط البيانات الزمنية بشكل عشوائي.
يجب احترام ترتيب الزمن.
- Training على الماضي
- Testing على المستقبل
مقارنة بين الأنواع
- K-Fold: الأكثر استخدامًا
- LOO: دقيق لكن بطيء
- Stratified: للبيانات غير المتوازنة
- Time Series: للبيانات الزمنية
العلاقة مع Overfitting
Cross Validation يساعد في اكتشاف Overfitting مبكرًا.
إذا كان الأداء في التدريب عالي جدًا لكن منخفض في Cross Validation، فهذا مؤشر واضح.
أفضل الممارسات
- استخدم K=5 أو K=10 غالبًا
- لا تخلط البيانات الزمنية
- استخدم Stratified للبيانات غير المتوازنة
- اجعل التقسيم عشوائيًا ولكن قابلًا للتكرار
أخطاء شائعة
- استخدام Cross Validation بعد اختيار الميزات (Leakage)
- خلط البيانات الزمنية
- اختيار K كبير جدًا بدون حاجة
- عدم تثبيت Random Seed