Подбор гиперпараметров модели с 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
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: