4,681 바이트 추가됨
, 2025년 7월 31일 (목)
== 개요 ==
하이퍼파라미터 최적화를 위한 자동화 프레임워크. 주로 머신러닝, 백테스트 전략, 파라미터 탐색 등에서 "최적의 조합"을 빠르게 찾기 위한 용도로 사용된다.
=== 특징 ===
* 목표함수(objective)에 따라 자동으로 파라미터를 제안(suggest)한다.
* 탐색 알고리즘으로 베이지안 최적화(TPE)나 CMA-ES 등을 사용한다.
* 실패하거나 부적절한 조합은 건너뛰는 Pruning 기능을 제공한다.
* 시각화나 저장, 로깅, 중단 후 재개 등의 기능도 지원한다.
== 사용법 ==
=== 준비 ===
{| class="wikitable"
!의도
!설명
!비고
|-
|설치
|
|pip install optuna
|}
=== 기초 사용 ===
{| class="wikitable"
!의도
!설명
!방법
|-
|임포트
|
|import optuna
|-
|스터디 생성
|최대화 / 최소화 여부 설정 포함.
|study = optuna.create_study(direction="maximize")
|-
|최적화 실행
|objective 함수와 시도 횟수.
세부사항은 이 objective 함수 안에서 지정한다.
|study.optimize(objective, n_trials=100)
|-
|결과출력
|
|<syntaxhighlight lang="python3">
print("Best parameters:", study.best_params)
print("Best final asset value:", study.best_value)
</syntaxhighlight>
|-
|결과 저장?
|
|<syntaxhighlight lang="python3">
df = study.trials_dataframe()
print(df)
df.to_csv('optuna_tuning_results.csv', index=False)
</syntaxhighlight>
|}
== objective 함수 작성 예 ==
<syntaxhighlight lang="python3">
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
</syntaxhighlight>
=== 파라미터 관련 ===
{| class="wikitable"
!의도
!설명
!방법
|-
|정수형 탐색
|정해진 범위에서 정수값 제안
|trial.suggest_int("param1", 10, 100)
|-
|실수형 탐색
|연속된 실수형 범위에서 탐색 (log 탐색도 가능)
* log는 지수 형태로 살필 경우.
* 이상하게 실수형에서 step 지원을 하지 않는다.(Optuna ≥v2.4.0부터 지원)
* <code>log=True</code>를 설정하면 로그스케일로 탐색되므로, 매우 작은 값(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()
아래처럼 특수한 상황에서 검증 후 중단할 수 있다.<syntaxhighlight lang="python3">
for step in range(n_steps):
# 시뮬레이션 한 단계 실행
result = test.step()
# 중간 점수 보고
trial.report(result.partial_score, step)
# 기준 이하일 경우 prune
if trial.should_prune():
raise optuna.TrialPruned()
</syntaxhighlight>
|}
=== 결과 관련 ===
{| class="wikitable"
!의도
!설명
!방법
|-
|최적 파라미터 출력
|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)
|}
== 팁 ==
* 탐색이 너무 느리면 <code>n_trials</code>를 줄이거나, <code>timeout</code>을 걸어서 최대 시간을 제한할 수 있다.
* 반복 실행을 대비해 <code>storage</code>를 지정하여 SQLite 등에 저장하면 중단 후 이어서 가능하다.
* 예측 성능 외에도 연산 시간 등 다른 지표를 동시에 고려하고 싶다면 objective 함수 내에서 <code>penalty</code>를 조정하라.
[[분류:라이브러리]]