تنظیم پارامترهای SVM با استفاده از GridSearchCV

بفرست برای دوستت
Telegram
WhatsApp
تنظیم پارامترهای SVM با استفاده از GridSearchCV

فهرست مطالب

در درس 43 ام از آموزش رایگان یادگیری ماشین با پایتون در دیتایاد می خواهیم در مورد تنظیم پارامترهای SVM با استفاده از GridSearchCV صحبت کنیم.

یک مدل یادگیری ماشین به عنوان یک مدل ریاضی با تعدادی پارامتر تعریف می‌شود که نیاز به یادگیری از داده‌ها دارد. با این حال، برخی پارامترها وجود دارند که به عنوان فراپارامتر (hyperparameter) شناخته می‌شوند و نمی‌توانند به طور مستقیم یاد گرفته شوند. این پارامترها معمولاً توسط انسان‌ها بر اساس برخی شهود یا آزمون و خطا قبل از شروع آموزش واقعی انتخاب می‌شوند

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

SVM نیز دارای برخی فراپارامترها است (مانند اینکه چه مقادیری برای C یا گاما استفاده شود) و یافتن بهینه‌ترین فراپارامتر کاری بسیار دشوار است. اما می‌توان آن را با امتحان کردن تمام ترکیبات و دیدن اینکه کدام پارامترها بهترین عملکرد را دارند، پیدا کرد.

ایده اصلی پشت این روش، ایجاد یک شبکه از فراپارامترها و امتحان کردن تمام ترکیبات آنها است (بنابراین، این روش Gridsearch نامیده می‌شود، اما نگران نباشید! ما نیازی به انجام آن به صورت دستی نداریم زیرا Scikit-learn این قابلیت را به صورت داخلی با GridSearchCV دارد).

  پیاده سازی رگرسیون خطی در پایتون

GridSearchCV یک دیکشنری را می‌گیرد که پارامترهایی را که می‌توان روی یک مدل برای آموزش آزمایش کرد، توصیف می‌کند. شبکه پارامترها به عنوان یک دیکشنری تعریف می‌شود، که کلیدهای آن پارامترها و مقادیر آن تنظیماتی هستند که قرار است آزمایش شوند.

این مقاله نشان می‌دهد که چگونه از روش جستجوی GridSearchCV برای یافتن بهترین فراپارامترها استفاده کنیم و در نتیجه دقت/نتایج پیش‌بینی را بهبود بخشیم.

 

وارد کردن کتابخانه‌ های ضروری و دریافت داده‌ها

ما از مجموعه داده‌های سرطان پستان داخلی Scikit Learn استفاده خواهیم کرد. می‌توانیم آن را با تابع بارگذاری دریافت کنیم.

 

import pandas as pd 
import numpy as np 
from sklearn.metrics import classification_report, confusion_matrix 
from sklearn.datasets import load_breast_cancer 
from sklearn.svm import SVC 

cancer = load_breast_cancer() 

# The data set is presented in a dictionary form: 
print(cancer.keys()) 
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

 

اکنون ما تمام ویژگی‌ها را به یک دیتافریم جدید استخراج خواهیم کرد و ویژگی‌های هدفمان را در دیتافریم‌های جداگانه قرار می‌دهیم.

 

df_feat = pd.DataFrame(cancer['data'], 
					columns = cancer['feature_names']) 

# cancer column is our target 
df_target = pd.DataFrame(cancer['target'], 
					columns =['Cancer']) 

print("Feature Variables: ") 
print(df_feat.info()) 

 

print("Dataframe looks like : ") 
print(df_feat.head()) 

 

تقسیم داده‌ها برای آموزش و تست

اکنون ما داده‌های خود را با نسبت ۷۰ به ۳۰ به دو بخش آموزش و تست تقسیم خواهیم کرد.

  رگرسیون سافت مکس (Softmax) با استفاده از Keras

 

from sklearn.model_selection import train_test_split 

X_train, X_test, y_train, y_test = train_test_split( 
						df_feat, np.ravel(df_target), 
				test_size = 0.30, random_state = 101) 

آموزش طبقه‌بند بردار پشتیبان بدون تنظیم فراپارامتر

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

 

# train the model on train set 
model = SVC() 
model.fit(X_train, y_train) 

# print prediction results 
predictions = model.predict(X_test) 
print(classification_report(y_test, predictions)) 

 

ما دقت ۶۱٪ را به دست آوردیم اما آیا چیز عجیبی متوجه نشدید؟

توجه کنید که بازیابی و دقت برای کلاس ۰ همیشه ۰ است. این به این معناست که طبقه‌بند همیشه همه چیز را در یک کلاس قرار می‌دهد، یعنی کلاس ۱! این بدان معناست که مدل ما نیاز به تنظیم پارامترهای خود دارد.

اینجاست که کاربرد GridSearch به تصویر می‌آید. ما می‌توانیم با استفاده از GridSearch به دنبال پارامترها بگردیم!

 

استفاده از GridsearchCV

یکی از نکات برجسته GridSearchCV این است که یک فرا-تخمین‌گر (meta-estimator) است. این ابزار یک تخمین‌گر مانند SVC را می‌گیرد و یک تخمین‌گر جدید ایجاد می‌کند، که دقیقاً به همان شکل رفتار می‌کند – در این مورد، مانند یک طبقه‌بند. شما باید refit=True را اضافه کنید و میزان verbose را به هر عددی که می‌خواهید انتخاب کنید، هرچه این عدد بالاتر باشد، verbose بیشتر است (verbose به معنای خروجی متنی است که فرآیند را توصیف می‌کند).

  استفاده از SVM برای دسته‌بندی در یک مجموعه داده غیرخطی

 

from sklearn.model_selection import GridSearchCV 

# defining parameter range 
param_grid = {'C': [0.1, 1, 10, 100, 1000], 
			'gamma': [1, 0.1, 0.01, 0.001, 0.0001], 
			'kernel': ['rbf']} 

grid = GridSearchCV(SVC(), param_grid, refit = True, verbose = 3) 

# fitting the model for grid search 
grid.fit(X_train, y_train) 

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

شما می‌توانید بهترین پارامترهای پیدا شده توسط GridSearchCV را در ویژگی best_params_ مشاهده کنید و بهترین تخمین‌گر را در best_estimator_ attribute بررسی کنید:

 

# print best parameter after tuning 
print(grid.best_params_) 

# print how our model looks after hyper-parameter tuning 
print(grid.best_estimator_) 

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

 

grid_predictions = grid.predict(X_test) 

# print classification report 
print(classification_report(y_test, grid_predictions)) 

ما تقریباً ۹۵٪ نتیجه پیش‌بینی به دست آورده‌ایم.

Rating 0.00 from 0 votes

لیست دروس دوره

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

اگر سوالی در مورد این درس دارید، در کادر زیر بنویسید.

اشتراک در
اطلاع از
guest
0 نظرات
قدیمی‌ترین
تازه‌ترین بیشترین رأی
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
سبد خرید

دوره رایگان یادگیری عمیق مقدماتی

برای دیدن نوشته هایی که دنبال آن هستید تایپ کنید.
×