@Venda_98

Как настроить передачу trial в качестве аргумента функции objective в Optuna?

Хочу иметь возможность передавать собственный trial с указанием параметров и распределения в функцию objective при запуске оптимизации в Optuna.

Запускаю следующий код для оптимизации модели LightGBM:

import optuna
import lightgbm

def objective_lgb(trial):
    
    # train_x, test_x, train_y, test_y = train_test_split(data, target, test_size=0.15,random_state=42)
    params_lgb = {
        'objective' : trial.suggest_categorical('objective', ["binary"]),
        'metric' : trial.suggest_categorical('metric', ["binary_logloss"]),
        'lambda_l1': trial.suggest_loguniform('lambda_l1', 1e-8, 10.0),
        'lambda_l2': trial.suggest_loguniform('lambda_l2', 1e-8, 10.0),
        'num_leaves': trial.suggest_int('num_leaves', 2, 256),
        'feature_fraction': trial.suggest_uniform('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_uniform('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
        'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
        'learning_rate': trial.suggest_uniform('learning_rate', 0.02, 1.00)
    }
    # Train model
    model_lgb = lgb.LGBMClassifier(
        **params_lgb
    )
    model_lgb.fit(X_train, y_train, 
                  eval_set=[(X_test, y_test)], 
                  early_stopping_rounds=40, 
                  verbose=2)
    
    y_pred = model_lgb.predict(X_test)
    
    f_beta = fbeta_score(y_test, y_pred, beta=2.0)
    # accuracy = accuracy_score(y_test, y_pred)
    return f_beta


study = optuna.create_study(directions=["maximize"])
trial = optuna.trial.create_trial(
    state=optuna.trial.TrialState.WAITING,
    params={
        'objective': 'binary', 
        'metric': 'binary_logloss',
        'lambda_l1': 0.5,
        'lambda_l2': 0.01, 
        'num_leaves': 2,
        'feature_fraction': 0.79, 
        'bagging_fraction': 0.79,
        'bagging_freq': 6, 
        'min_child_samples': 40, 
        'n_estimators': 600,
        'learning_rate': 0.04
    },
    distributions=lgb_distr,
)

study.add_trial(trial)
study.optimize(objective_lgb, n_trials=10)


Данный код выдаёт ошибку:
`ValueError: Cannot set different log configuration to the same parameter name.`


То есть проблема с тем, что внутри Optuna задаётся объект trial самостоятельно, и у него возникает конфликт с созданным мною Trial.

Каким образом можно решить эту проблему, чтоб я мог самостоятельно задавать Trial (опять же, меня не интересует стандартный вариант с постоянной корректировкой функции objective, хочется именно передавать в неё нужные мне параметры)?
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы