التحقق المتقاطع

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

التحقق المتقاطع (Cross Validation)

إذن ، ما هو التحقق المتقاطع ، ولماذا يجب أن نهتم به؟ يمكننا العثور على تعريفات متعددة لما هو التحقق المتقاطع. أفضلهم بالنسبة لي هو:

التحقق المتقاطع هو خطوة في عملية بناء نموذج التعلم الآلي الذي يساعدنا على ضمان أن نماذجنا تناسب البيانات بدقة ويضمن أيضًا أننا لا نفرط في التجهيز، أو بمعنى أخر فرط التخصيص (overfitting) . 

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

تحتوي مجموعة البيانات هذه على 11 سمة مختلفة تحدد جودة النبيذ الأحمر. تشمل هذه السمات:

 • الحموضة الثابتة  (fixed acidity)

• الحموضة المتطايرة (volatile acidity)

• حامض الستريك (citric acid)

• السكر المتبقي (residual sugar)

• الكلوريدات (chlorides)

• ثاني أكسيد الكبريت الحر (free sulfur dioxide)

• إجمالي ثاني أكسيد الكبريت (total sulfur dioxide)

• الكثافة (density)

• درجة الحموضة (pH)

• الكبريتات (sulphates)

• الكحول (alcohol)

بناءً على هذه الخصائص المختلفة ، نحن مطالبون بالتنبؤ بجودة النبيذ الأحمر وهي قيمة بين 0 و 10.

 لنرى كيف تبدو هذه البيانات. 

import pandas as pd
df = pd.read_csv("winequality-red.csv")

البيانات ستبدو هكذا 

التصنيف (Classification)

يمكننا التعامل مع هذه المشكلة إما على أنها مشكلة تصنيف أو مشكلة انحدار لأن جودة النبيذ ليست سوى رقم حقيقي بين 0 و 10. 

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

#عمل قاموس يعين قيم الجودة من 0 إلى 5
quality_mapping = {
    3:0,
    4:1,
    5:2,
    6:3,
    7:4,
    8:5
}

# سنقوم بإستخدام باندا لتغيير أي قيمة عامود
# للقيم المستخدمة في القاموس

df.loc[:, "quality"] = df.quality.map(quality_mapping)

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

 لذا ، فلنبدأ بشيء بسيط يمكننا تخيله أيضًا كمثال أشجار القرار (decision trees) . 

قبل أن نبدأ في فهم معنى فرط التخصيص (overfitting) ، دعنا نقسم البيانات إلى قسمين. تحتوي مجموعة البيانات هذه على 1599 عينة. نحتفظ بـ 1000 عينة للتدريب و 599 كمجموعة منفصلة. 

يمكن إجراء التقسيم بسهولة عن طريق الجزء التالي من الكود:

# لخلط البيانات frac=1 سنقوم بإستخدام 
# بعد ذلك نقوم بإعادة تعيين ترتيب البيانات
# بحكم أنه سيتختلط كذلك

df = df.sample(frac=1).reset_index(drop=True)

#سنختار أول ألف صف للتدريب

df_train = df.head(1000)

# بينما سنترك بقية الصفوف للإختبار و التحقق

df_test = df.tail(599)

 سنقوم الآن بتدريب نموذج شجرة ألقرار على مجموعة التدريب. بالنسبة لنموذج شجرة القرار ، سنستخدم scikit-Learn.

from sklearn import tree
from sklearn import metrics 

# تهيئة مصنف شجرة القرار
# max_depth =3  بإستخدام 

clf = tree.DecisionTreeClassifier(max_depth=3)

# نختار الأعمدة التي نرغب في تدريبها 
# و هي سمات النموذج 

cols = ['fixed acidity',
        'volatile acidity', 
        'citric acid',
        'residual sugar',
        'chlorides',
        'free sulfur dioxide',
        'total sulfur dioxide',
        'density',
        'pH',
        'sulphates',
        'alcohol'
       ]

# تدريب النموذج على السمات 
# و الجودة التي تم تعيينها سابقاً

clf.fit(df_train[cols], df_train.quality)

لاحظ أنني استخدمت أقصى عمق (max_Depth) لمصنف شجرة القرار يساوي 3 . و تركت جميع المعايير الأخرى لهذا النموذج لقيمته الافتراضية. 

الآن ، نقوم باختبار دقة هذا النموذج على مجموعة التدريب ومجموعة الاختبار:

# توليد التنبوات لمجموعة التدريب
train_predictions = clf.predict(df_train[cols])

# توليد التنبوات لمجموعة الإختبار
test_predictions = clf.predict(df_test[cols])

# حساب دقة التدريب

train_accuracy = metrics.accuracy_score(
    df_train.quality, train_predictions
)


# حساب دقة الإختبار

test_accuracy = metrics.accuracy_score(
    df_test.quality, test_predictions
)

وجد أن  دقة التدريب والاختبار هي 58.9٪ و 54.25٪. نقوم الآن بزيادة max_depth إلى 7 وكرر العملية. 

وهذا يعطي دقة تدريب 76.6٪ ودقة اختبار 57.3٪. 

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

from sklearn import tree
from sklearn import metrics 
import matplotlib 
import matplotlib.pyplot as plt
import seaborn as sns

# حجم الخط على الرسم
matplotlib.rc('xtick', labelsize=20)
matplotlib.rc('ytick', labelsize=20)

%matplotlib inline

# تهيئة قوائم لحفظ الدقة
# كبداية نبدأ بـ %50
train_accuracies = [0.5]
test_accuracies = [0.5]

# نقوم بالتكرار على قيم مختلفة للعمق

for depth in range(1,25):
    # تهيئة النموذج
    clf = tree.DecisionTreeClassifier(max_depth= depth)
    
    # السمات لغرض التدريب
    # بإمكاننا القيام بهذا خارج الحلقة
    cols = ['fixed acidity',
        'volatile acidity', 
        'citric acid',
        'residual sugar',
        'chlorides',
        'free sulfur dioxide',
        'total sulfur dioxide',
        'density',
        'pH',
        'sulphates',
        'alcohol'
       ]
    
    # نظبق النموذج على السمات 
    clf.fit(df_train[cols], df_train.quality)
    
    # ننشئ تنبؤ للتدريب و الإختبار
    train_predictions = clf.predict(df_train[cols])
    test_predictions = clf.predict(df_test[cols])
    
    # حساب دقة التدريب و الإختبار
    
    train_accuracy = metrics.accuracy_score(
        df_train.quality,train_predictions
    )
    
    test_accuracy = metrics.accuracy_score(
        df_test.quality, test_predictions
    )
    
    #  إلحاق الدقة
    
    train_accuracies.append(train_accuracy)
    test_accuracies.append(test_accuracy)

# عمل رسمتين 
plt.figure(figsize=(10, 5))
sns.set_style("whitegrid")
plt.plot(train_accuracies, label="train accuracy")
plt.plot(test_accuracies, label="test accuracy")
plt.legend(loc="upper left", prop={'size': 15})
plt.xticks(range(0, 26, 5))
plt.xlabel("max_depth", size=20)
plt.ylabel("accuracy", size=20)
plt.show()

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

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

هذا يسمى  فرط التخصيص (overfitting) . 

فرط التخصيص (overfitting)

في فرط التخصيص يتناسب النموذج تمامًا مع مجموعة التدريب ويؤدي أداءً ضعيفًا عندما يتعلق الأمر بمجموعة الاختبار. 

هذا يعني أن النموذج سوف يتعلم بيانات التدريب جيدًا ولكنه لن يعمم على العينات التي لا يعرفها. في مجموعة البيانات أعلاه ، يمكن للمرء أن يبني نموذجًا بعمق max_depth عالٍ جدًا والذي سيكون له نتائج رائعة في بيانات التدريب ، لكن هذا النوع من النماذج ليس مفيدًا لأنه لن يوفر نتيجة مماثلة على عينات العالم الحقيقي أو البيانات الحية. 

قد يجادل المرء بأن هذا النهج ليس مناسبًا لأن دقة مجموعة الاختبار تظل كما هي. تعريف آخر لفرط التخصيص هو 

عندما تزداد خسارة  الاختبار مع استمرارنا في تحسين خسارة التدريب. 

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

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

 يجب أن نتوقف عن التدريب حيث تصل خسارة التحقق إلى قيمتها الدنيا. 

هذا هو التفسير الأكثر شيوعًا لفرط التخصيص. 

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

التحقق المتقاطع (Cross Validation)

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

 حسنًا ، هذا أيضًا نوع من التحقق المتقاطع المعروف باسم مجموعة الانتظار (hold-out set) . 

نستخدم هذا النوع من التحقق (المتقاطع) عندما يكون لدينا كمية كبيرة من البيانات واستدلال النموذج  (model inference) عملية تستغرق وقتًا طويلاً. 

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

 يعتمد اختيار التحقق المتقاطع الصحيح على مجموعة البيانات التي تتعامل معها ، و نوع التحقق المتقاطع الذي يعمل مع مجموعة بيانات قد لا يعمل مع الأخرى . 

ومع ذلك ، هناك أنواع قليلة من تقنيات التحقق المتقاطع الأكثر شيوعًا والمستخدمة على نطاق واسع. وتشمل هذه: 

  • التحقق المتقاطع كي-طيه (k-fold cross-validation)
  • التحقق المتقاطع  كي-طيه الطبقي (stratified k-fold cross-validation)
  • التحقق المبني على الإنتظار (hold-out based validation)
  • التحقق المتقاطع بترك واحده خارجاُ (leave-one-out cross-validation)
  • التحقق المتقاطع لمجموعة كي-طيه (group k-fold cross-validation)

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

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

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

كما ترى ، نقسم العينات والأهداف المرتبطة بها. يمكننا تقسيم البيانات إلى مجموعات مختلفة k و كل واحدة مقصورة في نفسها . يُعرف هذا باسم التحقق المتقاطع كي-طيه (k-fold cross-validation).

التحقق المتقاطع كي-طيه (k-fold cross-validation)

 يمكننا تقسيم أي بيانات إلى أجزاء متساوية k باستخدام KFold من scikit-Learn. يتم تعيين قيمة لكل عينة من 0 إلى k-1 عند استخدام التحقق المتقاطع كي-طيه.

import pandas as pd 
from sklearn import model_selection

if __name__ =="__main__" :
    # train.csv تدريب البيانات الموجودة في ملف 
    df = pd.read_csv("train.csv")
    
    # ونقوم بتعبته بـ -1 kfold  إنشاء عامود جديد يسمى
    df["kfold"] = -1
    
    #  الخطوة التالية هي أن نقوم بجعل الصفوف عشوائية
    df = df.sample(frac=1).reset_index(drop =True)
    
    # model_Selection تعيئة كي فولد من 
    kf = model_selection.KFold(n_splits=5)
    
    #  تعبئة عامود كي فولد الجديد
    for fold,(trn_,val_) in enumerate(kf.split(x=df)):
        df.loc[val_, 'kfold'] = fold
        
    # مع عامود كي فولد  csv حفظ ملف 
    df.to_csv("train_folds.csv", index=False)

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

التحقق المتقاطع  كي-طيه الطبقي (stratified k-fold cross-validation)

 النوع المهم التالي من التحقق المتقاطع هو كي-طيه الطبقي (stratified k-fold cross-validation). 

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

 في هذه الحالات ، نفضل استخدام التحقق المتقاطع الطبقي كي-طيه . و الذي يحافظ  على ثبات نسبة التسميات في كل قسم أو (طيه). 

لذلك ، في كل طية ، سيكون لديك نفس العينات الإيجابية بنسبة 90٪ والعينات السلبية بنسبة 10٪. 

وبالتالي ، مهما كان المقياس الذي تختار تقييمه ، فإنه سيعطي نتائج مماثلة في جميع الطيات. 

يمكننا القيام بذلك كلاتي : 

import pandas as pd 
from sklearn import model_selection

if __name__ =="__main__" :
    # train.csv تدريب البيانات الموجودة في ملف 
    df = pd.read_csv("train.csv")
    
    #  الخطوة التالية هي أن نقوم بجعل الصفوف عشوائية
    df = df.sample(frac=1).reset_index(drop =True)
    
    #جلب الأهداف
    y = df.target.values
    
    # model_Selection تهيئة كي فولد من 
    kf = model_selection.StratifiedKFold(n_splits=5)
    
    #  تعبئة عامود كي فولد الجديد
    for f,(t_,v_) in enumerate(kf.split(x=df, y=y)):
        df.loc[_v, 'kfold'] = f
        
    # مع عامود كي فولد  csv حفظ ملف 
    df.to_csv("train_folds.csv", index=False)

بالنسبة لمجموعة بيانات النبيذ ، فلنلقِ نظرة على توزيع المسميات .

b = sns.countplot(x='quality', data=df)
b.set_xlabel("quality", fontsize=20)
b.set_ylabel("count", fontsize=20)

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

 القاعدة بسيطة. إذا كانت مشكلة تصنيف قياسية ، فاختر كي-طيه الطبقي. 

لكن ماذا يجب أن نفعل إذا كان لدينا كمية كبيرة من البيانات؟ افترض أن لدينا مليون عينة. بإستخدام التحقق المتقاطع كي طيه فهذا يعني أن التحقق المتقاطع سيحتوي على  5 طيات  و بالتالي  التدريب على 800 ألف عينة والتحقق بإستخدام 200 ألف.

 اعتمادًا على الخوارزمية التي نختارها ، يمكن أن يكون التدريب وحتى التحقق مكلفًا جدًا لمجموعة بيانات بهذا الحجم. في هذه الحالات ، يمكننا اختيار التحقق المبني على الانتظار (hold-out based validation) .

التحقق المبني على الانتظار (hold-out based validation)

 تظل عملية إنشاء االتحقق المبني على الانتظار مشابه لعملية كي-طيه الطبقي . بالنسبة لمجموعة البيانات التي تحتوي على مليون عينة ، يمكننا إنشاء 10 طيات بدلاً من 5 والاحتفاظ بإحدى تلك الطيات كإنتظار (hold-out) . 

هذا يعني أنه سيكون لدينا 100 ألف عينة في الإنتظار ، وسنقوم دائمًا بحساب الخسارة والدقة والمقاييس الأخرى في هذه المجموعة ومن ثم ندرب على 900 ألف عينة. 

يتم استخدام Hold-out بشكل متكرر مع بيانات السلاسل الزمنية (time-series data) . لنفترض أن المشكلة التي نقدمها هي توقع مبيعات متجر لعام 2020 ، وقد تم تزويدك بجميع البيانات من 2015-2019.

 في هذه الحالة ، يمكنك تحديد جميع البيانات لعام 2019 باعتبارها Hold-out وتدريب نموذجك على جميع البيانات من 2015 إلى 2018.

 في المثال المعروض في الصورة السابقة ، لنفترض أن وظيفتنا هي التنبؤ بالمبيعات من الخطوة الزمنية 31 إلى 40. يمكننا بعد ذلك الاحتفاظ بـ 21 إلى 30 كــ hold-out وتدريب نموذجنا من الخطوة 0 إلى الخطوة 20. 

يجب أن تلاحظ أنه عندما تتوقع من 31 إلى 40 ، يجب عليك تضمين البيانات من 21 إلى 30 في النموذج الخاص بك ؛ خلاف ذلك ، سيكون الأداء دون المستوى. 

في كثير من الحالات ، يتعين علينا التعامل مع مجموعات البيانات الصغيرة وبالتالي إنشاء مجموعات تحقق كبيرة يعني فقدان الكثير من البيانات للنموذج ليتعلمها. 

في هذه الحالات ، يمكننا اختيار نوع من التحقق المتقاطع كي-طيه بحيث k = N ، حيث N هو عدد العينات في مجموعة البيانات. هذا يعني أنه في جميع طيات التدريب ، سنقوم بالتدريب على جميع عينات البيانات باستثناء 1. 

عدد الطيات لهذا النوع من التحقق المتقاطع هو نفسه عدد العينات التي لدينا في مجموعة البيانات. 

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

الإنحدار (Regression)

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

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

لاستخدام كي-طيه الطبقي لمشكلة الانحدار ، علينا أولاً تقسيم الهدف إلى حاويات (bins) ، ثم يمكننا استخدام كي-طيه بالطريقة نفسها المستخدمة في مشاكل التصنيف. 

هناك العديد من الخيارات لاختيار العدد المناسب من الحاويات. إذا كان لديك الكثير من العينات (> 10 آلاف ،> 100 ألف) ، فلا داعي للقلق بشأن عدد الحاويات.  فقط قسّم البيانات إلى 10 أو 20 حاوية. 

إذا لم يكن لديك الكثير من العينات ، فيمكنك استخدام قاعدة بسيطة مثل قاعدة ستيوراج (Sturge’s rule)  لحساب العدد المناسب من الحاويات.

 قاعدة ستيوراج: 

عدد الحاويات =( 1 + log2 (N 

حيث N هو عدد العينات التي لديك في مجموعة البيانات الخاصة بك. تم رسم هذه الدالة في الصورة أدناه 

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

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn import model_selection

def create_folds(data):
    
    # ونقوم بتعبته بـ -1 kfold  إنشاء عامود جديد يسمى
    data["kfold"] = -1
    
    #  الخطوة التالية هي أن نقوم بجعل الصفوف عشوائية
    data = data.sample(frac=1).reset_index(drop=True)
    
    #حساب عدد الحاويات بإستخدام قاعدة ستيوراج
    num_bins = np.floor(1 + np.log2(len(data)))
    
    # أهداف الحاويات
    data.loc[:, "bins"] = pd.cut(
        data["target"], bins=num_bins, labels=False
    )
    
    # model_Selection تهيئة كي فولد من 
    kf = model_selection.StratifiedKFold(n_splits=5)
    
    #تعبئة عامود كي فولد
    #لاحظ اننا نستخدم الحاوية عوضا عن الأهداف
    for f, (t_, v_) in enumerate(kf.split(X=data, y=data.bins.values)):
        data.loc[v_, 'kfold'] = f
    
    #إسقاط عامود الحاوية
    data = data.drop("bins", axis=1)
    
    return data

if __name__ == "__main__":
    
    #سنقوم بإنشا مجموعة بيانات  تحتوي 15000 عينة
    # بالإضافة لـ 100 سمة وهدف 1
    
    X, y = datasets.make_regression(
        n_samples=15000, n_features=100, n_targets=1
    )
    
    # إنشاء إطار بيانات من مصفوفات نمباي
    df = pd.DataFrame( 
        X,
        columns=[f"f_{i}" for i in range(X.shape[1])]
    )
    df.loc[:, "target"] = y
    
    # إنشاء فولد
    
    df = create_folds(df)
 

ختاماً

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

إذا كنت ستنشئ نماذج ، فقسِّم بياناتك أولاً. إذا كان لديك مخطط جيد للتحقق المتقاطع  تكون فيه بيانات التحقق ممثلة للتدريب وبيانات العالم الحقيقي ، فستتمكن من بناء نموذج جيد للتعلم الآلي يمكن تعميمه بشكل كبير. 

يمكن تطبيق أنواع التحقق المتقاطع الواردة في هذا المقال على أي مشكلة في التعلم الآلي تقريبًا. ومع ذلك ، يجب أن تضع في اعتبارك أن التحقق المتقاطع يعتمد أيضًا كثيرًا على البيانات وقد تحتاج إلى اعتماد أشكال جديدة للتحقق المتقاطع اعتمادًا على مشكلتك وبياناتك. 

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

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

 لحسن الحظ ، تقدم scikit-Learn نوعًا من التحقق المتقاطع يعرف باسم GroupKFold . هنا يمكن اعتبار المرضى كمجموعات. لكن لسوء الحظ ، لا توجد طريقة للجمع بين GroupKFold و StratifiedKFold في scikit-Learn. لذلك عليك أن تفعل ذلك بنفسك.

إضافة تعليق