Programming

(Bayesian Optimization 1편) GridSearch · RandomSearch · Bayesian Optimization 개념 완전 정리

Lucas.Kim 2025. 12. 22. 13:25
반응형

1. 하이퍼 파라미터 튜닝이란?

머신러닝 모델은 크게 두 가지 종류의 파라미터를 가집니다.

  • 모델 파라미터(Parameter)
    → 학습 과정에서 데이터로부터 자동으로 학습되는 값
    → 예: 회귀 계수, 트리의 분기 기준
  • 하이퍼 파라미터(Hyper Parameter)
    → 사람이 직접 설정해야 하는 값
    → 예: max_depth, learning_rate, n_estimators

👉 하이퍼 파라미터 튜닝이란
모델의 예측 성능을 최대화하기 위해
이 하이퍼 파라미터들의 최적 조합을 찾는 과정입니다.

2. 대표적인 하이퍼 파라미터 튜닝 방법

(1) 수동 튜닝(Manual Tuning)

  • 사람이 경험과 직관에 의존해 값 조정
  • 빠르지만 재현성과 체계성 부족
  • 실무 초반 또는 베이스라인 설정용으로 사용

(2) GridSearch

  • 사용자가 지정한 모든 파라미터 조합을 전부 탐색
  • 가장 직관적인 방법
max_depth = [3, 5, 7]
learning_rate = [0.01, 0.1]

→ 총 경우의 수 = 3 × 2 = 6

GridSearch의 한계

  • 파라미터 개수가 많아질수록 경우의 수 폭발
  • Gradient Boosting 계열(XGBoost, LGBM)은
    튜닝 파라미터가 많고 범위도 넓음
  • 데이터가 크면 시간·자원 비용이 매우 큼

👉 데이터가 작을 때만 유리

(3) RandomizedSearch

  • GridSearch의 모든 조합이 아니라
    무작위로 일부 조합만 샘플링
  • GridSearch를 랜덤하게 수행하는 방식

특징

  • GridSearch보다 빠름
  • 대규모 데이터에서 상대적으로 효율적
  • 하지만 탐색 과정에서 이전 결과를 활용하지는 못함

👉 GridSearch와 RandomSearch의 공통적인 한계

“이미 탐색한 결과를 바탕으로 더 똑똑하게 탐색하지 못함”

3. Bayesian Optimization이 필요한 순간

다음과 같은 상황에서는
GridSearch / RandomSearch가 적합하지 않습니다.

  • 가능한 최소 횟수로 최적 해를 찾아야 할 때
  • 한 번의 학습 비용이 매우 클 때
  • 하이퍼 파라미터 탐색 범위가 넓을 때
  • Gradient Boosting 계열 모델을 튜닝할 때

👉 이때 사용하는 것이 **베이지안 최적화(Bayesian Optimization)**입니다.

4. 베이지안 최적화(Bayesian Optimization)란?

베이지안 최적화는

미지의 함수(블랙박스 함수)의 최소 또는 최대값을
가능한 적은 반복으로 찾아내는 최적화 기법

입니다.

핵심 아이디어

  • 이전 시도 결과를 기억
  • 그 정보를 기반으로
    “다음에는 어디를 시도하는 게 가장 좋을까?”를 계산
  • 무작위가 아니라 확률적으로 가장 유망한 지점을 선택

5. 베이지안 최적화의 구성 요소

(1) 대체 모델(Surrogate Model)

  • 실제 목적 함수(블랙박스 함수)를 대신해
    성능을 예측하는 확률 모델
  • 보통 Gaussian Process 또는 TPE 사용

(2) 획득 함수(Acquisition Function)

  • “다음에 어떤 하이퍼 파라미터를 시도할지” 결정
  • 탐험(Exploration)과 활용(Exploitation)의 균형 유지

6. 베이지안 최적화 수행 절차

1️⃣ 초기에는 랜덤하게 하이퍼 파라미터 샘플링
2️⃣ 결과를 바탕으로 대체 모델이 함수 형태를 추정
3️⃣ 획득 함수가 다음 시도 지점 계산
4️⃣ 새 결과를 다시 반영해 모델 개선
5️⃣ 이 과정을 반복하며 최적 해에 수렴

7. 베이지안 최적화 주요 라이브러리

  • HyperOpt
  • Bayesian Optimization
  • Optuna

👉 이번 글에서는 HyperOpt를 사용합니다.

8. HyperOpt 주요 구성 요소

HyperOpt는 다음 3가지를 반드시 정의해야 합니다.

1️⃣ 입력값(하이퍼 파라미터) 범위
2️⃣ 목적 함수(Objective Function)
3️⃣ 최적화 실행 함수 fmin()

9. HyperOpt 실습 – 개념 이해용 예제

9-1. 라이브러리 버전 확인

import hyperopt
print(hyperopt.__version__)

9-2. 하이퍼 파라미터 탐색 공간 정의

from hyperopt import hp

# x: -10 ~ 10, 간격 1
# y: -15 ~ 15, 간격 1
search_space = {
    'x': hp.quniform('x', -10, 10, 1),
    'y': hp.quniform('y', -15, 15, 1)
}

# 목적 함수의 입력값으로 전달됨
print(search_space)

🔹 hp.quniform

  • 균등 분포에서 값 샘플링
  • 마지막 인자는 step(간격)

9-3. 목적 함수(Objective Function) 정의

from hyperopt import STATUS_OK

# 블랙박스 함수
# 입력값 x, y를 받아 하나의 loss 값 반환
def object_func(search_space):
    x = search_space['x']
    y = search_space['y']
    
    # 예제용 수식 (임의 설정)
    retval = x**2 - 20 * y
    
    return retval

👉 HyperOpt는
반환값(loss)을 최소화하는 방향으로 최적화합니다.

9-4. fmin()으로 최적화 실행 (5회)

from hyperopt import fmin, tpe, Trials
import numpy as np

# 모든 trial 결과 저장
trial_val = Trials()

# 5번의 시도만으로 최적값 탐색
best_01 = fmin(
    fn=object_func,
    space=search_space,
    algo=tpe.suggest,           # TPE 알고리즘 사용
    max_evals=5,                # 시도 횟수
    trials=trial_val,
    rstate=np.random.default_rng(seed=0)
)

print(f"Best : {best_01}")

9-5. 시도 횟수 증가 (20회)

best_02 = fmin(
    fn=object_func,
    space=search_space,
    algo=tpe.suggest,
    max_evals=20,
    trials=trial_val,
    rstate=np.random.default_rng(seed=0)
)

print(f"Best : {best_02}")

👉 시도 횟수가 늘어날수록
더 좋은 해로 수렴하는 것을 확인할 수 있습니다.

9-6. Trial 결과 확인

# 각 trial의 loss 값 확인
print(trial_val.results)

# 각 trial에서 사용된 x, y 값 확인
print(trial_val.vals)

9-7. 결과를 DataFrame으로 정리

import pandas as pd

# loss 값만 추출
losses = [v['loss'] for v in trial_val.results]

# 결과 정리
result_df = pd.DataFrame({
    'x': trial_val.vals['x'],
    'y': trial_val.vals['y'],
    'loss': losses
})

result_df

👉 어떤 입력값 조합이
어떤 성능(loss)을 냈는지 한눈에 확인 가능합니다.

10. 정리 및 다음 글 예고

이번 글 핵심 요약

  • GridSearch는 데이터가 작을 때 유리
  • RandomSearch는 대규모 데이터에서 상대적으로 효율적
  • Bayesian Optimization은
    최소 횟수로 최적 해를 찾는 가장 똑똑한 방법
  • HyperOpt는 베이지안 최적화를 실무적으로 구현한 라이브러리

 

반응형