Optuna
둘러보기로 가기
검색하러 가기
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 탐색도 가능)
|
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
를 조정하라.