데이콘 코드를 리뷰하면서 알게된 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: 최적의 파라미터 저장
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
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)