обзор
May 6, 2022

Подбор гиперпараметров модели с OptunaSearchCV

Библиотека оптимизации процесса подбора гиперпараметров Optuna имеет scikit-подобный класс OptunaSearchCV, находящийся в модуле optuna.integration. Этот интерфейс удобнее основного, так как является более привычным. В качестве параметров конструктор OptunaSearchCV принимает:

estimator – объект класса для обучения;

param_distributions – распределения гиперпараметров (подробнее здесь);

scoring – метрика максимизации;

n_trials – количество попыток;

timeout задает максимальное время на обучение в секундах;

cv – можно задать количество итераций в ходе кросс-валидации;

random_state – инициализатор случайных чисел (если не задан, используется значение из numpy.random).

Более детальное описание параметров можно найти здесь.

Рассмотрим пример использования OptunaSearchCV. Сначала создадим датафрейм:

import pandas as pd
from catboost import CatBoostClassifier
from sklearn.datasets import make_classification
import numpy as np
np.random.seed(0)

ar, y = make_classification(n_samples=10000, n_features=3, n_informative=2, 
                           n_redundant=0, class_sep = 0.2, shuffle=False, 
                           flip_y=0, n_clusters_per_class=2)

df = pd.DataFrame(ar, columns = ['feat1', 'feat2', 'feat3'])
df['y'] = y
# мешаем
df = df.sample(frac=1).reset_index(drop=True)
df

Разбиваем на выборки и инициализируем объект OptunaSearchCV с условием максимизации метрики f1:

from sklearn.model_selection import train_test_split, KFold
sp = KFold()

X_cv, X_ts, y_cv, y_ts = train_test_split(df.drop(columns='y').copy(), 
                                          df['y'], test_size=0.2)
X_cv.shape[0], X_ts.shape[0]
clf = CatBoostClassifier(verbose=False)
import optuna

param_distrs = {'learning_rate': optuna.distributions.LogUniformDistribution(1e-4, 20),
                'min_data_in_leaf':optuna.distributions.IntUniformDistribution(1, 10),
                'iterations':optuna.distributions.IntUniformDistribution(800, 1200, 100),
                'subsample':optuna.distributions.UniformDistribution(0.7, 0.9),
                
                      }

opt_search = optuna.integration.OptunaSearchCV(clf, param_distrs, cv = 5,
                                                n_trials=50, scoring='f1', timeout=500)
opt_search.fit(X_cv, y_cv)

В объекте поиска будут три свойства, хранящие важные сведения:

opt_search.best_params_ - найденные оптимальные параметры;

opt_search.best_score_ - значение лучшей метрики в ходе кросс-валидации;

opt_search.best_estimator_ - ссылка на объект оптимальной модели.

Можно проверить найденную модель на test выборке и сравнить с классификатором по умолчанию:

from sklearn.metrics import f1_score

clf_simp = CatBoostClassifier(verbose=False)
clf_simp.fit(X_cv, y_cv)

(f1_score(y_ts, opt_search.best_estimator_.predict(X_ts)),
f1_score(y_ts, clf_simp.predict(X_ts)))

А так можно убедиться, что Optuna возвращает оптимальную модель, обученную на всей выборке, которую ей передавали в fit:

clf_compl = CatBoostClassifier(verbose=False, **opt_search.best_params_)
clf_compl.fit(X_cv, y_cv)

f1_score(y_ts, clf_compl.predict(X_ts)), f1_score(y_ts,opt_search.best_estimator_.predict(X_ts))

Полезные ссылки:

1. Подбор параметров, используя механизм ask-tell Optuna

2. Подбор параметров, используя механизм optimize objective Optuna

3. Подбор гиперпараметров модели с GridSearchCV и RandomizedSearchCV

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Яндекс Дзен

Telegram