در مورد grid search CV

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

ابتدا کتابخانه های مورد نظر را فراخوانی میکنیم:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

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

ستون مربوط به سن و دستمزد آنها را در X و خروجی مورد نظر (خرید یا عدم خرید) را در y میریزیم. اینجا فقط ستون 2 و 3 که از نوع عددی هستند را انتخاب میکنیم. اگر بخواهیم ستون یک (جنسیت ) را انتخاب کنیم ابتدا باید با استفاده از روش دامی آن را تبدیل کنیم. زیرا هدف ما فقط آموزش grid search cv است فقط با ستون 2 و 3 کار میکنیم.

# Importing the dataset
dataset = pd.read_csv('Advertising_data.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

با کد زیر دیتای خود را به دو دسته train و test تقسیم میکنیم:

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 5)

با دستور زیر دیتای خود را نرمال سازی میکنیم: (مشخصا از کتابخانه standard Scaler استفاده کرده ایم). دلیل این کار این است که دیتای ما از دو جنس است (سن و دلار) و این دو مورد در بازه های نامتناسب نسبت به هم قرار میگیرند. با نرمال سازی این موضوع حل میشود.

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()

X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

سوال : در کد بالا به چه دلیل فیت داشته ایم و به په دلیل transform ؟

با دستور زیر لگوریتم SVM را روی دیتای train خود فیت میکنیم.

# Fitting Kernel SVM to the Training set

from sklearn.svm import SVC
classifier = SVC(kernel = 'linear', random_state = 0)
classifier.fit(X_train, y_train)

تا اینجا از SVC با پارامترهای پیشفرض استفاده کرده ایم. اما باید بدانیم که مقادیر پیشفرض پارامترها همیشه ما را به بهترین جواب نمیرسانند. بنابراین میخواهیم مقادیر پیش فرض را تغییر دهیم و نتیجه را مشاهده مکنیم.

کرنل ممکن است یکی از موارد زیر باشد:

{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}

که ما از حالت linear آن استفاده میکنیم.

با دستورزیر میخواهیم ببینیم اگر ورودی xtest را دادیم چه نتایجی مشاهده خواهیم کرد:

# Predicting the Test set results
y_pred = classifier.predict(X_test)

حال می خواهیم با استفاده از ماتریس پیچیدگی میزان دقت مدل خود را بررسی کنیم:

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

همچنین acuracy score را میخواهیم بررسی کنیم:

from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y_test,y_pred)
accuracy

که در نتیجه عدید 0.85 را بدست می آوریم که قابل قبول به نظر میرسد. اما در ادامه خواهیم دید که با تغییر پارامترها میتوانیم این مقدار را افزایش دهیم.

Grid Search

میخواهیم بهترین مدل و بهترین پارامتر ها را با استفاه از grid Search بدست بیاوریم.

اگر shift+ tab را بزنیم خواهیم دید که اولین پارامتر برابر با estimator است. و مربوط به مدلی است که انتخاب کرده ایم. (در مورد این مسئله svc)

مورد بعدی parameter grid است. و عبارت است از ماتریسی از تمام حالتهای پارامترهای مورد استفاده در مدل انتخابی (svc). در مورد svc این پارامترها به شرح زیر هستند: (که C و کرنل و گاما در آن مشاهده میشود.)

(*, C=1.0, kernel=’rbf’, degree=3, gamma=’scale’, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=’ovr’, break_ties=False, random_state=None)

C مروبط به امتیاز پنالتی است

این موارد باید در قالب key وvalue به grid داده شود.(آنچه که ما با عنوان parameters داده ایم. ) در واقع یک دیکشنری است.

برای مثال در کد زیر میگوییم زمانی که ‘C’: [1, 10, 100, 1000] باشد ، آنگاه کرنل در حالت linear قرار گیرد و در حالتی که کرنل روی rbf باشد، پارامتر گاما موارد gamma’: [0.1, 0.2, 0.3, 0.4, 0.5 باشد.ر

parameters = [{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
              {'C': [1, 10, 100, 1000], 'kernel': ['rbf'], 'gamma': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]}]

و در کد زیر یک شی تعریف میکنیم که در آن مشخصات grid را تعیین میکنیم:

میگوییم که از مدل classifier استفاده کند و param_grid همان چیزی باشد که در parameters اورده شده است و scoring را بر اساس accuracy در نظر بگیرد و cv = 10 همان طور که قبلا توضیح داده شد مربوط به Cross validation است. سی وی = ده یعنی ده بار سمپل گرفته میشود و هر بار مقدار دقت محاسبه میشود. و میانگین گرفته میشود در آخر.

و مورد n_jobs = -1 دارد میگوید که تمام توان cpu کامپیوتر به کار گرفته شود. (در صورت عدم استفاده از پلتفرم آنلاین مثل گوگل کولب)

grid_search = GridSearchCV(estimator = classifier,
                           param_grid = parameters,
                           scoring = 'accuracy',
                           cv = 10,
                           n_jobs = -1)

و در نهایت روی داده های خود فیت میکنیم:

grid_search = grid_search.fit(X_train, y_train)

با دستور زیر بهترین امتیاز را برابر با 0.91 مشاهده میکنیم:

accuracy = grid_search.best_score_
accuracy

نتیجه کد زیر بهترین پارامتر ها را به ما نشان میدهد:

grid_search.best_params_

در کد زیر classifier را تعریف میکنیم. که svc باشد و با مشخصات ذکر شده. و روی داده train و test خود فیت میکنیم.

classifier = SVC(kernel = 'rbf', gamma=0.7)
classifier.fit(X_train, y_train)

در کد زیر داده x_test را به مدل خود میدهیم تا پیش بینی صورت بگیرد:

# Predicting the Test set results
y_pred = classifier.predict(X_test)

در کد زیر ماتریس پیچیدگی را تعریف کرده ایم:

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

و در نهایت مقدار accuracy را بدست آورده ایم:

from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y_test,y_pred)
accuracy

نکته:

1- ما در این درس تنها دو پارامتر C و کرنل را در param_grid قرار دادیم. هدف فقط آموزش بود. در صورتی که میتوانستیم تعداد پارامترهای بیشتری را آزمایش کنیم(در param_grid قرار دهیم). طبیعتا مقدار محاسبات و توان مصرفی مورد نیاز افزایش خواهد یافت.

2- روش grid search را روی هر الگوریتم ماشین لرنینگ میتوان اجرا نمود. و تنها چیزی که مهم است تعیین پارامترهای Param_grids است.

منابع:

1- ویدئو کریش

2- گیت هاب strumer

3- گیتهاب کریش

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.