[Python] Optuna

먕먕·2021년 10월 12일
0

데이콘 코드를 리뷰하면서 알게된 Optuna에 대해서 포스팅을 하려고 합니다.

Optuna

  • 하이퍼파라미터 최적화 태스크를 도와주는 프레임워크

  • 파라미터의 범위, 목록을 설정하면 매 Trial마다 파라미터를 변경하면서 최적화

  • 학습 절차 확인 가능한 시각화 툴 제공

  • suggest_int: 범위 내의 정수형 값을 선택

    n_estimators = trial.suggest_int('n_estimators', 100, 500)

  • suggent_categorical: List 내의 데이터 중 선택

    criterion = trial.suggest_categorical('criterion', ['gini', entropy'])

  • suggest_uniform: 범위 내의 균일 분포를 값으로 선택

    subsample = trial.suggest_uniform('subsample', 0.2, 0.8)

  • suggest_discrete_uniform: 범위 내의 이산 균등 분포를 값으로 선택

    max_feautures = trial.suggest_discrete_uniform('max_features', 0.05, 1, 0.05)

  • suggest_discrete_uniform: 범위 내의 이산 균등 분포를 값으로 선택

    max_feautures = trial.suggest_discrete_uniform('max_features', 0.05, 1, 0.05)

  • suggest_loguniform: 범위 내의 로그 함수 선상의 값을 선택

    learning_rate = trial.suggest_longuniform('learning_rate': 1e-6, 1e-3)

  • study.best_trial.params: 최적의 파라미터 저장

Code

  • 특정 인수를 object에 전달
  • trial은 조정해야하는 하이퍼 파라미터를 지정하기 위해 objective함수에 전달
def objective(trial: Trial) -> float:
    params_lgb = {
        "random_state": 42,
        "verbosity": -1,
        "learning_rate": 0.05,
        "n_estimators": 10000,
        "objective": "multiclass",
        "metric": "multi_logloss",
        "reg_alpha": trial.suggest_float("reg_alpha", 1e-8, 3e-5),
        "reg_lambda": trial.suggest_float("reg_lambda", 1e-8, 9e-2),
        "max_depth": trial.suggest_int("max_depth", 1, 20),
        "num_leaves": trial.suggest_int("num_leaves", 2, 256),
        "colsample_bytree": trial.suggest_float("colsample_bytree", 0.4, 1.0),
        "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", 5, 100),
        "max_bin": trial.suggest_int("max_bin", 200, 500),
    }
    
    X_train, X_valid, y_train, y_valid = train_test_split(X, 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
  • optuna 적용
    • direction: score 값을 최대('maximize') 또는 최소('minimize')로 하는 방향으로 지정
    • n_trials: 시도 횟수 (미 입력시 key interrupt가 있을 때까지 무한 반복)
sampler = TPESampler(seed=42)
study = optuna.create_study(
    study_name="lgbm_parameter_opt",
    direction="minimize",
    sampler=sampler,
)
study.optimize(objective, n_trials=10)
print("Best Score:", study.best_value)
print("Best trial:", study.best_trial.params)
profile
22년 3월부터 본격적으로 블로그 정리 시작합니다! (준비중)

0개의 댓글