[한양대 ERICA] 신용카드 사용자 연체 예측 AI 경진대회

금융 | 정형 | Logloss

 

효율적으로 하이퍼파라미터 튜닝 하는 방법 소개 : Optuna

2021.11.19 17:18 2,048 조회

Optuna

대회가 마무리 되어가는 지금, 하이퍼파라미터 튜닝이 굉장히 중요한 시기인것 같은데요

효율적인 하이퍼파라미터 튜닝을 지원하는 optuna 라는 라이브러리 코드를 공유드리려합니다.

그리드 서치와 달리 하이퍼파라미터를 범위로 지정을 해줄 수 있어서 좀 더 직관적이고 사용하기 간편합니다.


! pip install optuna

import optuna
from optuna import Trial
from optuna.samplers import TPESampler
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_split

# train_x, train_y가 전역변수로 정의 되어있다는 가정한 코드입니다.

def objective(trial: Trial) -> float:

    params_lgb = {
        "random_state": 42,
        "verbosity": -1,
        "learning_rate": trial.suggest_float("learning_rate", 0.05, 0.1),
        "n_estimators": 250,
        "objective": "multiclass",
        "metric": "multi_logloss",
        "max_depth": trial.suggest_int("max_depth", 1, 30),
        "num_leaves": trial.suggest_int("num_leaves", 2, 256),
        "colsample_bytree": trial.suggest_float("colsample_bytree", 0.2, 0.6),
        "subsample": trial.suggest_float("subsample", 0.3, 1.0),
        "subsample_freq": trial.suggest_int("subsample_freq", 1, 10),
        "min_child_samples": trial.suggest_int("min_child_samples", 2, 30),
    }
    
    X_train, X_valid, y_train, y_valid = train_test_split(train_x, train_y, test_size=0.2)

    model = LGBMClassifier(**params_lgb)
    model.fit(
        X_train,
        y_train,
        eval_set=[(X_train, y_train), (X_valid, y_valid)],
        early_stopping_rounds=100,
        verbose=False,
    )

    lgb_pred = model.predict_proba(X_valid)
    log_score = log_loss(y_valid, lgb_pred)
    
    return log_score

sampler = TPESampler(seed=42)
study = optuna.create_study(
    study_name="lgbm_parameter_opt",
    direction="minimize",
    sampler=sampler,
)

study.optimize(objective, n_trials=20)
print("Best Score:", study.best_value)
print("Best trial:", study.best_trial.params)