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

٩ مارس ٢٠٢٦

Mastering Cross-Validation Techniques in 2026

ملخص

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

ما ستتعلمه

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

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

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

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

يمكنك تثبيت أحدث إصدار من scikit-learn (اعتباراً من 18 مايو 2026) باستخدام:

pip install -U scikit-learn==1.9.0

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

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

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

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


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

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

الدالة الغرض ما ترجعه حالة الاستخدام النموذجية
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

في قلب كل دالة CV يوجد مقسم (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]

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


متى تستخدم ومتى لا تستخدم التحقق المتبادل

الموقف هل تستخدم التحقق المتقاطع (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. تحليل التباين (Variance)

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) — وهو تحذير بأنه قد لا يعمم بشكل جيد على بيانات جديدة.


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

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

التجارة الإلكترونية (2025)

استخدم بائع تجزئة عالمي تحقق Stratified K-Fold لتقييم محرك توصيات. النتيجة؟ زيادة بنسبة 12% في معدل النقر (CTR) مع ضمان أداء عادل عبر فئات المنتجات الأقلية.8

التصنيع (أوائل 2026)

طبقت شركة تركية لتصنيع السيراميك تحقق repeated K-Fold على بيانات صور معززة بالحرارة، مما ساعد في تقليل معدلات الهالك بنسبة تزيد عن 50%.8

الأجهزة الطبية (2026)

قامت شركة ناشئة للأجهزة الطبية بالتحقق من نماذج على مستوى المريض باستخدام Leave-One-Out Cross-Validation (LOOCV) لتلبية متطلبات التعميم الخاصة بـ FDA — مما مكنها من الحصول على تصريح السوق.89

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


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

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

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

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


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

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

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

  1. التبديل العشوائي (Shuffling) بعد StratifiedKFold — يكسر عملية التقسيم الطبقي.
  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 تمت إزالة الوحدة في الإصدار 1.5+ استخدم sklearn.model_selection بدلاً منها11
TypeError: cv must be an integer or splitter تم إهمال استخدام الرقم الصحيح لـ CV مرر كائن KFold/StratifiedKFold بشكل صريح
نتائج منخفضة بشكل غير متوقع تسرب البيانات أو مقياس تقييم خاطئ تحقق من المعالجة المسبقة ومعامل scoring
نتائج غير متسقة بين عمليات التشغيل فقدان random_state قم بتعيين random_state لضمان قابلية التكرار
ليس مع KFold أو StratifiedKFold. استخدم بدلاً من ذلك.

أهم النقاط المستفادة

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

  • استخدم StratifiedKFold للتصنيف (classification)، و KFold للانحدار (regression).
  • يفضل استخدام cross_validate عندما تحتاج إلى مقاييس مفصلة.
  • تحقق دائماً من التباين (variance) عبر الطيات — وليس المتوسط فقط.
  • تجنب معاملات cv الصحيحة (integer) المهجورة في إصدارات scikit-learn 1.9.0+.
  • تثبت النتائج في العالم الحقيقي قيمته: رفع بنسبة 12% في CTR، وتقليل الهالك بنسبة >50%، واعتماد FDA.

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

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

Footnotes

  1. Cross-validation with StratifiedKFold in scikit-learn — https://codesignal.com/learn/courses/hypertuning-classical-models/lessons/cross-validation-with-stratifiedkfold-in-scikit-learn

  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

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

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

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

  7. Codes of Phoenix: sklearn ensemble methods — https://www.codesofphoenix.com/articles/sklearn/ensemble-methods

  8. Neptune.ai blog: cross-validation in ML — https://neptune.ai/blog/cross-validation-in-machine-learning-how-to-do-it-right 2 3

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

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

  11. scikit-learn 1.9 release notes — https://scikit-learn.org/dev/whats_new/v1.9.html

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

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

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

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

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

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

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