본문으로 건너뛰기

008 time_budget - 시간 예산의 개념과 활용

키워드: time_budget, 시간 예산

개요

time_budget은 FLAML의 가장 핵심적인 개념입니다. "얼마나 오래 탐색할 것인가"를 결정하며, 이 시간 내에서 FLAML은 최적의 모델과 하이퍼파라미터를 찾습니다.

이 글에서는 time_budget의 동작 원리, 적절한 설정 방법, 그리고 다양한 활용 사례를 알아보겠습니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: flaml[automl], pandas, scikit-learn
pip install flaml[automl] pandas scikit-learn

time_budget이란?

time_budget은 FLAML이 모델 탐색에 사용할 **최대 시간(초)**입니다.

from flaml import AutoML

automl = AutoML()
automl.fit(
X_train, y_train,
task="classification",
time_budget=60 # 60초 동안 최적 모델 탐색
)

다른 AutoML과의 차이

AutoML 도구시간 제어 방식
FLAML정확한 시간 예산 준수
Auto-sklearn대략적인 시간 제한 (초과 가능)
PyCaret시간 제한 없음 (모델 수로 제어)
H2Omax_runtime_secs (대략적)

FLAML은 설정된 시간을 거의 정확하게 준수합니다.

time_budget 동작 원리

1. 저비용 모델부터 시작

FLAML은 학습이 빠른 모델부터 시작합니다:

시작 → lgbm(빠름) → xgboost → random_forest → extra_trees → ...

2. 점진적 탐색

# 008 time_budget=60일 때 내부 동작 (예시)
# 0~10초: lgbm 하이퍼파라미터 탐색
# 10~25초: xgboost 탐색
# 25~40초: random_forest 탐색
# 40~55초: 가장 좋은 모델 추가 튜닝
# 55~60초: 최종 모델 학습

3. 남은 시간 기반 결정

FLAML은 남은 시간을 고려해 탐색 전략을 조정합니다:

남은 시간 많음 → 다양한 모델 시도
남은 시간 적음 → 현재 최적 모델 집중 튜닝

time_budget 설정 가이드

상황별 권장 시간

상황time_budget설명
빠른 테스트10~30초코드 동작 확인용
탐색적 분석30~60초대략적인 성능 파악
일반 학습60~300초적당한 성능과 시간 균형
심층 튜닝300~600초더 나은 성능 추구
프로덕션600초+최상의 성능 필요 시

데이터 크기별 권장 시간

데이터 크기행 수time_budget
소형< 1,00030~60초
중형1,000 ~ 10,00060~180초
대형10,000 ~ 100,000180~600초
초대형> 100,000600초+

실험: time_budget에 따른 성능 변화

from flaml import AutoML
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import time

# 008 데이터 준비
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 008 다양한 time_budget 테스트
budgets = [10, 30, 60, 120, 300]
results = []

for budget in budgets:
start = time.time()

automl = AutoML()
automl.fit(
X_train, y_train,
task="classification",
time_budget=budget,
metric="accuracy",
verbose=0
)

elapsed = time.time() - start
accuracy = 1 - automl.best_loss

results.append({
'budget': budget,
'elapsed': elapsed,
'accuracy': accuracy,
'model': automl.best_estimator
})

print(f"Budget: {budget:3d}초 | 실제: {elapsed:5.1f}초 | "
f"정확도: {accuracy:.4f} | 모델: {automl.best_estimator}")

실행 결과 예시

Budget:  10초 | 실제:  10.2초 | 정확도: 0.9560 | 모델: lgbm
Budget: 30초 | 실제: 30.1초 | 정확도: 0.9670 | 모델: lgbm
Budget: 60초 | 실제: 60.0초 | 정확도: 0.9714 | 모델: lgbm
Budget: 120초 | 실제: 120.1초 | 정확도: 0.9736 | 모델: xgboost
Budget: 300초 | 실제: 300.2초 | 정확도: 0.9758 | 모델: lgbm

인사이트

  • 시간이 늘어날수록 성능이 점진적으로 향상
  • 초반에 성능 향상이 크고, 후반에는 수확 체감
  • 최적 모델은 시간에 따라 달라질 수 있음

고급 활용: time_budget 조합

max_iter와 함께 사용

automl.fit(
X_train, y_train,
task="classification",
time_budget=120, # 최대 120초
max_iter=50 # 또는 최대 50번 반복
)
# 008 둘 중 먼저 도달하는 조건에서 종료

모델별 시간 할당

# 008 특정 모델에 집중
automl.fit(
X_train, y_train,
task="classification",
time_budget=60,
estimator_list=["lgbm", "xgboost"] # 2개 모델에 시간 집중
)

단계별 시간 할당

# 1단계: 빠른 탐색으로 후보 모델 파악
automl1 = AutoML()
automl1.fit(X_train, y_train, task="classification", time_budget=30)
best_model = automl1.best_estimator
print(f"1단계 최적: {best_model}")

# 2단계: 최적 모델에 집중 튜닝
automl2 = AutoML()
automl2.fit(
X_train, y_train,
task="classification",
time_budget=120,
estimator_list=[best_model] # 해당 모델만 집중 튜닝
)
print(f"2단계 최적: {automl2.best_estimator}")

time_budget 최적화 전략

전략 1: 점진적 증가

def find_optimal_budget(X_train, y_train, X_val, y_val):
"""점진적으로 시간 예산을 늘려 최적 지점 찾기"""
from sklearn.metrics import accuracy_score

budgets = [30, 60, 120, 240, 480]
prev_score = 0

for budget in budgets:
automl = AutoML()
automl.fit(X_train, y_train, task="classification",
time_budget=budget, verbose=0)

score = accuracy_score(y_val, automl.predict(X_val))
improvement = score - prev_score

print(f"Budget: {budget}초 | 정확도: {score:.4f} | 향상: {improvement:.4f}")

# 향상이 0.5% 미만이면 종료
if improvement < 0.005 and budget > 60:
print(f"최적 time_budget: {budget}초")
return budget

prev_score = score

return budgets[-1]

전략 2: 리소스 기반 설정

import os
import psutil

def get_recommended_budget(X):
"""시스템 리소스와 데이터 크기 기반 time_budget 추천"""
n_samples, n_features = X.shape
cpu_count = os.cpu_count()
memory_gb = psutil.virtual_memory().total / (1024**3)

# 기본 예산 계산
base_budget = 60

# 데이터 크기에 따른 조정
if n_samples > 100000:
base_budget *= 3
elif n_samples > 10000:
base_budget *= 2

# CPU 코어에 따른 조정
if cpu_count >= 8:
base_budget *= 0.8 # 빠른 처리 가능

return int(base_budget)

# 008 사용
budget = get_recommended_budget(X_train)
print(f"권장 time_budget: {budget}초")

주의사항

1. 너무 짧은 time_budget

# 008 비권장: 너무 짧음
automl.fit(X, y, task="classification", time_budget=5)
# 008 충분한 탐색이 어려움

2. 대용량 데이터에서 짧은 예산

# 008 데이터가 크면 시간도 늘려야 함
large_X = np.random.rand(100000, 50) # 10만 행
large_y = np.random.randint(0, 2, 100000)

# 008 최소 300초 이상 권장
automl.fit(large_X, large_y, task="classification", time_budget=300)

3. 재현성 확보

# 008 seed 설정으로 동일 시간 예산에서 동일 결과
automl.fit(
X, y,
task="classification",
time_budget=60,
seed=42 # 재현성
)

정리

  • time_budget은 FLAML이 탐색에 사용할 **최대 시간(초)**입니다.
  • FLAML은 설정된 시간을 거의 정확하게 준수합니다.
  • 시간이 늘어날수록 성능이 향상되지만 수확 체감이 있습니다.
  • 데이터 크기와 목적에 따라 적절한 예산을 설정하세요.
  • max_iter와 조합하면 더 유연한 제어가 가능합니다.

다음 글 예고

다음 글에서는 metric - 최적화 지표 설정하기에 대해 알아보겠습니다. 분류와 회귀에서 사용할 수 있는 다양한 평가 지표를 다룹니다.


FLAML AutoML 마스터 시리즈 #008