وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

الگوریتم بهینه سازی جستجو گرید در پایتون

0 86
زمان لازم برای مطالعه: 5 دقیقه


معرفی

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

پیش نیازها

برای دنبال کردن این آموزش، باید درک اولیه ای از پایتون یا برخی از زبان های برنامه نویسی دیگر داشته باشید. ترجیح داده می شود، اما ضروری نیست، که دانش اولیه در مورد یادگیری ماشین نیز داشته باشید. به غیر از آن، این مقاله برای مبتدیان است و همه می توانند آن را دنبال کنند.

نصب و راه اندازی

برای انجام این آموزش، باید کتابخانه ها/فریم ورک های زیر را در سیستم خود نصب کنید:

  1. پایتون 3
  2. NumPy
  3. پانداها
  4. کراس
  5. Scikit-Learn

نصب همه آنها بسیار ساده است – می توانید کلیک کنید روی هر کدام به وب سایت های مربوطه خود که در آن دستورالعمل های نصب دقیق ارائه شده است بروید. به طور کلی، بسته ها را می توان با استفاده از آن نصب کرد pip:

$ pip install numpy pandas tensorflow keras scikit-learn

اگر با مشکلی مواجه شدید، لطفاً به اسناد رسمی هر بسته مراجعه کنید.

Grid Search چیست؟

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

بیایید فرض کنیم که مدل شما سه پارامتر زیر را به عنوان ورودی دریافت می کند:

  1. تعداد لایه های پنهان (2، 4)
  2. تعداد نورون ها در هر لایه (5، 10)
  3. تعداد دوره ها (10، 50)

اگر برای هر ورودی پارامتر بخواهیم دو گزینه را امتحان کنیم (همانطور که در پرانتزهای مربع بالا ذکر شد)، در مجموع تا 2 می‌شود.3=8 ترکیب مختلف (به عنوان مثال، یک ترکیب ممکن (2،5،10) است). انجام این کار به صورت دستی سردرد خواهد بود.

حالا تصور کنید که 10 پارامتر ورودی مختلف داشته باشیم و بخواهیم برای هر پارامتر 5 مقدار ممکن را امتحان کنیم. هر بار که بخواهیم مقدار پارامتر را تغییر دهیم، کد را دوباره اجرا کنیم و نتایج را برای همه ترکیبی از پارامترها پیگیری کنیم، به ورودی دستی از طرف ما نیاز دارد. Grid Search آن را خودکار می کند process، از آنجایی که به سادگی مقادیر ممکن را برای هر پارامتر می گیرد و کد را برای آزمایش همه ترکیب های ممکن اجرا می کند، نتیجه را برای هر ترکیب به دست می آورد و همچنین ترکیبی را که بهترین دقت را ارائه می دهد را خروجی می دهد. مفید است، نه؟

پیاده سازی جستجوی شبکه

خوب، صحبت کافی است. بیایید جستجوی گرید را اعمال کنیم روی یک برنامه واقعی بحث در مورد بخش یادگیری ماشین و پیش پردازش داده خارج از محدوده این آموزش است، بنابراین ما به سادگی کد آن را اجرا می کنیم و در مورد بخشی که Grid Search وارد می شود به طور عمیق صحبت می کنیم. بیایید شروع کنیم!

ما از مجموعه داده Pima Indian Diabetes استفاده خواهیم کرد که حاوی اطلاعاتی درباره دیابتی بودن یا نبودن یک بیمار است روی ویژگی های مختلف مانند غلظت گلوکز خون، فشار خون، و غیره. استفاده از پاندا read_csv() روش شما می توانید به طور مستقیم import مجموعه داده از یک منبع آنلاین

اسکریپت زیر کتابخانه های مورد نیاز را وارد می کند:

from sklearn.model_selection import GridSearchCV, KFold
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.wrappers.scikit_learn import KerasClassifier
from keras.optimizers import Adam
import sys
import pandas as pd
import numpy as np

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

columns = ('num_pregnant', 'glucose_concentration', 'blood_pressure', 'skin_thickness',
           'serum_insulin', 'BMI', 'pedigree_function', 'age', 'class')

data_path = "https://raw.githubusercontent.com/mkhalid1/Machine-Learning-Projects-Python-/master/Grid%20Search/pima-indians-diabetes.csv"

df = pd.read_csv(data_path, names=columns)

بیایید نگاهی به 5 ردیف اول مجموعه داده بیندازیم:

df.head()

خروجی:

مجموعه داده دیابت

همانطور که می بینید، این 5 سطر همگی برچسب هایی برای توصیف هر ستون هستند (در واقع 9 مورد از آنها وجود دارد)، بنابراین هیچ کاربردی برای ما ندارند. ما با حذف این ردیف های غیر داده ای شروع می کنیم و سپس همه آنها را جایگزین می کنیم NaN مقادیر با 0:


df = df.iloc(9:)


for col in columns:
    df(col).replace(0, np.NaN, inplace=True)

df.dropna(inplace=True) 
dataset = df.values 

اسکریپت زیر داده ها را به مجموعه ویژگی ها و برچسب ها تقسیم می کند و مقیاس بندی استاندارد را اعمال می کند روی مجموعه داده:

X = dataset(:,0:8)
Y = dataset(:, 8).astype(int)


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().fit(X)


X_standardized = scaler.transform(X)

data = pd.DataFrame(X_standardized)

روش زیر مدل یادگیری عمیق ساده ما را ایجاد می کند:

def create_model(learn_rate, dropout_rate):
    
    model = Sequential()
    model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='relu'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(4, input_dim=8, kernel_initializer='normal', activation='relu'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(1, activation='sigmoid'))

    
    adam = Adam(lr=learn_rate)
    model.compile(loss='binary_crossentropy', optimizer=adam, metrics=('accuracy'))
    return model

این تمام کدهایی است که برای بارگیری مجموعه داده، پیش پردازش آن و ایجاد مدل یادگیری ماشین خود باید اجرا کنید. از آنجایی که ما فقط علاقه مند به دیدن عملکرد Grid Search هستیم، من تقسیم قطار/آزمایش را انجام نداده ام و ما می خواهیم مدل را برازش کنیم. روی کل مجموعه داده

در بخش بعدی شروع خواهیم کرد تا ببینیم که چگونه Grid Search با بهینه‌سازی پارامترهایمان زندگی ما را آسان‌تر می‌کند.

آموزش مدل بدون جستجوی شبکه

در کد زیر، یک مدل با استفاده از مقادیر پارامتری که تصمیم گرفتیم ایجاد خواهیم کرد روی به صورت تصادفی یا مبتنی بر روی شهود ما، و ببینید که مدل ما چگونه عمل می کند:


dropout_rate = 0.1
epochs = 1
batch_size = 20
learn_rate = 0.001


model = create_model(learn_rate, dropout_rate)


model.fit(X_standardized, Y, batch_size=batch_size, epochs=epochs, verbose=1)

خروجی:

Epoch 1/1
130/130 (==============================) - 0s 2ms/step - loss: 0.6934 - accuracy: 0.6000

دقتی که به دست آوردیم، همانطور که در زیر می بینید، این است 60.00%. این بسیار کم است، اما جای نگرانی نیست! ما هنوز Grid Search را داریم تا سعی کنیم روز را نجات دهیم. پس اجازه بدهید به این کار برسیم.

بهینه سازی هایپرپارامترها با استفاده از Grid Search

اگر از Grid Search استفاده نمی‌کنید، می‌توانید مستقیماً با آن تماس بگیرید fit() روش روی مدلی که در بالا ایجاد کردیم. با این حال، برای استفاده از Grid Search، باید برخی از پارامترها را به خود منتقل کنیم create_model() تابع. علاوه بر این، ما باید شبکه خود را با گزینه های مختلفی که می خواهیم برای هر پارامتر امتحان کنیم، اعلام کنیم. بیایید این کار را به صورت جزئی انجام دهیم.

ابتدا ما خود را اصلاح می کنیم create_model() تابع برای پذیرش پارامترها از تابع فراخوانی:

def create_model(learn_rate, dropout_rate):
    
    model = Sequential()
    model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='relu'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(4, input_dim=8, kernel_initializer='normal', activation='relu'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(1, activation='sigmoid'))

    
    adam = Adam(lr=learn_rate)
    model.compile(loss='binary_crossentropy', optimizer=adam, metrics=('accuracy'))
    return model


model = KerasClassifier(build_fn=create_model, verbose=1)

اکنون، ما آماده ایم تا الگوریتم جستجوی گرید خود را پیاده سازی کنیم و مجموعه داده را متناسب کنیم روی آی تی:



learn_rate = (0.001, 0.02, 0.2)
dropout_rate = (0.0, 0.2, 0.4)
batch_size = (10, 20, 30)
epochs = (1, 5, 10)

seed = 42


param_grid = dict(learn_rate=learn_rate, dropout_rate=dropout_rate, batch_size=batch_size, epochs=epochs )


grid = GridSearchCV(estimator=model, param_grid=param_grid,
                    cv=KFold(random_state=seed), verbose=10)

grid_results = grid.fit(X_standardized, Y)


print("Best: {0}, using {1}".format(grid_results.best_score_, grid_results.best_params_))

means = grid_results.cv_results_('mean_test_score')
stds = grid_results.cv_results_('std_test_score')
params = grid_results.cv_results_('params')

for mean, stdev, param in zip(means, stds, params):
    print('{0} ({1}) with: {2}'.format(mean, stdev, param))

خروجی:

Best: 0.7959183612648322, using {'batch_size': 10, 'dropout_rate': 0.2, 'epochs': 10, 'learn_rate': 0.02}

در خروجی، می‌توانیم ببینیم که ترکیب پارامتر را به ما می‌دهد که بهترین دقت را به دست می‌دهد.

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

نتیجه

به طور خلاصه، ما یاد گرفتیم که Grid Search چیست، چگونه می تواند به ما در بهینه سازی مدلمان و مزایایی مانند اتوماسیون به ما کمک کند. علاوه بر این، ما یاد گرفتیم که چگونه آن را در چند خط کد با استفاده از زبان پایتون پیاده سازی کنیم. برای مشاهده اثربخشی آن، ما همچنین یک مدل یادگیری ماشینی را با و بدون انجام Grid Search آموزش دادیم و دقت با Grid Search 19٪ بیشتر بود.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-18 00:10:05

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

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

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید