برنامه نویسی

انتخاب مدل ML – انجمن DEV

Summarize this content to 400 words in Persian Lang

1. مقدمه

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

ما انتخاب مدل را هم با انتخاب بهترین الگوریتم یادگیری و هم با انتخاب بهترین هایپرپارامترهای آن انجام خواهیم داد.

اما اول چه هستند هایپرپارامترها? اینها تنظیمات اضافی هستند که توسط کاربر تنظیم می شوند و بر نحوه یادگیری مدل پارامترهای آن تأثیر می گذارند. پارامترها از سوی دیگر، مدل ها در طول فرآیند آموزش یاد می گیرند.

2. استفاده از جستجوی جامع.

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

GridSearchCV چگونه کار می کند:

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

مثالما می توانیم یک رگرسیون لجستیک را به عنوان الگوریتم یادگیری خود تنظیم کنیم و دو ابرپارامتر (C و جریمه منظم سازی) را تنظیم کنیم. همچنین می توانیم دو پارامتر تکرار حل کننده و حداکثر را مشخص کنیم.

اکنون برای هر ترکیبی از مقادیر جریمه C و منظم سازی، مدل را آموزش می دهیم و با استفاده از اعتبارسنجی متقاطع k-fold ارزیابی می کنیم.از آنجایی که ما 10 مقدار ممکن برای C داریم، 2 مقدار ممکن برای reg. پنالتی و 5 برابر ما در مجموع (10*2*5 = 100) مدلهای کاندید داریم که از بین آنها بهترین انتخاب می شود.

# Load libraries
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, solver=”liblinear”)

# Create range of candidate penalty hyperparameter values
penalty = [‘l1′,’l2′]

# Create range of candidate regularization hyperparameter values
C = np.logspace(0, 4, 10)

# Create dictionary of hyperparameter candidates
hyperparameters = dict(C=C, penalty=penalty)

# Create grid search
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, verbose=0)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Show the best model
print(best_model.best_estimator_)

# LogisticRegression(C=7.742636826811269, max_iter=500, penalty=’l1’,
solver=”liblinear”) # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گرفتن بهترین مدل:

# View best hyperparameters
print(‘Best Penalty:’, best_model.best_estimator_.get_params()[‘penalty’])
print(‘Best C:’, best_model.best_estimator_.get_params()[‘C’])

# Best Penalty: l1 #Result
# Best C: 7.742636826811269 # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. استفاده از جستجوی تصادفی.

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

شایان ذکر است که دلیل اینکه RandomizedSearchCV ذاتاً سریعتر از GridSearchCV نیست، اما اغلب با آزمایش ترکیبات کمتر، عملکردی قابل مقایسه با GridSearchCV در زمان کمتری دارد.

نحوه کارکرد تصادفی جستجوی CV:

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

مثال

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, solver=”liblinear”)

# Create range of candidate regularization penalty hyperparameter values
penalty = [‘l1’, ‘l2′]

# Create distribution of candidate regularization hyperparameter values
C = uniform(loc=0, scale=4)

# Create hyperparameter options
hyperparameters = dict(C=C, penalty=penalty)

# Create randomized search
randomizedsearch = RandomizedSearchCV(
logistic, hyperparameters, random_state=1, n_iter=100, cv=5, verbose=0,
n_jobs=-1)

# Fit randomized search
best_model = randomizedsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# LogisticRegression(C=1.668088018810296, max_iter=500, penalty=’l1’,
solver=”liblinear”) #Result.

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دریافت بهترین مدل:

# View best hyperparameters
print(‘Best Penalty:’, best_model.best_estimator_.get_params()[‘penalty’])
print(‘Best C:’, best_model.best_estimator_.get_params()[‘C’])

# Best Penalty: l1 # Result
# Best C: 1.668088018810296 # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه: تعداد مدل های کاندید آموزش دیده در مشخص شده است n_iter تنظیمات (تعداد تکرار).

4. انتخاب بهترین مدل ها از الگوریتم های یادگیری چندگانه.

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

ما می توانیم این کار را به سادگی با ایجاد فرهنگ لغت الگوریتم های یادگیری نامزد و فراپارامترهای آنها انجام دهیم تا از آنها به عنوان فضای جستجو استفاده کنیم. GridSearchCV.

مراحل:

ما می توانیم فضای جستجویی را تعریف کنیم که شامل دو الگوریتم یادگیری است.
ما فراپارامترها را مشخص می کنیم و با استفاده از قالب، مقادیر کاندید آنها را تعریف می کنیم طبقه بندی کننده[hyperparameter name]_.

# Load libraries
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

# Set random seed
np.random.seed(0)

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create a pipeline
pipe = Pipeline([(“classifier”, RandomForestClassifier())])

# Create dictionary with candidate learning algorithms and their hyperparameters
search_space = [{“classifier”: [LogisticRegression(max_iter=500,
solver=”liblinear”)],
“classifier__penalty”: [‘l1’, ‘l2’],
“classifier__C”: np.logspace(0, 4, 10)},
{“classifier”: [RandomForestClassifier()],
“classifier__n_estimators”: [10, 100, 1000],
“classifier__max_features”: [1, 2, 3]}]

# Create grid search
gridsearch = GridSearchCV(pipe, search_space, cv=5, verbose=0)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Pipeline(steps=[(‘classifier’,
LogisticRegression(C=7.742636826811269, max_iter=500,
penalty=’l1′, solver=”liblinear”))])

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بهترین مدل:پس از اتمام جستجو می توانیم استفاده کنیم best_estimator_ برای مشاهده بهترین الگوریتم یادگیری و فراپارامترهای مدل.

5. انتخاب بهترین مدل هنگام پیش پردازش.

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

چالش اول:GridSeachCv از اعتبارسنجی متقابل برای تعیین مدل با بالاترین عملکرد استفاده می کند.

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

به همین دلیل مراحل پیش پردازش باید بخشی از مجموعه اقدامات انجام شده توسط GridSearchCV باشد.

راه حلScikit-learn فراهم می کند FeatureUnion که به ما امکان می دهد چندین عملیات پیش پردازش را به درستی ترکیب کنیم.مراحل:

استفاده می کنیم _ FeatureUnion _برای ترکیب دو مرحله پیش پردازش: استاندارد کردن مقادیر ویژگی (StandardScaler) و تجزیه و تحلیل مؤلفه های اصلی (PCA) – این شی پیش پردازش نامیده می شود و شامل هر دو مرحله پیش پردازش ما است.
در مرحله بعد، پیش پردازش را با الگوریتم یادگیری خود در خط لوله خود قرار می دهیم.

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

چالش دوم:برخی از روش‌های پیش پردازش مانند PCA پارامترهای خاص خود را دارند، کاهش ابعاد با استفاده از PCA به کاربر نیاز دارد که تعداد اجزای اصلی را برای استفاده برای تولید مجموعه ویژگی‌های تبدیل‌شده تعریف کند. در حالت ایده‌آل، تعداد مؤلفه‌هایی را انتخاب می‌کنیم که مدلی با بیشترین عملکرد را برای برخی از معیارهای آزمون ارزیابی تولید می‌کنند.راه حل.در scikit-learn وقتی مقادیر مؤلفه‌های نامزد را در فضای جستجو قرار می‌دهیم، مانند هر ابرپارامتر دیگری که باید جستجو شود، رفتار می‌شود.

# Load libraries
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# Set random seed
np.random.seed(0)

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create a preprocessing object that includes StandardScaler features and PCA
preprocess = FeatureUnion([(“std”, StandardScaler()), (“pca”, PCA())])

# Create a pipeline
pipe = Pipeline([(“preprocess”, preprocess),
(“classifier”, LogisticRegression(max_iter=1000,
solver=”liblinear”))])

# Create space of candidate values
search_space = [{“preprocess__pca__n_components”: [1, 2, 3],
“classifier__penalty”: [“l1”, “l2”],
“classifier__C”: np.logspace(0, 4, 10)}]

# Create grid search
clf = GridSearchCV(pipe, search_space, cv=5, verbose=0, n_jobs=-1)

# Fit grid search
best_model = clf.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Pipeline(steps=[(‘preprocess’,
FeatureUnion(transformer_list=[(‘std’, StandardScaler()),
(‘pca’, PCA(n_components=1))])),
(‘classifier’,
LogisticRegression(C=7.742636826811269, max_iter=1000,
penalty=’l1′, solver=”liblinear”))]) # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

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

# View best n_components

best_model.best_estimator_.get_params()
# [‘preprocess__pca__n_components’] # Results

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. افزایش سرعت انتخاب مدل با موازی سازی.

در آن زمان باید زمان انتخاب مدل را کاهش دهید.ما می توانیم این کار را با آموزش چندین مدل به طور همزمان انجام دهیم، این کار با استفاده از تمام هسته های دستگاه ما با تنظیم انجام می شود. n_jobs=-1

# Load libraries
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500,
solver=”liblinear”)

# Create range of candidate regularization penalty hyperparameter values
penalty = [“l1”, “l2″]

# Create range of candidate values for C
C = np.logspace(0, 4, 1000)

# Create hyperparameter options
hyperparameters = dict(C=C, penalty=penalty)

# Create grid search
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, n_jobs=-1,
verbose=1)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Fitting 5 folds for each of 2000 candidates, totalling 10000 fits
# LogisticRegression(C=5.926151812475554, max_iter=500, penalty=’l1′,
solver=”liblinear”)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6. افزایش سرعت انتخاب مدل (روش های خاص الگوریتم).

این راهی برای افزایش سرعت انتخاب مدل بدون استفاده از توان محاسباتی اضافی است.

این امکان پذیر است زیرا scikit-learn دارای تنظیم فراپارامتر اعتبار متقابل مدل خاص است.

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

مثال:LogisticRegression برای انجام یک طبقه بندی کننده رگرسیون لجستیک استاندارد استفاده می شود.LogisticRegressionCV یک طبقه‌بندی‌کننده رگرسیون لجستیک معتبر متقاطع کارآمد را پیاده‌سازی می‌کند که می‌تواند مقدار بهینه ابرپارامتر C را شناسایی کند.

# Load libraries
from sklearn import linear_model, datasets

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create cross-validated logistic regression
logit = linear_model.LogisticRegressionCV(Cs=100, max_iter=500,
solver=”liblinear”)

# Train model
logit.fit(features, target)

# Print model
print(logit)

# LogisticRegressionCV(Cs=100, max_iter=500, solver=”liblinear”)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:یک نقطه ضعف عمده برای LogisticRegressionCV این است که فقط می تواند محدوده ای از مقادیر را برای C جستجو کند. این محدودیت در بسیاری از رویکردهای اعتبارسنجی متقابل مدل خاص scikit-learn مشترک است.

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

1. مقدمه

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

ما انتخاب مدل را هم با انتخاب بهترین الگوریتم یادگیری و هم با انتخاب بهترین هایپرپارامترهای آن انجام خواهیم داد.

اما اول چه هستند هایپرپارامترها? اینها تنظیمات اضافی هستند که توسط کاربر تنظیم می شوند و بر نحوه یادگیری مدل پارامترهای آن تأثیر می گذارند. پارامترها از سوی دیگر، مدل ها در طول فرآیند آموزش یاد می گیرند.

2. استفاده از جستجوی جامع.

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

GridSearchCV چگونه کار می کند:

  1. کاربر مجموعه ای از مقادیر ممکن را برای یک یا چند فراپارامتر تعریف می کند.
  2. GridSearchCV یک مدل را با استفاده از هر مقدار و / یا ترکیبی از مقادیر آموزش می دهد.
  3. مدل با بهترین عملکرد به عنوان بهترین مدل انتخاب می شود.

مثال
ما می توانیم یک رگرسیون لجستیک را به عنوان الگوریتم یادگیری خود تنظیم کنیم و دو ابرپارامتر (C و جریمه منظم سازی) را تنظیم کنیم. همچنین می توانیم دو پارامتر تکرار حل کننده و حداکثر را مشخص کنیم.

اکنون برای هر ترکیبی از مقادیر جریمه C و منظم سازی، مدل را آموزش می دهیم و با استفاده از اعتبارسنجی متقاطع k-fold ارزیابی می کنیم.
از آنجایی که ما 10 مقدار ممکن برای C داریم، 2 مقدار ممکن برای reg. پنالتی و 5 برابر ما در مجموع (10*2*5 = 100) مدلهای کاندید داریم که از بین آنها بهترین انتخاب می شود.

# Load libraries
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, solver="liblinear")

# Create range of candidate penalty hyperparameter values
penalty = ['l1','l2']

# Create range of candidate regularization hyperparameter values
C = np.logspace(0, 4, 10)

# Create dictionary of hyperparameter candidates
hyperparameters = dict(C=C, penalty=penalty)

# Create grid search
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, verbose=0)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Show the best model
print(best_model.best_estimator_)

# LogisticRegression(C=7.742636826811269, max_iter=500, penalty='l1',
solver="liblinear") # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گرفتن بهترین مدل:

# View best hyperparameters
print('Best Penalty:', best_model.best_estimator_.get_params()['penalty'])
print('Best C:', best_model.best_estimator_.get_params()['C'])

# Best Penalty: l1 #Result
# Best C: 7.742636826811269 # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. استفاده از جستجوی تصادفی.

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

شایان ذکر است که دلیل اینکه RandomizedSearchCV ذاتاً سریعتر از GridSearchCV نیست، اما اغلب با آزمایش ترکیبات کمتر، عملکردی قابل مقایسه با GridSearchCV در زمان کمتری دارد.

نحوه کارکرد تصادفی جستجوی CV:

  1. کاربر فراپارامترها/توزیعات (به عنوان مثال نرمال، یکنواخت) را عرضه می کند.
  2. الگوریتم‌ها به‌طور تصادفی تعداد خاصی از ترکیب‌های تصادفی مقادیر فراپارامتر داده‌شده را بدون جایگزینی جستجو می‌کنند.

مثال

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, solver="liblinear")

# Create range of candidate regularization penalty hyperparameter values
penalty = ['l1', 'l2']

# Create distribution of candidate regularization hyperparameter values
C = uniform(loc=0, scale=4)

# Create hyperparameter options
hyperparameters = dict(C=C, penalty=penalty)

# Create randomized search
randomizedsearch = RandomizedSearchCV(
logistic, hyperparameters, random_state=1, n_iter=100, cv=5, verbose=0,
n_jobs=-1)

# Fit randomized search
best_model = randomizedsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# LogisticRegression(C=1.668088018810296, max_iter=500, penalty='l1',
solver="liblinear") #Result.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دریافت بهترین مدل:

# View best hyperparameters
print('Best Penalty:', best_model.best_estimator_.get_params()['penalty'])
print('Best C:', best_model.best_estimator_.get_params()['C'])

# Best Penalty: l1 # Result
# Best C: 1.668088018810296 # Result

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه: تعداد مدل های کاندید آموزش دیده در مشخص شده است n_iter تنظیمات (تعداد تکرار).

4. انتخاب بهترین مدل ها از الگوریتم های یادگیری چندگانه.

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

ما می توانیم این کار را به سادگی با ایجاد فرهنگ لغت الگوریتم های یادگیری نامزد و فراپارامترهای آنها انجام دهیم تا از آنها به عنوان فضای جستجو استفاده کنیم. GridSearchCV.

مراحل:

  1. ما می توانیم فضای جستجویی را تعریف کنیم که شامل دو الگوریتم یادگیری است.
  2. ما فراپارامترها را مشخص می کنیم و با استفاده از قالب، مقادیر کاندید آنها را تعریف می کنیم طبقه بندی کننده[hyperparameter name]_.
# Load libraries
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

# Set random seed
np.random.seed(0)

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create a pipeline
pipe = Pipeline([("classifier", RandomForestClassifier())])

# Create dictionary with candidate learning algorithms and their hyperparameters
search_space = [{"classifier": [LogisticRegression(max_iter=500,
solver="liblinear")],
"classifier__penalty": ['l1', 'l2'],
"classifier__C": np.logspace(0, 4, 10)},
{"classifier": [RandomForestClassifier()],
"classifier__n_estimators": [10, 100, 1000],
"classifier__max_features": [1, 2, 3]}]

# Create grid search
gridsearch = GridSearchCV(pipe, search_space, cv=5, verbose=0)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Pipeline(steps=[('classifier',
                 LogisticRegression(C=7.742636826811269, max_iter=500,
                      penalty='l1', solver="liblinear"))])
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بهترین مدل:
پس از اتمام جستجو می توانیم استفاده کنیم best_estimator_ برای مشاهده بهترین الگوریتم یادگیری و فراپارامترهای مدل.

5. انتخاب بهترین مدل هنگام پیش پردازش.

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

چالش اول:
GridSeachCv از اعتبارسنجی متقابل برای تعیین مدل با بالاترین عملکرد استفاده می کند.

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

به همین دلیل مراحل پیش پردازش باید بخشی از مجموعه اقدامات انجام شده توسط GridSearchCV باشد.

راه حل
Scikit-learn فراهم می کند FeatureUnion که به ما امکان می دهد چندین عملیات پیش پردازش را به درستی ترکیب کنیم.
مراحل:

  1. استفاده می کنیم _ FeatureUnion _برای ترکیب دو مرحله پیش پردازش: استاندارد کردن مقادیر ویژگی (StandardScaler) و تجزیه و تحلیل مؤلفه های اصلی (PCA) – این شی پیش پردازش نامیده می شود و شامل هر دو مرحله پیش پردازش ما است.
  2. در مرحله بعد، پیش پردازش را با الگوریتم یادگیری خود در خط لوله خود قرار می دهیم.

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

چالش دوم:
برخی از روش‌های پیش پردازش مانند PCA پارامترهای خاص خود را دارند، کاهش ابعاد با استفاده از PCA به کاربر نیاز دارد که تعداد اجزای اصلی را برای استفاده برای تولید مجموعه ویژگی‌های تبدیل‌شده تعریف کند. در حالت ایده‌آل، تعداد مؤلفه‌هایی را انتخاب می‌کنیم که مدلی با بیشترین عملکرد را برای برخی از معیارهای آزمون ارزیابی تولید می‌کنند.
راه حل.
در scikit-learn وقتی مقادیر مؤلفه‌های نامزد را در فضای جستجو قرار می‌دهیم، مانند هر ابرپارامتر دیگری که باید جستجو شود، رفتار می‌شود.

# Load libraries
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# Set random seed
np.random.seed(0)

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create a preprocessing object that includes StandardScaler features and PCA
preprocess = FeatureUnion([("std", StandardScaler()), ("pca", PCA())])

# Create a pipeline
pipe = Pipeline([("preprocess", preprocess),
               ("classifier", LogisticRegression(max_iter=1000,
               solver="liblinear"))])

# Create space of candidate values
search_space = [{"preprocess__pca__n_components": [1, 2, 3],
"classifier__penalty": ["l1", "l2"],
"classifier__C": np.logspace(0, 4, 10)}]

# Create grid search
clf = GridSearchCV(pipe, search_space, cv=5, verbose=0, n_jobs=-1)

# Fit grid search
best_model = clf.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Pipeline(steps=[('preprocess',
     FeatureUnion(transformer_list=[('std', StandardScaler()),
                                    ('pca', PCA(n_components=1))])),
    ('classifier',
    LogisticRegression(C=7.742636826811269, max_iter=1000,
                      penalty='l1', solver="liblinear"))]) # Result


وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

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

# View best n_components

best_model.best_estimator_.get_params() 
# ['preprocess__pca__n_components'] # Results

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. افزایش سرعت انتخاب مدل با موازی سازی.

در آن زمان باید زمان انتخاب مدل را کاهش دهید.
ما می توانیم این کار را با آموزش چندین مدل به طور همزمان انجام دهیم، این کار با استفاده از تمام هسته های دستگاه ما با تنظیم انجام می شود. n_jobs=-1

# Load libraries
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, 
                                           solver="liblinear")

# Create range of candidate regularization penalty hyperparameter values
penalty = ["l1", "l2"]

# Create range of candidate values for C
C = np.logspace(0, 4, 1000)

# Create hyperparameter options
hyperparameters = dict(C=C, penalty=penalty)

# Create grid search
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, n_jobs=-1, 
                             verbose=1)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Fitting 5 folds for each of 2000 candidates, totalling 10000 fits
# LogisticRegression(C=5.926151812475554, max_iter=500, penalty='l1',
                                                  solver="liblinear")

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6. افزایش سرعت انتخاب مدل (روش های خاص الگوریتم).

این راهی برای افزایش سرعت انتخاب مدل بدون استفاده از توان محاسباتی اضافی است.

این امکان پذیر است زیرا scikit-learn دارای تنظیم فراپارامتر اعتبار متقابل مدل خاص است.

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

مثال:
LogisticRegression برای انجام یک طبقه بندی کننده رگرسیون لجستیک استاندارد استفاده می شود.
LogisticRegressionCV یک طبقه‌بندی‌کننده رگرسیون لجستیک معتبر متقاطع کارآمد را پیاده‌سازی می‌کند که می‌تواند مقدار بهینه ابرپارامتر C را شناسایی کند.

# Load libraries
from sklearn import linear_model, datasets

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create cross-validated logistic regression
logit = linear_model.LogisticRegressionCV(Cs=100, max_iter=500,
                                            solver="liblinear")

# Train model
logit.fit(features, target)

# Print model
print(logit)

# LogisticRegressionCV(Cs=100, max_iter=500, solver="liblinear")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:یک نقطه ضعف عمده برای LogisticRegressionCV این است که فقط می تواند محدوده ای از مقادیر را برای C جستجو کند. این محدودیت در بسیاری از رویکردهای اعتبارسنجی متقابل مدل خاص scikit-learn مشترک است.

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

نوشته های مشابه

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا