در درس 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())
تقسیم دادهها برای آموزش و تست
اکنون ما دادههای خود را با نسبت ۷۰ به ۳۰ به دو بخش آموزش و تست تقسیم خواهیم کرد.
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 به معنای خروجی متنی است که فرآیند را توصیف میکند).
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))
ما تقریباً ۹۵٪ نتیجه پیشبینی به دست آوردهایم.