شعار زيفيرنت

ضبط المعلمة الفائقة: شرح GridSearchCV وRandomizedSearchCV - KDnuggets

التاريخ:

ضبط المعلمة الفائقة: شرح GridSearchCV وRandomizedSearchCV
صورة المؤلف
 

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

بالإضافة إلى ذلك، تحتوي نماذج التعلم الآلي أيضًا على مجموعة من المعلمات الفائقة. مثل قيمة K، عدد الجيران، في خوارزمية K-Nearest Neighbors. أو حجم الدفعة عند تدريب شبكة عصبية عميقة، والمزيد.

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

تتضمن تقنيات ضبط المعلمات الفائقة الأكثر شيوعًا ما يلي:

  • بحث الشبكة
  • بحث عشوائي

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

لنبدأ بتدريب بسيط دعم مصنف آلة المتجهات (SVM). في مجموعة بيانات النبيذ. 

أولاً، قم باستيراد الوحدات والفئات المطلوبة: 

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

 

تعد مجموعة بيانات النبيذ جزءًا من مجموعات البيانات المضمنة في scikit-learn. لذلك دعونا نقرأ الميزات والتسميات المستهدفة كما هو موضح:

# Load the Wine dataset
wine = datasets.load_wine()
X = wine.data
y = wine.target

 

مجموعة بيانات النبيذ عبارة عن مجموعة بيانات بسيطة تحتوي على 13 ميزة رقمية وثلاثة تصنيفات لفئة الإخراج. إنها مجموعة بيانات مرشحة جيدة لتعلم طريقك للتغلب على مشكلات التصنيف متعددة الفئات. يمكنك الجري wine.DESCR للحصول على وصف لمجموعة البيانات.

 

ضبط المعلمة الفائقة: شرح GridSearchCV وRandomizedSearchCV
إخراج النبيذ.DESCR 
 

بعد ذلك، قم بتقسيم مجموعة البيانات إلى مجموعات تدريب واختبار. لقد استخدمنا هنا أ test_size من 0.2. لذا فإن 80% من البيانات تذهب إلى مجموعة بيانات التدريب و20% إلى مجموعة بيانات الاختبار.

# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=24)

 

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

# Create a baseline SVM classifier
baseline_svm = SVC()
baseline_svm.fit(X_train, y_train)
y_pred = baseline_svm.predict(X_test)

 

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

# Evaluate the baseline model
accuracy = accuracy_score(y_test, y_pred)
print(f"Baseline SVM Accuracy: {accuracy:.2f}")

 

نرى أن درجة دقة هذا النموذج مع القيم الافتراضية للمعلمات الفائقة تبلغ حوالي 0.78. 

Output >>>
Baseline SVM Accuracy: 0.78

 

هنا استخدمنا أ random_state من 24. بالنسبة لحالة عشوائية مختلفة، ستحصل على تقسيم مختلف لاختبار التدريب، وبالتالي درجة دقة مختلفة.

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

بعد ذلك، دعونا نحدد المعلمات الفائقة التي يمكننا ضبطها لمصنف جهاز ناقل الدعم هذا.

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

  • C: معلمة التنظيم، التي تتحكم في المفاضلة بين تعظيم الهامش وتقليل خطأ التصنيف.
  • نواة: يحدد نوع وظيفة kernel المراد استخدامها (على سبيل المثال، 'خطي،' 'rbf،' 'poly').
  • نطاق: معامل النواة للنواة "rbf" و"poly".

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

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

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

كيف يعمل بحث الشبكة

نحدد مساحة بحث المعلمات الفائقة كشبكة معلمات. ال شبكة المعلمة عبارة عن قاموس يمكنك من خلاله تحديد كل معلمة تشعبية تريد ضبطها باستخدام قائمة من القيم لاستكشافها. 

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

بعد ذلك، دعونا ننفذ بحث الشبكة في scikit-learn.

أولاً ، قم باستيراد ملف GridSearchCV فئة من scikit-Learn's model_selection وحدة:

from sklearn.model_selection import GridSearchCV

 

دعونا نحدد شبكة المعلمات لمصنف SVM:

# Define the hyperparameter grid
param_grid = { 'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf', 'poly'], 'gamma': [0.1, 1, 'scale', 'auto']
}

 

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

  • C اضبط على 0.1 و1 و10،
  • kernel تم ضبطه على "خطي" و"rbf" و"بولي" و
  • gamma تم ضبطه على 0.1 و1 و"مقياس" و"تلقائي".

وينتج عن هذا إجمالي 3 * 3 * 4 = 36 مجموعة مختلفة للتقييم. يقوم بحث الشبكة بملاءمة وتقييم النموذج لكل مجموعة باستخدام التحقق المتبادل واختيار المجموعة التي تحقق أفضل أداء.

ثم نقوم بإنشاء مثيل GridSearchCV لضبط المعلمات الفائقة لـ baseline_svm:

# Create the GridSearchCV object
grid_search = GridSearchCV(estimator=baseline_svm, param_grid=param_grid, cv=5) # Fit the model with the grid of hyperparameters
grid_search.fit(X_train, y_train)

 

لاحظ أننا استخدمنا التحقق المتبادل بخمسة أضعاف. 

أخيرًا، نقوم بتقييم أداء أفضل نموذج - مع المعلمات الفائقة المثالية التي تم العثور عليها من خلال بحث الشبكة - على بيانات الاختبار:

# Get the best hyperparameters and model
best_params = grid_search.best_params_
best_model = grid_search.best_estimator_ # Evaluate the best model
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"Best SVM Accuracy: {accuracy_best:.2f}")
print(f"Best Hyperparameters: {best_params}")

 

كما رأينا، يحقق النموذج درجة دقة قدرها 0.94 للمعلمات الفوقية التالية:

Output >>>
Best SVM Accuracy: 0.94
Best Hyperparameters: {'C': 0.1, 'gamma': 0.1, 'kernel': 'poly'}

يتمتع استخدام بحث الشبكة لضبط المعلمة الفائقة بالمزايا التالية:

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

لكن على الجانب الآخر:

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

الآن دعونا نتعرف على البحث العشوائي.

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

كيف يعمل البحث العشوائي 

في البحث العشوائي، بدلاً من تحديد شبكة من القيم، يمكنك تحديد التوزيعات الاحتمالية أو النطاقات لكل معلمة تشعبية. والتي تصبح مساحة بحث أكبر بكثير.

البحث العشوائي بعد ذلك عينات عشوائية عدد ثابت من مجموعات المعلمات الفائقة من هذه التوزيعات. يتيح ذلك البحث العشوائي لاستكشاف مجموعة متنوعة من مجموعات المعلمات الفائقة بكفاءة.

الآن دعونا نضبط معلمات مصنف SVM الأساسي باستخدام البحث العشوائي.

نحن نستورد RandomizedSearchCV فئة وتحديد param_dist، مساحة بحث أكبر بكثير للمعلمات الفائقة:

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform param_dist = { 'C': uniform(0.1, 10), # Uniform distribution between 0.1 and 10 'kernel': ['linear', 'rbf', 'poly'], 'gamma': ['scale', 'auto'] + list(np.logspace(-3, 3, 50))
}

 

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

# Create the RandomizedSearchCV object
randomized_search = RandomizedSearchCV(estimator=baseline_svm, param_distributions=param_dist, n_iter=20, cv=5) randomized_search.fit(X_train, y_train)

 

نقوم بعد ذلك بتقييم أداء النموذج باستخدام أفضل المعلمات الفائقة التي تم العثور عليها من خلال البحث العشوائي:

# Get the best hyperparameters and model
best_params_rand = randomized_search.best_params_
best_model_rand = randomized_search.best_estimator_ # Evaluate the best model
y_pred_best_rand = best_model_rand.predict(X_test)
accuracy_best_rand = accuracy_score(y_test, y_pred_best_rand)
print(f"Best SVM Accuracy: {accuracy_best_rand:.2f}")
print(f"Best Hyperparameters: {best_params_rand}")

 

أفضل الدقة والمعلمات الفائقة المثالية هي:

Output >>>
Best SVM Accuracy: 0.94
Best Hyperparameters: {'C': 9.66495227534876, 'gamma': 6.25055192527397, 'kernel': 'poly'}

 

تختلف المعلمات التي تم العثور عليها من خلال البحث العشوائي عن تلك التي تم العثور عليها من خلال بحث الشبكة. يحقق النموذج الذي يحتوي على هذه المعلمات الفائقة أيضًا درجة دقة تبلغ 0.94.

دعونا نلخص مزايا البحث العشوائي:

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

فيما يلي بعض قيود البحث العشوائي:

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

لقد تعلمنا كيفية إجراء ضبط المعلمة الفائقة باستخدام RandomizedSearchCV و GridSearchCV في scikit-تعلم. قمنا بعد ذلك بتقييم أداء نموذجنا باستخدام أفضل المعلمات الفائقة. 

باختصار، يبحث بحث الشبكة بشكل شامل في جميع المجموعات الممكنة في شبكة المعلمات. بينما يقوم البحث العشوائي بأخذ عينات عشوائية من مجموعات المعلمات الفائقة.

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

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

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة