Самый продвинутый инструмент для подбора гиперпараметров модели
Рассмотрим, какое средство осуществляет подбор гиперпараметров модели наиболее эффективно? Также на конкретном примере разберем вариант использования данного инструмента.
Это библиотека 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)
Теперь можно вывести новые параметры:
а создать регрессор с этими параметрами так: