Optuna

Sam (토론 | 기여)님의 2025년 7월 31일 (목) 22:38 판 (새 문서: == 개요 == 하이퍼파라미터 최적화를 위한 자동화 프레임워크. 주로 머신러닝, 백테스트 전략, 파라미터 탐색 등에서 "최적의 조합"을 빠르...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

1 개요편집

하이퍼파라미터 최적화를 위한 자동화 프레임워크. 주로 머신러닝, 백테스트 전략, 파라미터 탐색 등에서 "최적의 조합"을 빠르게 찾기 위한 용도로 사용된다.

1.1 특징편집

  • 목표함수(objective)에 따라 자동으로 파라미터를 제안(suggest)한다.
  • 탐색 알고리즘으로 베이지안 최적화(TPE)나 CMA-ES 등을 사용한다.
  • 실패하거나 부적절한 조합은 건너뛰는 Pruning 기능을 제공한다.
  • 시각화나 저장, 로깅, 중단 후 재개 등의 기능도 지원한다.

2 사용법편집

2.1 준비편집

의도 설명 비고
설치 pip install optuna

2.2 기초 사용편집

의도 설명 방법
임포트 import optuna
스터디 생성 최대화 / 최소화 여부 설정 포함. study = optuna.create_study(direction="maximize")
최적화 실행 objective 함수와 시도 횟수.

세부사항은 이 objective 함수 안에서 지정한다.

study.optimize(objective, n_trials=100)
결과출력
print("Best parameters:", study.best_params)
print("Best final asset value:", study.best_value)
결과 저장?
df = study.trials_dataframe()
print(df)
df.to_csv('optuna_tuning_results.csv', index=False)

3 objective 함수 작성 예편집

def objective(trial):
    # Optuna가 탐색할 파라미터 정의 (범위, 형식, 디폴트는 기존 param_grid 참고)
    param = {
        'param1': trial.suggest_int('param1', 20, 50, step=10),        # 20,30,40,50
        'param2': trial.suggest_int('param2', 10, 50, step=10),        # 10,20,30,40,50
        'param3': trial.suggest_categorical('param3', [0.0025, 0.005, 0.01, 0.015, 0.02]),
        'param4': trial.suggest_categorical('param4', [0.0025, 0.005, 0.01, 0.015, 0.02]),
    }
    # 제약 조건 검사
    if param['param2'] > param['param1']:
        # 조건 만족 안 하면 아예 매우 낮은 점수 리턴해서 무시됨
        return float('-inf')

    test = Test(param=param)
    test.test_determine_and_sell()

    # 평가 지표: 'krw' 자산 기준 최종 자산
    final_assets = test.assets.get('krw', 0)

    # Optuna는 최대화 문제로 가정
    return final_assets

3.1 파라미터 관련편집

의도 설명 방법
정수형 탐색 정해진 범위에서 정수값 제안 trial.suggest_int("param1", 10, 100)
실수형 탐색 연속된 실수형 범위에서 탐색 (log 탐색도 가능)
  • log는 지수 형태로 살필 경우.
  • 이상하게 실수형에서 step 지원을 하지 않는다.(Optuna ≥v2.4.0부터 지원)
  • log=True를 설정하면 로그스케일로 탐색되므로, 매우 작은 값(lr 등)을 다룰 때 효과적이다.
trial.suggest_float("lr", 1e-5, 1e-1, log=True)
범주형 탐색 주어진 리스트에서 선택 trial.suggest_categorical("activation", ["relu", "sigmoid", "tanh"])
조건 체크 불합리한 조합 배제 if param["a"] > param["b"]: return float("-inf")
Prune 조기중단 성과가 나쁘면 조기 중단 raise optuna.TrialPruned() 아래처럼 특수한 상황에서 검증 후 중단할 수 있다.
for step in range(n_steps):
    # 시뮬레이션 한 단계 실행
    result = test.step()

    # 중간 점수 보고
    trial.report(result.partial_score, step)

    # 기준 이하일 경우 prune
    if trial.should_prune():
        raise optuna.TrialPruned()

3.2 결과 관련편집

의도 설명 방법
최적 파라미터 출력 best_trial에 정보 저장됨 study.best_trial.params
최고 성능 출력 파라미터에 따른 최고 성능.

best_trial.value 로 확인

study.best_trial.value
시각화 시도된 값들의 분포 시각화 optuna.visualization.plot_optimization_history(study)
하이퍼파라미터 중요도 시각화 어떤 파라미터가 중요한지 시각화 optuna.visualization.plot_param_importances(study)

4편집

  • 탐색이 너무 느리면 n_trials를 줄이거나, timeout을 걸어서 최대 시간을 제한할 수 있다.
  • 반복 실행을 대비해 storage를 지정하여 SQLite 등에 저장하면 중단 후 이어서 가능하다.
  • 예측 성능 외에도 연산 시간 등 다른 지표를 동시에 고려하고 싶다면 objective 함수 내에서 penalty를 조정하라.