المزيد من مقالات التعلم العميق......المزيد من مقالات تعلم الآلة.....مقالات التعلم العميقمقالات تعلم الآلة

كيفية تقسيم مجموعة البيانات في التعلم الآلي والتعلم العميق؟

يتم استخدام إجراء تقسيم تدريب-اختبار train-test split لتقدير أداء خوارزميات التعلم الآلي عند استخدامها لعمل تنبؤات بشأن البيانات غير المستخدمة في تدريب النموذج.

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

في هذا البرنامج التعليمي، سوف تكتشف كيفية تقييم نماذج التعلم الآلي باستخدام تقسيم تدريب-اختبار.

بعد الانتهاء من هذا البرنامج التعليمي، ستعرف على:

  • يعد إجراء تقسيم تدريب-اختبار مناسبًا عندما يكون لديك مجموعة بيانات كبيرة جدًا، أو نموذجًا مكلفًا لتدريبه، أو تتطلب تقديرًا جيدًا لأداء النموذج بسرعة.
  • كيفية استخدام مكتبة التعلم الآلي scikit-Learn لتنفيذ إجراء تقسيم التدريب-الاختبار.
  • كيفية تقييم خوارزميات التعلم الآلي للتصنيف والانحدار باستخدام تقسيم التدريب-الاختبار.

ينقسم هذا البرنامج التعليمي إلى ثلاثة أجزاء؛ هم انهم:

  1. تقييم تقسيم تدريب-اختبار:
  • متى تستخدم تقسيم تدريب-اختبار.
  • كيفية تكوين تقسيم تدريب-اختبار.
  1. تدريب إجراءات التقسيم في Scikit-Learn:
  • تقسيم تدريب-اختبار المتكرر.
  • تقسيم تدريب-اختبار الطبقي.
  1. تقسيم تدريب-اختبار لتقييم نماذج التعلم الآلي:
  • تقسيم تدريب-اختبار للتصنيف.
  • تقسيم تدريب-اختبار للانحدار.

تقييم تقسيم تدريب-اختبار

تقسيم تدريب-اختبار هو أسلوب لتقييم أداء خوارزمية التعلم الآلي.

يمكن استخدامه لمشاكل التصنيف classification أو الانحدار regression ويمكن استخدامه لأي خوارزمية تعلم خاضعة للإشراف supervised learning algorithm.

يتضمن الإجراء أخذ مجموعة بيانات وتقسيمها إلى مجموعتين فرعيتين. تُستخدم المجموعة الفرعية الأولى لملاءمة fit النموذج ويشار إليها بمجموعة بيانات التدريب training dataset. لم يتم استخدام المجموعة الفرعية الثانية لتدريب النموذج؛ بدلاً من ذلك، يتم توفير عنصر الإدخال لمجموعة البيانات للنموذج، ثم يتم إجراء التنبؤات ومقارنتها بالقيم المتوقعة. يشار إلى مجموعة البيانات الثانية هذه بمجموعة بيانات الاختبار test dataset.

  • مجموعة بيانات التدريب Train Dataset: تُستخدم لملاءمة نموذج التعلم الآلي.
  • مجموعة بيانات الاختبار Test Dataset: تُستخدم لتقييم نموذج التعلم الآلي المناسب.

الهدف هو تقدير أداء نموذج التعلم الآلي على البيانات الجديدة: البيانات غير مستخدمة لتدريب النموذج.

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

يعد إجراء train-test مناسبًا عندما تتوفر مجموعة بيانات كبيرة بدرجة كافية.

متى تستخدم تقسيم التدريب-الاختبار

فكرة “كبيرة بما فيه الكفاية sufficiently large ” خاصة بكل مشكلة نمذجة تنبؤية. هذا يعني أن هناك بيانات كافية لتقسيم مجموعة البيانات إلى مجموعات بيانات التدريب والاختبار وكل مجموعة بيانات التدريب والاختبار هي تمثيلات مناسبة لمجال المشكلة. يتطلب هذا أن تكون مجموعة البيانات الأصلية أيضًا تمثيلًا مناسبًا suitable representation لمجال المشكلة.

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

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

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

بالإضافة إلى حجم مجموعة البيانات، هناك سبب آخر لاستخدام إجراء تقييم تقسيم التدريب-الاختبار وهو الكفاءة الحسابية computational efficiency.

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

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

يتم تقسيم العينات من مجموعة بيانات التدريب الأصلية إلى مجموعتين فرعيتين باستخدام الاختيار العشوائي random selection. هذا للتأكد من أن مجموعات بيانات التدريب والاختبار تمثل مجموعة البيانات الأصلية.

كيفية تكوين تقسيم التدريب-الاختبار

يحتوي الإجراء على معلمة تكوين رئيسية واحدة، وهي حجم مجموعات التدريب والاختبار. يتم التعبير عن هذا بشكل شائع كنسبة مئوية بين 0 و 1 إما لمجموعات بيانات التدريب او الاختبار. على سبيل المثال، مجموعة تدريب بحجم 0.67 (67 بالمائة) تعني أن النسبة المتبقية 0.33 (33 بالمائة) مخصصة لمجموعة الاختبار.

لا توجد نسبة تقسيم مثالية.

يجب عليك اختيار نسبة مجزأة تلبي أهداف مشروعك مع اعتبارات تشمل:

  • التكلفة الحسابية في تدريب النموذج.
  • التكلفة الحسابية في تقييم النموذج.
  • مجموعة التدريب التمثيلية.
  • مجموعة اختبار التمثيلية.

ومع ذلك، تشمل النسب المئوية الشائعة ما يلي:

  • التدريب: 80٪، الاختبار: 20٪
  • التدريب: 67٪، الاختبار: 33٪
  • التدريب: 50٪، الاختبار: 50٪

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

اجراء تقسيم التدريب-الاختبار في Scikit-Learn

توفر مكتبة التعلم الآلي الخاصة ببايثون scikit-learn تنفيذًا لإجراء تقييم تقسيم التدريب-الاختبار عبر دالة  train_test_split().

تأخذ الدالة مجموعة بيانات محملة كمدخلات وتعيد مجموعة البيانات المقسمة إلى مجموعتين فرعيتين

...
# split into train test sets
train, test = train_test_split(dataset, ...)

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

...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, ...)

يمكن تحديد حجم التقسيم عبر وسيطة “test_size” التي تأخذ عددًا من الصفوف (عددًا صحيحًا) أو نسبة مئوية (عائمة) من حجم مجموعة البيانات بين 0 و 1.

الأخير هو الأكثر شيوعًا، مع استخدام القيم مثل 0.33 حيث سيتم تخصيص 33 بالمائة من مجموعة البيانات لمجموعة الاختبار و67 بالمائة سيتم تخصيصها لمجموعة التدريب.

...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

يمكننا إثبات ذلك باستخدام مجموعة بيانات تصنيف تركيبية تحتوي على 1000 مثال.

# split a dataset into train and test sets
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
# create dataset
X, y = make_blobs(n_samples=1000)
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

يؤدي تشغيل المثال إلى تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار، ثم طباعة حجم مجموعة البيانات الجديدة.

يمكننا أن نرى أنه تم تخصيص 670 مثالًا (67 بالمائة) لمجموعة التدريب و330 مثالًا (33 بالمائة) تم تخصيصها لمجموعة الاختبار، كما حددنا.

(670, 2) (330, 2) (670,) (330,)

بدلاً من ذلك، يمكن تقسيم مجموعة البيانات عن طريق تحديد وسيطة “train_size” التي يمكن أن تكون إما عددًا من الصفوف (عددًا صحيحًا) أو نسبة مئوية من مجموعة البيانات الأصلية بين 0 و 1، مثل 0.67 لـ 67 بالمائة.

...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.67)

تقسيم التدريب-الاختبار المتكرر

اعتبار آخر مهم هو أنه يتم تعيين الصفوف في مجموعات التدريب والاختبار بشكل عشوائي.

يتم ذلك للتأكد من أن مجموعات البيانات هي عينة تمثيلية representative sample (مثل عينة عشوائية) من مجموعة البيانات الأصلية، والتي بدورها يجب أن تكون عينة تمثيلية من الملاحظات من مجال المشكلة.

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

يمكن تحقيق ذلك عن طريق تثبيت البذرة seed لمولد الرقم العشوائي الزائف المستخدم عند تقسيم مجموعة البيانات. إذا كنت جديدًا في استخدام مولدات الأرقام العشوائية الزائفة، فراجع البرنامج التعليمي:

يمكن تحقيق ذلك عن طريق ضبط “random_state” على قيمة عدد صحيح. أي قيمة ستفعل؛ إنه ليس معلمة فائقة قابلة للضبط tunable hyperparameter.

...
# split again, and we should see the same split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)

يوضح المثال أدناه هذا ويوضح أن تقسيمين منفصلين للبيانات يؤديان إلى نفس النتيجة.

# demonstrate that the train-test split procedure is repeatable
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
# create dataset
X, y = make_blobs(n_samples=100)
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# summarize first 5 rows
print(X_train[:5, :])
# split again, and we should see the same split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# summarize first 5 rows
print(X_train[:5, :])

يؤدي تشغيل المثال إلى تقسيم مجموعة البيانات وطباعة الصفوف الخمسة الأولى من مجموعة بيانات التدريب.

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

[[-2.54341511  4.98947608]
 [ 5.65996724 -8.50997751]
 [-2.5072835  10.06155749]
 [ 6.92679558 -5.91095498]
 [ 6.01313957 -7.7749444 ]]

[[-2.54341511  4.98947608]
 [ 5.65996724 -8.50997751]
 [-2.5072835  10.06155749]
 [ 6.92679558 -5.91095498]
 [ 6.01313957 -7.7749444 ]]

تقسيم التدريب-الاختبار الطبقي

الاعتبار الأخير هو مشاكل التصنيف فقط.

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

وهذا ما يسمى تقسيم الاختبار-التدريب الطبقي stratified train-test split.

يمكننا تحقيق ذلك من خلال تعيين الوسيطة “stratify” على المكون y من مجموعة البيانات الأصلية. سيتم استخدام هذا بواسطة الدالة train_test_split()  للتأكد من أن كلاً من مجموعات التدريب والاختبار تحتوي على نسبة من الأمثلة في كل فئة موجودة في المصفوفة “y” المتوفرة.

...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.50, random_state=1, stratify=y)

يمكننا إثبات ذلك بمثال على مجموعة بيانات تصنيف تحتوي على 94 مثالًا في فئة واحدة وستة أمثلة في فئة ثانية.

أولاً، يمكننا تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار بدون وسيطة “stratify”. المثال الكامل مدرج أدناه.

# split imbalanced dataset into train and test sets without stratification
from collections import Counter
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# create dataset
X, y = make_classification(n_samples=100, weights=[0.94], flip_y=0, random_state=1)
print(Counter(y))
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.50, random_state=1)
print(Counter(y_train))
print(Counter(y_test))

تشغيل المثال أولاً يُبلغ عن تكوين مجموعة البيانات حسب تصنيف الفئة، مع إظهار النسبة المتوقعة 94 بالمائة مقابل 6 بالمائة.

ثم يتم تقسيم مجموعة البيانات والإبلاغ عن تكوين مجموعات التدريب والاختبار. يمكننا أن نرى أن مجموعة التدريب بها 45/5 أمثلة في مجموعة الاختبار بها 49/1 مثال. يختلف تكوين مجموعات التدريب والاختبار، وهذا غير مرغوب فيه.

Counter({0: 94, 1: 6})
Counter({0: 45, 1: 5})
Counter({0: 49, 1: 1})

بعد ذلك، يمكننا نقسم طبقيا train-test split ومقارنة النتائج.

# split imbalanced dataset into train and test sets with stratification
from collections import Counter
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# create dataset
X, y = make_classification(n_samples=100, weights=[0.94], flip_y=0, random_state=1)
print(Counter(y))
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.50, random_state=1, stratify=y)
print(Counter(y_train))
print(Counter(y_test))

نظرًا لأننا استخدمنا تقسيمًا بنسبة 50 في المائة لمجموعات التدريب والاختبار، نتوقع أن يكون لكل من مجموعات التدريب والاختبار 47/3 مثال في مجموعات التدريب / الاختبار على التوالي.

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

Counter({0: 94, 1: 6})
Counter({0: 47, 1: 3})
Counter({0: 47, 1: 3})

الآن بعد أن أصبحنا على دراية بدالة train_test_split()، فلنلقِ نظرة على كيفية استخدامها لتقييم نموذج التعلم الآلي.

تقسيم التدريب-الاختبار لتقييم نماذج التعلم الآلي

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

تقسيم التدريب-الاختبار للتصنيف

سنشرح كيفية استخدام تقسيم التدريب-الاختبار لتقييم خوارزمية الغابة العشوائية random forest على مجموعة بيانات السونار sonar dataset.

مجموعة بيانات السونار عبارة عن مجموعة بيانات قياسية للتعلم الآلي تتكون من 208 صفًا من البيانات مع 60 متغيرًا رقميًا للإدخال ومتغير مستهدف بقيمتين للفئتين، على سبيل المثال تصنيف ثنائي.

تتضمن مجموعة البيانات توقع ما إذا كانت نتائج السونار تشير إلى صخرة أو لغم مقلد.

لا حاجة لتنزيل مجموعة البيانات؛ سنقوم بتنزيله تلقائيًا كجزء من أمثلتنا العملية.

يقوم المثال أدناه بتنزيل مجموعة البيانات ويلخص شكلها.

# summarize the sonar dataset
from pandas import read_csv
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)

يؤدي تشغيل المثال إلى تنزيل مجموعة البيانات وتقسيمها إلى عناصر إدخال وإخراج. كما هو متوقع، يمكننا أن نرى أن هناك 208 صفوف من البيانات مع 60 متغير إدخال.

(208, 60) (208,)

يمكننا الآن تقييم نموذج باستخدام تقسيم التدريب-الاختبار.

أولاً، يجب تقسيم مجموعة البيانات المحملة إلى مكونات الإدخال والإخراج.

...
# split into inputs and outputs
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)

بعد ذلك، يمكننا تقسيم مجموعة البيانات بحيث يتم استخدام 67 بالمائة لتدريب النموذج و33 بالمائة لتقييمه. تم اختيار هذا الانقسام بشكل تعسفي.

...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

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

...
# fit the model
model = RandomForestClassifier(random_state=1)
model.fit(X_train, y_train)

ثم استخدم النموذج الملائم لعمل تنبؤات وتقييمها باستخدام مقياس أداء دقة التصنيف classification accuracy.

...
# make predictions
yhat = model.predict(X_test)
# evaluate predictions
acc = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % acc)

بربط هذا معًا، يتم سرد المثال الكامل أدناه.

# train-test split evaluation random forest on the sonar dataset
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv'
dataframe = read_csv(url, header=None)
data = dataframe.values
# split into inputs and outputs
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
# fit the model
model = RandomForestClassifier(random_state=1)
model.fit(X_train, y_train)
# make predictions
yhat = model.predict(X_test)
# evaluate predictions
acc = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % acc)

يؤدي تشغيل المثال أولاً إلى تحميل مجموعة البيانات وتأكيد عدد الصفوف في عناصر الإدخال والإخراج.

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

يتم تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار ويمكننا أن نرى أن هناك 139 صفًا للتدريب و69 صفًا لمجموعة الاختبار.

أخيرًا، يتم تقييم النموذج بناءً على مجموعة الاختبار ويكون أداء النموذج عند إجراء تنبؤات على بيانات جديدة بدقة تبلغ حوالي 78.3 بالمائة.

(208, 60) (208,)
(139, 60) (69, 60) (139,) (69,)
Accuracy: 0.783

تقسيم التدريب-الاختبار للانحدار

سنشرح كيفية استخدام تقسيم التدريب-الاختبار لتقييم خوارزمية الغابة العشوائية في مجموعة بيانات الإسكان housing dataset.

مجموعة بيانات الإسكان عبارة عن مجموعة بيانات قياسية للتعلم الآلي تتكون من 506 صفوف من البيانات مع 13 متغير إدخال رقمي ومتغير هدف رقمي.

تتضمن مجموعة البيانات التنبؤ بسعر المنزل بالنظر إلى تفاصيل ضاحية المنزل في مدينة بوسطن الأمريكية.

لا حاجة لتنزيل مجموعة البيانات؛ سنقوم بتنزيله تلقائيًا كجزء من أمثلتنا العملية.

يقوم المثال أدناه بتنزيل مجموعة البيانات وتحميلها كـ Pandas DataFrame ويلخص شكل مجموعة البيانات.

# load and summarize the housing dataset
from pandas import read_csv
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
dataframe = read_csv(url, header=None)
# summarize shape
print(dataframe.shape)

يؤدي تشغيل المثال إلى تأكيد 506 صفًا من البيانات و 13 متغيرًا من متغيرات الإدخال ومتغيرات الهدف الرقمية الفردية (14 في المجموع).

(506, 14)

يمكننا الآن تقييم نموذج باستخدام تقسيم التدريب-الاختبار.

أولاً، يجب تقسيم مجموعة البيانات المحملة إلى مكونات الإدخال والإخراج.

...
# split into inputs and outputs
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)

بعد ذلك، يمكننا تقسيم مجموعة البيانات بحيث يتم استخدام 67 بالمائة لتدريب النموذج و33 بالمائة لتقييمه. تم اختيار هذا الانقسام بشكل تعسفي.

...
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

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

...
# fit the model
model = RandomForestRegressor(random_state=1)
model.fit(X_train, y_train)

ثم استخدم النموذج الملائم لعمل تنبؤات وتقييم التنبؤات باستخدام مقياس أداء متوسط الخطأ المطلق mean absolute error (MAE).

...
# make predictions
yhat = model.predict(X_test)
# evaluate predictions
mae = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % mae)

بربط هذا معًا، يتم سرد المثال الكامل أدناه.

# train-test split evaluation random forest on the housing dataset
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
dataframe = read_csv(url, header=None)
data = dataframe.values
# split into inputs and outputs
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)
# split into train test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
# fit the model
model = RandomForestRegressor(random_state=1)
model.fit(X_train, y_train)
# make predictions
yhat = model.predict(X_test)
# evaluate predictions
mae = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % mae)

يؤدي تشغيل المثال أولاً إلى تحميل مجموعة البيانات وتأكيد عدد الصفوف في عناصر الإدخال والإخراج.

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

يتم تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار ويمكننا أن نرى أن هناك 339 صفًا للتدريب و167 صفًا لمجموعة الاختبار.

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

(506, 13) (506,)
(339, 13) (167, 13) (339,) (167,)
MAE: 2.157

الملخص

في هذا البرنامج التعليمي، اكتشفنا كيفية تقييم نماذج التعلم الآلي باستخدام تقسيم التدريب-الاختبار train-test split.

على وجه التحديد، لقد تعلمت:

  • يعد إجراء تقسيم التدريب-الاختبار مناسبًا عندما يكون لديك مجموعة بيانات كبيرة جدًا، أو نموذجًا مكلفًا لتدريبه، أو تتطلب تقديرًا جيدًا لأداء النموذج بسرعة.
  • كيفية استخدام مكتبة التعلم الآلي scikit-Learn لتنفيذ إجراء تقسيم التدريب-الاختبار.
  • كيفية تقييم خوارزميات التعلم الآلي للتصنيف والانحدار باستخدام تقسيم التدريب-الاختبار.
بواسطة
Jason Brownlee
المصدر
Train-Test Split for Evaluating Machine Learning Algorithms

د. علاء طعيمة

كلية علوم الحاسوب وتكنولوجيا المعلومات / جامعة القادسية / العراق

مقالات ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى