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 | 시간 제한 없음 (모델 수로 제어) |
| H2O | max_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,000 | 30~60초 |
| 중형 | 1,000 ~ 10,000 | 60~180초 |
| 대형 | 10,000 ~ 100,000 | 180~600초 |
| 초대형 | > 100,000 | 600초+ |
실험: 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