تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

راهنمای جامع استفاده از جستجوی شبکه‌ای Grid Search در پایتون python


۲۰ فروردین ۱۴۰۴

هر مدل یادگیری ماشین برای رسیدن به بهترین عملکرد، به تنظیمات دقیقی نیاز دارد. این تنظیمات همان هایپر پارامترهایی هستند که می‌تواند عملکرد مدل را به شدت تحت تاثیر قرار دهد. جست و جوی شبکه‌ای یا همان Grid Search که مانند یک جست و جوی همه جانبه است تمامی ترکیب‌های ممکن را از این تنظیمات امتحان کرده و بهترین نتیجه را انتخاب می‌کند.

در این آموزش از لیارا با نحوه پیاده سازی Grid Search و مقایسه آن با سایر روش‌ها آشنا خواهید شد تا بتوانید مدل‌های خود را به بهترین شکل ممکن بهینه کنید.

آنچه در ادامه خواهید خواند:

  • Grid Search در پایتون چیست؟
  • Grid Search چگونه کار می‌کند؟
  • پیاده سازی Grid Search در پایتون
  • تصویر سازی بهترین هایپر پارامترها
  • جست و جو شبکه ای Grid Search در مقابل جست و جوی تصادفی
  • چه زمانی می توانیم از جست و جوی شبکه ای استفاده کنیم؟
  • چه زمانی می توانیم از جست و جوی تصادفی استفاده کنیم؟
  • سوالات متداول
  • جمع بندی

هاست Python در لیارا، هاستی پرسرعت و بدون نیاز به پیکربندی و انجام تنظیمات!
✅ استقرار سریع و آسان ✅ پشتیبانی از فریم‌ورک‌های مختلف ✅ عملکرد پایدار
خرید هاست Python

Grid Search در پایتون چیست؟

در یادگیری ماشین، هایپر پارامترها تنظیماتی هستتند که قبل از آموزش مدل انتخاب می‌شوند. به عنوان مثال هایر پارمترها شامل نرخ یادگیری (learning rate)، اندازه بچ (batch size) و تعداد لایه های مخفی در شبکه‌های عصبی هستند.

انتخاب ترکیب درست هایپر پارامترها می‌تواند تاثیر زیادی بر عملکرد مدل داشته باشد. Grid Search یا همان جست و جو شبکه ای به شما کمک می‌کند که بهترین تنظیمات هایپر پارمترها را برای مدل تان پیدا کنید. در این روش، شما یک مجموعه از مقادیر مختلف برای هر هایپرپارامتر (به عنوان مثال نرخ یادگیری یا تعداد لایه ها) مشخص خواهید کرد.

بعد از این که مقادیر را تعیین کردید، Grid Search تمام ترکیب های ممکن از این مقادیر را به صورت سیستماتیک امتحان می‌کند. این به این معنی است که که باید برای نرخ یادگیری و تعداد لایه ها دو مقدار مجزا را در اختیار داشته باشید. Grid Search تمام ترکیب های ممکن این دو را آزمایش می‌کند (برای مثال رخ یادگیری 01. با تعداد لایه ها 3، یا نرخ یادگیری 0.01 با تعداد لایه ها 5 و غیره).

هدف این است که با آزمایش تمام ترکیب ها، بهترین ترکیب را پیدا کرده و عملکرد مدل را به بیشترین حد ممکن برساند. در واقع، Grid Search این اجازه را می‌دهد که بدون هیچ حدس و گمانی بهترین تنظیمات را برای مدل تان پیدا کنید.

Grid Search در پایتون

Grid Search چگونه کار می‌کند؟

فرآیند جست و جو شبکه ای را می توان به مراحل زیر تقسیم بندی کرد و آن ها را شناخت.

تعریف مجموعه ای از مقادیر هایپر پارامترها برای مدل

این محدوده مقادیر است که جست و جوی شبکه ای را برای هر هایپر پارامتر در نظر می‌گیرد. به عنوان مثال، اگر شما در حال تنظیم نرخ یادگیری یک شبکه عصبی هستید، ممکن است که محدوده‌ای از مقادیر را از 0.001 تا 0.1 را تعریف کنید.

آموزش مدل با تمام ترکیب ها از این هایپر پارامترها

بعد از جست و جو شبکه ای، مدل را با هر ترکیب ممکن از هایپر پارامترها در داخل محدوده تعریف شده آموزش می‌دهد. به عنوان مثال، اگر 3 هایپر پارامتر داشته باشید و هر کدام 5 مقدار ممکن را داشته باشد، جست و جوی شبکه ای مدل را 5^3 = 125 بار آمورش می‌دهد

بررسی عملکرد با استفاده از اعتبار سنجی متقابل

بعد از آموزش مدل با هر ترکیب از هایپر پارامترها، جست و جوی شبکه ای عملکرد مدل را با استفاده از اعتبار سنجی متقابل ارزیابی می‌کند. این یک تکنیکی است که برای ارزیابی نحوه تعمیم مدل به یک مجموعه داده مستقل از آن استفاده می‌شود.

انتخاب بهترین ترکیب هایپر پارامتر ها بر اساس معیار های عملکرد

جست و جوی شبکه ای ترکیب هایپر پارامترهایی را انتخاب می‌کند که بهترین عملکرد را به دست آورده باشند. معمولا با انتخاب ترکیبی انجام می‌شود که بالاترین دقت را در این زمینه به دست بیاورد، اما می‌توانید بر اساس سایر معیارهای عملکرد مانند دقت، باز خوانی یا امتیاز F1 نیز انتخاب شود.

📍مطالعه بیشتر: چگونه یک اسکریپت پایتون را در اوبونتو اجرا کنیم

جدول زیر نحوه عملکرد جست و جو شبکه ای را نشان می‌دهد.

هایر پارامتر 1 هایر پارامتر 2 هایر پارامتر 3 عملکرد
مقدار: 1 مقدار: 1 مقدار: 10.85
مقدار: 1 مقدار: 1 مقدار: 2 0.82
مقدار: 2 مقدار: 2 مقدار: 2 0.88
مقدار: Nمقدار: Nمقدار: N0.79

در این جدول، هر ردیف نشان می‌دهد که یک ترکیب مختلف از هایپر پارامترها چگونه است و ستون آخر عملکرد مدل را نشان می‌دهد. هدف از جست و جوی شبکه ای این است که ترکیب هایپر پارامترهایی را پیدا کنیم که بالاترین عملکرد را داشته باشند.

پیاده سازی Grid Search در پایتون

در این بخش جست و جوی شبکه‌ای را در پایتون یاد خواهید گرفت. برای این کار می‌توانید از کلاس GridSearchCV از کتابخانه scikit-learn استفاده کنید.

مرحله اول: وارد کردن کتابخانه ها

برای این کار باید کتابخانه های مورد نیاز را وارد کنیم. برای مدل SVM و جست و جوی شبکه ای از scikit-learn استفاده خواهیم کرد و برای دستکاری داده ها از numpy بهره خواهیم برد.

import numpy as np
from sklearn import svm
from sklearn.model_selection import GridSearchCV

مرحله دوم: بارگذاری داده ها

در این مرحله، داده ها را بارگذای خواهیم کرد. به عنوان مثال از داده های Iris که دیتابس معروف در یادگیری ماشین است، استفاده خواهیم کرد.

from sklearn import datasets
iris = datasets.load_iris()
# Inspect the dataset
print("Dataset loaded successfully.")
print("Dataset shape:", iris.data.shape)
print("Number of classes:", len(np.unique(iris.target)))
print("Class names:", iris.target_names)
print("Feature names:", iris.feature_names)
Output
Dataset loaded successfully.
Dataset shape: (150, 4)
Number of classes: 3
Class names: ['setosa' 'versicolor' 'virginica']
Feature names: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

داده ها با موفقیت بارگذاری شده‌اند. تعداد نمونه ها 150 و ویژگی ها 4 عدد هستند. همچنین، 3 کلاس مختلف در داده ها وجود دارد که از آن ها استفاده خواهیم کرد.

مرحله سوم: تعریف مدل و هایپر پارامترها

در این قسمت قصد داریم که مدل SVM را تعریف کنیم و هایپر پارامترهایی را تنظیم و مشخص کنیم. برای مدل SVM، شما باید هایپر پارامتر های kernel و C را تنظیم کنید.

# This code block initializes a Support Vector Machine (SVM) model and defines a parameter grid for hyperparameter tuning.
# The SVM model is created using the svm.SVC() function from the scikit-learn library.
# The parameter grid is a dictionary that specifies the hyperparameters to be tuned and their possible values.
# In this case, the hyperparameters are 'C' (regularization parameter) and 'kernel' (type of kernel to use).
# The values for 'C' are [1, 10, 100, 1000], indicating that the model will be trained with these different regularization strengths.
# The values for 'kernel' are ['linear', 'rbf'], indicating that the model will be trained with both linear and radial basis function (RBF) kernels.
model = svm.SVC()
param_grid = {'C': [1, 10, 100, 1000], 'kernel': ['linear', 'rbf']}

مرحله چهارم: اجرای جست و جوی شبکه ای Grid Search

در این قسمت با استفاده از کلاس GridSearchCV از scikit-learn آن را اجرا خواهیم کرد. هدف اصلی از جست و جو شبکه ای پیدا کردن بهترین هایپر پارامترها برای مدل ها است. با امتحان تمام ترکیب های ممکن، از هایپر پارامترهای مشخص شده و ارزیابی عملکرد آن ها با استفاده از اعتبار سنجی متقابل این کار را انجام خواهید داد.

از اعتبار سنجی متقابل با 5 فولد (cv=5) استفاده خواهیم کرد تا عملکرد هر ترکیب را به صورت کامل ارزیابی کنیم. یعنی که داده ها به 5 زیر مجموعه تقسیم می شوند و مدل بر روی هر زیر مجموعه ارزیابی می‌شود. عملکرد متوسط در این زیر مجموعه ها برای تعیین بهترین هایپر پارامتر ها استفاد می‌شود.

 
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(iris.data, iris.target)

در این کد، یک شی GridSearchCV با پرامترهای زیر را خواهیم ساخت.

  • model: مدل SVM که قبلاً تعریف شده است.
  • param_grid: دیکشنری هایپرپارامترهایی که باید تنظیم شوند و مقادیر ممکن آن‌ها را مشخص می‌کند.
  • cv=5: تعداد فولدها برای اعتبارسنجی متقابل.

سپس با استفاده از متد fit، جست‌وجوی شبکه‌ای شروع می‌شود. در این مرحله، مدل با هر ترکیب از هایپرپارامترها آموزش داده می‌شود و عملکرد آن ارزیابی می‌شود تا بهترین مجموعه هایپرپارامترها انتخاب شود.

مرحله پنجم: مشاهده نتایج کار

در این مرحله دیگر می‌توانید نتیجه کارتان را ببینید. بهترین هایپر پارامترها و امتیاز دقت مربوطه نمایش داده خواهند شد.

print("Best hyperparameters: ", grid_search.best_params_)
print("Best accuracy: ", grid_search.best_score_)

در این کد می‌توان با استفاده از best_params_ بهترین هایپر پارامتر جست و جوی شبکه ای را پیدا کرد. همچنین با استفاده از best_score_، بالاترین امتیاز دقت که مدل با بهترین پارامتر ها را به دست آورده است را مشاهده خواهید کرد.

🔶برای ادامه مطالعه و یادگیری: بهترین هاست پایتون ایران و خارج چیست؟

تصویر سازی بهترین هایپر پارامترها


# Visualizing the best hyperparameters
import matplotlib.pyplot as plt
import numpy as np

C_values = [1, 10, 100, 1000]
kernel_values = ['linear', 'rbf']
scores = grid_search.cv_results_['mean_test_score'].reshape(len(C_values), len(kernel_values))

plt.figure(figsize=(8, 6))
plt.subplots_adjust(left=.2, right=0.95, bottom=0.15, top=0.95)
plt.imshow(scores, interpolation='nearest', cmap=plt.cm.hot)
plt.xlabel('kernel')
plt.ylabel('C')
plt.colorbar()
plt.xticks(np.arange(len(kernel_values)), kernel_values)
plt.yticks(np.arange(len(C_values)), C_values)
plt.title('Grid Search Mean Test Scores')
plt.show()

برای نمایش نتایج به صورت بصری، می‌توانید از نمودار استفاده کنید. این کد زیر نتایج را به صورت تصویری نشان می‌دهد.

Output
Best hyperparameters:  {'C': 1, 'kernel': 'linear'}
Best accuracy:  0.9800000000000001

بهترین مقدار برای هایپر پارامتر C برابر با 1 است، که قدرت منظم سازی مدل را کنترل می‌کند. مقدار کوچک تر C به معنی منظم سازی قوی تر است. بهترین مقدار برای هایپر پارامتر kernel و linear مقدار C است که نوع هسته ای آن باید در الگوریتمی که استفاده می‌شود مشخص شود.

  • در این جا، دقت به دست آمده به این هایپر پتارامتر ها برابر یا 0.
  • 98 است، که نشان می‌دهد مدل 98% از نمونه ها را به درستی پیش بینی می‌کند.

جست و جو شبکه ای Grid Search در مقابل جست و جوی تصادفی

یکی دیگر از تکینک های محبوب تنظیم هایپر پارامتر، جست و جوی تصادفی است که به جای امتحان تمام ترکیب های ممکن، ترکیب های هایپر پرامترها را به صورت تصادفی انتخاب می‌کند.

ویژگی:جست و جو شبکه ای Grid Searchجست‌وجوی تصادفی Random Search
روش جست و جو:جست و جوی کامل تمام ترکیب های ممکن انتخاب تصادفی ترکیب های هایپر پارامتر
هزینه محاسباتی:بالا است و به دلیل جست و جوی کامل ممکن است گران باشدپایین تر به دلیل نمونه برداری تصادفی
دقت:دقت بیشتری را دارد، اما ممکن است بیش برازش شودبرای فضا های هایپر پارامتر بزرگ که جست و جوی کامل عملی نیست
بهترین حالت استفاده:بهترین برای فضای هایپر پارامتر کوچک تا متوسط که جست و جوی کامل ممکن استبرای تنظیم تعداد زیادی هایپر پارامتر
پیچیدگی مدل:بیشتر برای مدل های ساده با هایپر پارامترهای کم مناسب استبیشتر برای مدل های پیچیده با هایر پارامتر ها استفاده می‌شود
تنظیم هایپر پارامتر:مناسب برای مدل های ساده با هایپر پارامترهای کممناسب برای تنظیم تعداد زیادی هایپر پارامتر
پیچیدگی زمانی:بیشتر پیچیدگی زمانی نسبتا ثابت است بدون توجه به تعداد هایپر پارامترها

این جدول به شما کمک می‌کند که تفاوت ها و کاربردهای جست و جوی شبکه ای و جست و جو تصادفی را بهتر بشناسید.

rom sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load dataset and split into training and test sets
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# Define the parameter grid
param_distributions = {'C': [1, 10, 100, 1000], 'kernel': ['linear', 'rbf']}

# Initialize the RandomizedSearchCV object
random_search = RandomizedSearchCV(SVC(), param_distributions=param_distributions, n_iter=5, cv=5, scoring='accuracy', random_state=42)

# Fit the model
random_search.fit(X_train, y_train)

# Print the best parameters
print("Best Parameters:", random_search.best_params_)
Best Parameters: {'kernel': 'linear', 'C': 1}

🔷بیشتر بخوانید: نحوه اتصال به سرور مجازی با استفاده از WebSSH در پایتون Python

چه زمانی می توانیم از جست و جوی شبکه ای استفاده کنیم؟

  • فضای هایپر پارامتر کوچک: اگر تعداد هایپر پارامترها و مقادیر ممکن آن ها محدود باشد، جست و جوی شبکه ای نیز می‌تواند به صورت کار آمدتر تمامی ترکیبات را بررسی کند.
  • منابع محاسباتی فراوان: از آنجایی که جست و جوی شبکه ای به محاسبات زیادی نیاز دارد، برای زمانی که به سخت افزار قدرتمند یا منابع ابری دسترسی دارید مناسب است.
  • دقت بالا: جست و جوی شبکه ای می‌تواند دقت بالاتری را بدست آورد زیرا تمام ترکیب ها را به دقت بررسی می‌کند، بنابراین برای کاربردهایی که عملکرد آن بسیار مهم است مناسب می‌باشد.
  • مدل ساده: جست و جوی شبکه ای با مدل های ساده که هایپر پارامترهای کمتری دارند بهتر کار می‌کند، زیرا جست و جوی کامل همچنان امکان پذیر است.
تصویر سازی بهترین هایپر پارامترها

چه زمانی می توانیم از جست و جوی تصادفی استفاده کنیم؟

  • فضای هایپر پارمتر بزرگ: برای مدل هایی که به تعداد زیادی هایپر پارامتر یا محدوده های وسیعی از مقادیر نیاز دارند بسیار مناسب است.
  • منابع محاسباتی محدود: جست و جوی تصادفی از آن جایی که نیاز به محاسبات کمتری دارد، برای سناریوهایی که منابع سخت افزاری یا زمان محدود می‌باشد، مناسب است.
  • نتایج سریع تر: اگر به نتایج سریع تر نیاز داشته اید و مایل بودید که دقت کمی کاهش پیدا کند. جست و جوی تصادفی را می‌توانید انتخاب کنید. جست و جو تصادفی تعادل خوبی را بین عملکرد و هزینه محاسباتی فراهم می‌کند.

سوالات متداول:

در ادامه به سوالاتی که امکان دارد در این زمینه برای شما بدون پاسخ بماند، جواب‌های کوتاه اما مفیدی داده‌ایم که با استفاده از آن می‌توانید به سوال خود پاسخ صحیحی را بدهید.

جست‌ و جوی شبکه‌ای Grid Search چیست و چه کاربردی در یادگیری ماشین دارد؟

Grid Search یا جست‌وجوی شبکه‌ای روشی برای تنظیم هایپرپارامترهای مدل است که تمام ترکیب‌های ممکن از مقادیر مشخص‌شده را بررسی می‌کند تا بهترین ترکیب را پیدا کند. این روش مخصوصا در یادگیری ماشین برای بهینه‌سازی عملکرد مدل بسیار مفید است.

چگونه از GridSearchCV در کتابخانه Scikit-learn برای تنظیم هایپر پارامترها استفاده کنیم؟

برای استفاده از GridSearchCV در Scikit-learn، مراحل زیر را انجام دهید:

  1. مدل موردنظر را تعریف کنید.
  2. مجموعه‌ای از مقادیر ممکن برای هایپرپارامترها را مشخص کنید.
  3. از کلاس GridSearchCV برای انجام جست‌وجوی شبکه‌ای استفاده کنید.
  4. مدل را با داده‌ها آموزش دهید و بهترین ترکیب را مشاهده کنید.
from sklearn.model_selection import GridSearchCV
from sklearn import svm, datasets

iris = datasets.load_iris()
model = svm.SVC()
param_grid = {'C': [1, 10, 100], 'kernel': ['linear', 'rbf']}

grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(iris.data, iris.target)

print("Best parameters:", grid_search.best_params_)

تفاوت بین جست‌ و جوی شبکه‌ ای و جست‌ و جوی تصادفی چیست؟

تفاوت اصلی این دو روش در نحوه جست‌وجوی مقادیر هایپرپارامترها است:

  • Grid Search: تمام ترکیب‌های ممکن را بررسی می‌کند و زمان اجرای بالایی دارد.
  • Random Search: به صورت تصادفی برخی از ترکیب‌ها را انتخاب می‌کند که سرعت بالاتری دارد اما ممکن است بهترین مقدار را پیدا نکند.

چه زمانی باید از Grid Search و چه زمانی باید از Random Search استفاده کنیم؟

  • Grid Search: زمانی که تعداد هایپرپارامترها کم است و توان محاسباتی کافی دارید.
  • Random Search: زمانی که تعداد هایپرپارامترها زیاد است و نمی‌خواهید تمام ترکیب‌ها را بررسی کنید.

چگونه می‌توان زمان اجرای جست‌وجوی شبکه‌ای را بهینه کرد؟

برای کاهش زمان اجرای Grid Search می‌توانید:

  • تعداد مقادیر در محدوده‌های هایپرپارامترها را کاهش دهید.
  • از cross-validation با تعداد fold کمتر (مثلاً ۳ به‌جای ۵ یا ۱۰) استفاده کنید.
  • روش RandomizedSearchCV را به‌جای Grid Search امتحان کنید.
  • پردازش موازی (Parallel Processing) را فعال کنید:
grid_search = GridSearchCV(model, param_grid, cv=5, n_jobs=-1)

آیا Grid Search همیشه بهترین روش برای پیدا کردن هایپر پارامترهای بهینه است؟

خیر، Grid Search همیشه بهترین روش نیست. در بسیاری از موارد، Random Search یا Bayesian Optimization نتایج بهتری را در زمان کوتاه‌تری ارائه می‌دهند.

چگونه می‌توان از روش‌ های موازی‌ سازی برای سریع‌ تر کردن Grid Search استفاده کرد؟

می‌توانید از پردازش موازی (Parallel Processing) با استفاده از n_jobs=-1 در GridSearchCV استفاده کنید:

grid_search = GridSearchCV(model, param_grid, cv=5, n_jobs=-1)

این کار باعث می‌شود که از تمام هسته‌های پردازنده استفاده شود و زمان اجرا کاهش یابد.

👈🏻بیشتر بخوانید: مقدمه‌ای بر تابع enumerate در Python

جست و جوی تصادفی

جمع بندی

Grid Search یک روش دقیق برای پیدا کردن بهترین هایپرپارامترها است، اما ممکن است زمان‌بر باشد. اگر تعداد هایپرپارامترها زیاد باشد، روش‌های سریع‌تری مانند Random Search یا Bayesian Optimization ممکن است گزینه‌های بهتری باشند. از تمامی روش ها می‌توانید مدل های خود را آموزش داده و عملکرد آن را ارزیابی کنید و بهترین مجموعه هایپر پارامترها ها را انتخاب کنید.

به اشتراک بگذارید

برچسب‌ها: