Самый продвинутый инструмент для подбора гиперпараметров модели
Рассмотрим, какое средство осуществляет подбор гиперпараметров модели наиболее эффективно? Также на конкретном примере разберем вариант использования данного инструмента.
Это библиотека Optuna, в которой оптимизация осуществляется не жадным или случайным перебором заданных комбинаций гиперпараметров (как в GridSearchCV или RandomizedSearchCV), а с использованием продвинутых алгоритмов поиска областей минимизации/максимизации целевой функции.
Родным способом применения является задание функции цели (традиционно называется objective) и инициация ее оптимизации.
Для примера, минимизация простой функции выглядит следующим образом:
import optuna def objective(trial): x = trial.suggest_float("x", -10, 10) return (x - 5) ** 2 study = optuna.create_study() study.optimize(objective, n_trials=100)
Получить оптимальное значение целевой функции, параметра можно через свойства study best_params и best_value:
Рассмотрим процесс оптимизации гиперпараметров LightGBM модели, предсказывающей расходы людей по их доходам на основании сгенерированных в прошлых статьях данных:
import joblib import optuna import lightgbm as lgb from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_percentage_error data_m = joblib.load('data_m.pkl') def objective(trial): X_tr, X_val, y_tr, y_val = train_test_split(data_m[['зарплата', 'сумма_помощи']], data_m['расходы'], test_size=0.2) params={'verbosity':-1, 'lambda_l2':trial.suggest_float('lambda_l2', 0.1, 1), 'max_depth':trial.suggest_int('max_depth', 5, 100, step=0.05), 'num_leaves':trial.suggest_int('num_leaves', 5, 105, step=10), 'learning_rate':trial.suggest_float('learning_rate',0.001, 0.1, step=0.01), 'bagging_fraction': trial.suggest_float('bagging_fraction', 0.5, 0.8 , step=0.1) } reg = lgb.LGBMRegressor(**params) reg.fit(X_tr, y_tr) y_pr = reg.predict(X_val) mape = mean_absolute_percentage_error(y_val, y_pr) return mape study = optuna.create_study() study.optimize(objective, n_trials=100, timeout=600)
Теперь можно вывести новые параметры:
а создать регрессор с этими параметрами так: