машинное обучение
June 23, 2021

Самый продвинутый инструмент для подбора гиперпараметров модели

Рассмотрим, какое средство осуществляет подбор гиперпараметров модели наиболее эффективно? Также на конкретном примере разберем вариант использования данного инструмента.

Это библиотека 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)

Теперь можно вывести новые параметры:

а создать регрессор с этими параметрами так: