إتقان تقنيات Cross-Validation في عام

٩ مارس ٢٠٢٦

Mastering Cross-Validation Techniques in 2026

ملخص

  • التحقق المتقاطع (Cross-validation) هو المعيار الذهبي لتقدير مدى قدرة نموذج التعلم الآلي الخاص بك على التعميم.
  • في scikit-learn، توفر الدوال cross_validate و cross_val_score و cross_val_predict سير عمل مرن ومتوازي للتحقق.
  • تظل KFold و StratifiedKFold هما المقسمان الأساسيان — مع القيمة الافتراضية n_splits=5 منذ الإصدار 0.22.
  • بينما لا يزال تمرير رقم صحيح إلى cv يعمل، فإن استخدام كائنات التقسيم الصريحة يمنحك تحكمًا أكبر في الخلط (shuffling) وإعادة إنتاج النتائج.
  • يُستخدم التحقق المتقاطع على نطاق واسع في نماذج التعلم الآلي الإنتاجية — من أنظمة التوصية إلى مراقبة جودة التصنيع والتحقق من الأجهزة الطبية.

ما ستتعلمه

  • الغرض من التحقق المتقاطع وآليات عمله
  • الاختلافات بين cross_val_score و cross_validate و cross_val_predict
  • كيفية الاختيار بين KFold و StratifiedKFold واستراتيجيات أخرى
  • كيفية تنفيذ التحقق المتقاطع في سير عمل جاهز للإنتاج
  • الأخطاء الشائعة وكيفية تجنبها
  • دراسات حالة من العالم الحقيقي تظهر نتائج ملموسة

المتطلبات الأساسية

لمتابعة هذا الشرح، يجب أن يكون لديك:

  • فهم أساسي للتعلم الخاضع للإشراف (التصنيف أو الانحدار)
  • إلمام بلغة Python ومكتبة scikit-learn
  • بيئة Python عاملة (يُوصى بإصدار Python ≥3.9)

يمكنك تثبيت أحدث إصدار مستقر من scikit-learn باستخدام:

pip install -U scikit-learn

مقدمة: لماذا لا يزال التحقق المتقاطع مهمًا

تخيل تدريب نموذج يعمل بشكل رائع على بيانات التدريب الخاصة بك... ولكنه يفشل فشلاً ذريعًا في بيئة الإنتاج. هذا هو الإفراط في التخصيص (overfitting) — والتحقق المتقاطع (CV) هو أفضل دفاع لك ضده.

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

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


دوال التحقق المتقاطع الأساسية

توفر وحدة model_selection في Scikit-learn ثلاث دوال رئيسية لسير عمل التحقق المتقاطع:

الدالة الغرض ما ترجعه حالة الاستخدام النموذجية
cross_val_score حساب درجات التحقق المتقاطع لمقياس واحد مصفوفة أحادية الأبعاد من الدرجات تقدير سريع للأداء
cross_validate حساب مقاييس متعددة، وأوقات الملاءمة/التقييم قاموس (Dict) من المصفوفات قياس أداء مفصل
cross_val_predict توليد تنبؤات خارج الطية (out-of-fold) مصفوفة بنفس طول y التصور، أو التجميع (stacking)، أو التقييم اليدوي

cross_val_score: الفحص السريع

دالة cross_val_score هي خيارك الأمثل لتقييم سريع ومتوازٍ. تعيد مصفوفة من درجات الاختبار، درجة واحدة لكل طية (fold).1

from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine

X, y = load_wine(return_X_y=True)
model = RandomForestClassifier(n_estimators=100, random_state=42)

cv = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=cv, scoring='accuracy', n_jobs=-1)

print("Fold scores:", scores)
print("Mean accuracy:", scores.mean())

المخرجات:

Fold scores: [0.972 0.944 0.972 0.972 0.944]
Mean accuracy: 0.9608

يوضح هذا أداءً ثابتًا للنموذج عبر الطيات — وهي علامة جيدة على القدرة على التعميم.

cross_validate: الأداة القوية

عندما تحتاج إلى أكثر من مجرد الدقة، تمنحك cross_validate مقاييس مفصلة بما في ذلك وقت الملاءمة ووقت التقييم.23

from sklearn.model_selection import cross_validate

results = cross_validate(
    model, X, y, cv=cv,
    scoring=['accuracy', 'precision_macro', 'recall_macro'],
    return_train_score=True
)

print(results.keys())

المخرجات:

dict_keys(['fit_time', 'score_time', 'test_accuracy', 'train_accuracy', 'test_precision_macro', 'test_recall_macro'])

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

cross_val_predict: التنبؤات خارج الطية

على عكس الدالتين السابقتين، لا تقوم cross_val_predict بحساب الدرجات — بل تعيد التنبؤات التي تم إجراؤها على كل طية اختبار وتجمعها معًا.24

هذا مثالي لرسم منحنيات المعايرة (calibration curves) أو مصفوفات الارتباك (confusion matrices):

from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix

y_pred = cross_val_predict(model, X, y, cv=cv)
cm = confusion_matrix(y, y_pred)
print(cm)

ضع في اعتبارك أن النتائج من cross_val_predict قد تختلف عن cross_val_score ما لم تكن جميع طيات الاختبار متساوية في الحجم وكان المقياس قابلاً للتحلل عبر العينات.


المقسمات: KFold مقابل StratifiedKFold

في قلب كل دالة تحقق متقاطع يوجد مقسم (splitter) — وهو الخوارزمية التي تقرر أي العينات تذهب إلى أي طية.

KFold

تقوم KFold بتقسيم البيانات إلى طيات متجاورة دون مراعاة توزيع الفئات. معلماتها الافتراضية (منذ إصدار scikit-learn 0.22) هي:

  • n_splits=5
  • shuffle=False
  • random_state=None5

StratifiedKFold

تضمن StratifiedKFold أن كل طية تحافظ تقريبًا على النسب الإجمالية للفئات — وهو أمر بالغ الأهمية عند التعامل مع بيانات غير متوازنة.6

القيم الافتراضية:

  • n_splits=5
  • shuffle=False
  • random_state=None

جدول مقارنة

الميزة KFold StratifiedKFold
يحافظ على توزيع الفئات
مناسب للانحدار ⚠️ ليس عادةً
مناسب للتصنيف ✅ (مفضل)
التقسيمات الافتراضية 5 5
الخلط الافتراضي False False

عندما تمرر رقمًا صحيحًا (مثل cv=5) إلى cross_val_score، تستخدم scikit-learn تلقائيًا StratifiedKFold للتصنيف و KFold للانحدار.7


تصور العملية

إليك تدفق مفاهيمي لكيفية عمل التحقق المتقاطع:

flowchart LR
    A[Full Dataset] --> B[Split into Folds]
    B --> C1[Fold 1 = Test, Rest = Train]
    B --> C2[Fold 2 = Test, Rest = Train]
    B --> C3[...]
    C1 --> D[Compute Metric]
    C2 --> D
    C3 --> D
    D --> E[Aggregate Results]

تعمل كل طية كمجموعة استبعاد (holdout set) مصغرة، مما يمنحك تقديرات مستقلة متعددة لأداء النموذج.


متى تستخدم ومتى لا تستخدم التحقق المتقاطع

الموقف هل تستخدم التحقق المتقاطع (Cross-Validation)؟ السبب
بيانات محدودة (مثل البيانات الطبية، الأحداث النادرة) يعظم الاستفادة من البيانات للتدريب
التعلم عبر الإنترنت واسع النطاق (Large-scale online learning) بطيء جداً؛ استخدم التحقق بالاستبقاء (holdout) أو التحقق المتدحرج (rolling validation)
تصنيف غير متوازن للغاية (Highly imbalanced classification) استخدم StratifiedKFold للحفاظ على النسب
التنبؤ بالسلاسل الزمنية (Time series forecasting) ⚠️ استخدم TimeSeriesSplit بدلاً من ذلك
ضبط المعلمات الفائقة (Hyperparameter tuning) ضروري لعملية بحث غير منحازة

ما ستتعلمه: بناء خط معالجة تحقق موثوق

دعنا نستعرض سير عمل حقيقي باستخدام cross_validate.

1. تحميل البيانات

from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)

2. تعريف النموذج

from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=500)

3. اختيار أداة التقسيم

from sklearn.model_selection import StratifiedKFold
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

4. تشغيل التحقق

from sklearn.model_selection import cross_validate

results = cross_validate(
    model, X, y, cv=cv,
    scoring=['accuracy', 'roc_auc'],
    return_train_score=True
)

print("Mean ROC AUC:", results['test_roc_auc'].mean())

5. تحليل التباين

import numpy as np

mean_auc = np.mean(results['test_roc_auc'])
std_auc = np.std(results['test_roc_auc'])
print(f"AUC mean={mean_auc:.3f}, std={std_auc:.3f}")

يعني الانحراف المعياري العالي أن أداء نموذجك يختلف كثيراً بين المجموعات (folds) — وهو تحذير من أنه قد لا يعمم بشكل جيد.


دراسات حالة من العالم الحقيقي

التحقق المتقاطع ليس مجرد موضوع أكاديمي — بل يُستخدم في مختلف الصناعات لبناء الثقة في أداء النماذج.

التجارة الإلكترونية

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

التصنيع

تستفيد نماذج مراقبة الجودة للكشف عن العيوب من التحقق المتكرر (repeated K-Fold) لإثبات الأداء المتسق عبر ظروف الإنتاج (درجة الحرارة، الإضاءة، دفعات المواد). هذا مهم بشكل خاص عندما تكون بيانات التدريب محدودة.

الأجهزة الطبية

تتطلب الهيئات التنظيمية مثل FDA دليلاً على أن نماذج الذكاء الاصطناعي تعمم بما يتجاوز بيانات تدريبها. يعد التحقق المتقاطع بترك عينة واحدة (LOOCV) والتقسيم على مستوى المريض استراتيجيات شائعة لمجموعات البيانات السريرية الصغيرة حيث تهم كل عينة8.

تسلط هذه الأمثلة الضوء على كيفية بناء التحقق المتقاطع للثقة — ليس فقط في الدقة، ولكن في الموثوقية التنظيمية والتشغيلية.


أفضل الممارسات للتحقق من الميزات

عند اختبار ميزة جديدة، لا تنظر فقط إلى متوسط التحسن — بل تحقق أيضاً من تباينه عبر المجموعات.9

  1. احسب متوسط التحسن في مقياس التقييم الخاص بك.
  2. احسب التباين عبر المجموعات (folds).

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


الأخطاء الشائعة والحلول

الخطأ لماذا يحدث كيفية الإصلاح
الاعتماد على القيم الافتراضية لـ cv كعدد صحيح استخدام cv كعدد صحيح يستخدم أدوات تقسيم افتراضية بدون خلط (shuffle) أو حالة عشوائية قم بتمرير كائن KFold أو StratifiedKFold بشكل صريح للتحكم الكامل
تسرب البيانات (Data leakage) المعالجة المسبقة خارج حلقة التحقق المتقاطع استخدم Pipeline لتغليف المعالجة المسبقة
الفئات غير المتوازنة KFold الافتراضي لا يحافظ على النسب استخدم StratifiedKFold
تباين عالٍ عبر المجموعات النموذج غير مستقر أو البيانات منحرفة زد البيانات، أو بسط النموذج، أو استخدم التحقق المتقاطع المتكرر
إساءة تفسير cross_val_predict إنه لا يحسب النتائج (scores) استخدمه فقط للتصور (visualization) أو النمذجة الوصفية (meta-modeling)

أخطاء شائعة يقع فيها الجميع

  1. إعادة ترتيب البيانات يدوياً بعد حساب التقسيمات — مما يبطل تعيينات المجموعات. استخدم shuffle=True داخل أداة التقسيم بدلاً من ذلك.
  2. استخدام التحقق المتقاطع على السلاسل الزمنية — غير صالح إلا إذا تم استخدام TimeSeriesSplit.
  3. تجاهل وقت الملاءمة (fit time) — قد تفرط بعض النماذج في التخصيص لمجرد أنها تستغرق وقتاً أطول في التدريب لكل مجموعة.
  4. خلط المعالجة المسبقة خارج التحقق المتقاطع — يؤدي إلى انحياز تفاؤلي.

اعتبارات الأداء والأمان والقابلية للتوسع

الأداء

  • استخدم التوازي مع n_jobs=-1 للاستفادة من جميع أنوية المعالج.
  • راقب fit_time و score_time (من cross_validate) لاكتشاف الاختناقات.
  • استخدم عدداً أقل من المجموعات (مثلاً 3 بدلاً من 10) لمجموعات البيانات الكبيرة لتقليل وقت التشغيل.

الأمان

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

القابلية للتوسع

لمجموعات البيانات الكبيرة جداً، ضع في اعتبارك:

  • استخدام نماذج partial fit (مثل SGDClassifier)
  • أخذ عينات من البيانات لدورات تحقق سريعة
  • التحقق المتقاطع الموزع عبر Dask أو واجهة joblib الخلفية

اختبار ومراقبة عملية التحقق الخاصة بك

الاختبار

اكتب اختبارات وحدة (unit tests) لمنطق التحقق المتقاطع الخاص بك:

def test_cv_splits_shape():
    from sklearn.model_selection import KFold
    X = range(10)
    cv = KFold(n_splits=5)
    splits = list(cv.split(X))
    assert len(splits) == 5

المراقبة

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


دليل استكشاف الأخطاء وإصلاحها

العرض السبب المحتمل الإصلاح
ImportError: No module named sklearn.cross_validation تم إهمال الوحدة في الإصدار 0.18 وإزالتها في الإصدار 0.20 (2018) استخدم sklearn.model_selection بدلاً من ذلك3
TypeError: cv must be an integer or splitter تم تمرير نوع غير صالح (مثل float أو list) إلى cv مرر عدداً صحيحاً أو كائن تقسيم مثل KFold أو StratifiedKFold
نتائج منخفضة بشكل غير متوقع تسرب البيانات أو مقياس تقييم خاطئ تحقق من المعالجة المسبقة ومعلمة scoring
نتائج غير متسقة بين التشغيلات فقدان random_state قم بتعيين random_state لضمان التكرار
ليس مع KFold أو StratifiedKFold. استخدم بدلاً من ذلك.

النقاط الرئيسية

التحقق المتقاطع ليس مجرد طقس إحصائي — إنه اختبار الواقع لنموذجك.

  • استخدم StratifiedKFold للتصنيف (classification)، و KFold للانحدار (regression).
  • يفضل استخدام cross_validate عندما تحتاج إلى مقاييس مفصلة.
  • تحقق دائماً من التباين (variance) عبر الطيات — وليس المتوسط فقط.
  • استخدم كائنات التقسيم (splitter objects) الصريحة بدلاً من الأرقام الصحيحة البسيطة لـ cv للتحكم في الخلط (shuffling) وإمكانية إعادة إنتاج النتائج.
  • تشمل التطبيقات في العالم الحقيقي التجارة الإلكترونية، والتصنيع، والتحقق من الأجهزة الطبية.

الخطوات التالية

  • استكشف دليل التحقق المتقاطع الرسمي لـ scikit-learn10
  • جرب دمج cross_validate في خط معالجة البحث عن المعاملات الفائقة (hyperparameter search pipeline).
  • اشترك في نشرتنا الإخبارية لمزيد من التعمق في ممارسات تعلم الآلة (ML) الحديثة.

Footnotes

  1. scikit-learn documentation: cross_val_score — https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html

  2. Stack Overflow: cross_val_predict vs cross_val_score — https://stackoverflow.com/questions/62201597/scikit-learn-scores-are-different-when-using-cross-val-predict-vs-cross-val-scor 2 3

  3. scikit-learn documentation: cross_validate — https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_validate.html 2

  4. scikit-learn example: plot_cv_predict — https://scikit-learn.org/stable/auto_examples/model_selection/plot_cv_predict.html

  5. scikit-learn documentation: KFold — https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html

  6. scikit-learn documentation: StratifiedKFold — https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html

  7. scikit-learn User Guide: cross-validation — https://scikit-learn.org/stable/modules/cross_validation.html

  8. Owkin blog: from AI model to validated medical device — https://www.owkin.com/blogs-case-studies/blog-4-from-ai-model-to-validated-medical-device

  9. Medium: validating new features without overfitting — https://medium.com/codetodeploy/how-to-validate-new-features-without-causing-overfitting-in-ml-models-d2cbf40d5e5a

  10. scikit-learn official cross-validation guide — https://scikit-learn.org/stable/modules/cross_validation.html

الأسئلة الشائعة

عادةً 5 أو 10. تعني المجموعات الأكثر انحيازاً أقل ولكن تكلفة حوسبة أعلى. منذ إصدار scikit-learn 0.22، أصبحت القيمة الافتراضية هي n_splits=5 .

نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.