본문으로 건너뛰기

081 하이퍼파라미터 튜닝 (tune_model)

키워드: tune_model, 하이퍼파라미터

개요

tune_model()은 PyCaret에서 하이퍼파라미터를 자동으로 최적화하는 함수입니다. 그리드 서치, 랜덤 서치, 베이지안 최적화 등 다양한 튜닝 방법을 지원합니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

하이퍼파라미터란?

하이퍼파라미터 vs 파라미터:

파라미터 (Parameters):
- 학습 과정에서 자동 결정
- 예: 회귀 계수, 트리 분할 기준

하이퍼파라미터 (Hyperparameters):
- 학습 전 사용자가 설정
- 예: 학습률, 트리 개수, 정규화 강도
- 모델 성능에 큰 영향

기본 사용법

from pycaret.classification import *
from pycaret.datasets import get_data

# 081 데이터 로드
data = get_data('diabetes')

# 081 환경 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 081 모델 생성
rf = create_model('rf')

# 081 튜닝
tuned_rf = tune_model(rf)

# 081 기본 모델 vs 튜닝 모델 비교
print("기본 모델 파라미터:")
print(rf.get_params())
print("\n튜닝 모델 파라미터:")
print(tuned_rf.get_params())

튜닝 옵션

n_iter: 탐색 횟수

from pycaret.classification import *

# 081 데이터 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 적은 탐색 (빠름)
tuned_fast = tune_model(rf, n_iter=10)

# 081 많은 탐색 (느림, 더 좋은 결과 가능)
tuned_thorough = tune_model(rf, n_iter=100)

optimize: 최적화 기준

from pycaret.classification import *

# 081 데이터 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 정확도 기준 최적화 (기본)
tuned_acc = tune_model(rf, optimize='Accuracy')

# 081 F1 기준 최적화
tuned_f1 = tune_model(rf, optimize='F1')

# 081 AUC 기준 최적화
tuned_auc = tune_model(rf, optimize='AUC')

# 081 Recall 기준 (불균형 데이터)
tuned_recall = tune_model(rf, optimize='Recall')

search_library: 탐색 라이브러리

from pycaret.classification import *

# 081 데이터 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 scikit-learn (기본)
tuned_sklearn = tune_model(rf, search_library='scikit-learn')

# 081 Optuna (베이지안 최적화)
tuned_optuna = tune_model(rf, search_library='optuna')

# 081 scikit-optimize (베이지안)
tuned_skopt = tune_model(rf, search_library='scikit-optimize')

search_algorithm: 탐색 알고리즘

from pycaret.classification import *

# 081 데이터 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 랜덤 서치 (기본)
tuned_random = tune_model(rf, search_algorithm='random')

# 081 그리드 서치
tuned_grid = tune_model(rf, search_algorithm='grid')

# 081 베이지안 (scikit-optimize 사용 시)
tuned_bayes = tune_model(rf, search_library='scikit-optimize', search_algorithm='bayesian')

커스텀 파라미터 그리드

from pycaret.classification import *

# 081 데이터 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 커스텀 그리드 정의
custom_grid = {
'n_estimators': [50, 100, 200, 300],
'max_depth': [3, 5, 7, 10, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}

# 081 커스텀 그리드로 튜닝
tuned_custom = tune_model(rf, custom_grid=custom_grid)

print("최적 파라미터:")
print(tuned_custom.get_params())

모델별 튜닝 예제

Random Forest

from pycaret.classification import *

clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

rf_grid = {
'n_estimators': [100, 200, 300, 500],
'max_depth': [5, 10, 15, 20, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4],
'max_features': ['sqrt', 'log2', None]
}

tuned_rf = tune_model(rf, custom_grid=rf_grid, n_iter=50)

XGBoost

from pycaret.classification import *

clf = setup(data, target='Class variable', session_id=42, verbose=False)
xgb = create_model('xgboost')

xgb_grid = {
'learning_rate': [0.01, 0.05, 0.1, 0.2],
'n_estimators': [100, 200, 300],
'max_depth': [3, 5, 7, 10],
'min_child_weight': [1, 3, 5],
'subsample': [0.7, 0.8, 0.9, 1.0],
'colsample_bytree': [0.7, 0.8, 0.9, 1.0],
'gamma': [0, 0.1, 0.2]
}

tuned_xgb = tune_model(xgb, custom_grid=xgb_grid, n_iter=50)

LightGBM

from pycaret.classification import *

clf = setup(data, target='Class variable', session_id=42, verbose=False)
lgbm = create_model('lightgbm')

lgbm_grid = {
'learning_rate': [0.01, 0.05, 0.1],
'n_estimators': [100, 200, 300],
'num_leaves': [15, 31, 63, 127],
'max_depth': [-1, 5, 10, 15],
'min_child_samples': [10, 20, 30],
'subsample': [0.7, 0.8, 0.9, 1.0],
'colsample_bytree': [0.7, 0.8, 0.9, 1.0],
'reg_alpha': [0, 0.1, 0.5],
'reg_lambda': [0, 0.1, 0.5]
}

tuned_lgbm = tune_model(lgbm, custom_grid=lgbm_grid, n_iter=50)

튜닝 결과 분석

from pycaret.classification import *
import pandas as pd

clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 튜닝
tuned_rf = tune_model(rf, n_iter=30, return_tuner=True)

# 081 반환된 튜너에서 상세 결과 확인 (scikit-learn)
# 081 tuner = tuned_rf[1] # return_tuner=True일 때

# 081 최적 점수
# 081 print(f"최적 점수: {tuner.best_score_:.4f}")

# 081 모든 결과
# 081 results = pd.DataFrame(tuner.cv_results_)
# 081 print(results[['params', 'mean_test_score', 'rank_test_score']].head(10))

조기 종료 (Early Stopping)

from pycaret.classification import *

clf = setup(data, target='Class variable', session_id=42, verbose=False)
xgb = create_model('xgboost')

# 081 early_stopping 지원 모델에서 사용
tuned_xgb = tune_model(
xgb,
n_iter=50,
early_stopping=True, # 조기 종료 활성화
early_stopping_max_iters=10 # 최대 반복
)

여러 모델 튜닝

from pycaret.classification import *

clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 081 여러 모델 생성 및 튜닝
models_to_tune = ['rf', 'xgboost', 'lightgbm', 'et']
tuned_models = []

for model_id in models_to_tune:
model = create_model(model_id)
tuned = tune_model(model, n_iter=20)
tuned_models.append(tuned)
print(f"{model_id} 튜닝 완료")

# 081 최적 모델 선택
best_tuned = compare_models(include=tuned_models)

회귀 문제 튜닝

from pycaret.regression import *
from pycaret.datasets import get_data

# 081 회귀 데이터
data = get_data('boston')

# 081 환경 설정
reg = setup(data, target='medv', session_id=42, verbose=False)

# 081 모델 생성 및 튜닝
rf = create_model('rf')

# 081 MAE 기준 최적화
tuned_rf = tune_model(rf, optimize='MAE', n_iter=30)

# 081 R2 기준 최적화
tuned_rf_r2 = tune_model(rf, optimize='R2', n_iter=30)

튜닝 전략

효과적인 튜닝 전략:

1. 기본 모델 평가
- create_model()로 기준 성능 확인

2. 중요 파라미터 파악
- 모델별 핵심 파라미터 우선

3. 넓은 범위 → 좁은 범위
- 처음: 넓은 범위, 적은 반복
- 나중: 좁은 범위, 많은 반복

4. 랜덤 → 베이지안
- 랜덤 서치로 대략적 범위 파악
- 베이지안으로 정밀 탐색

5. 교차 검증 폴드 조정
- 데이터 적으면 폴드 증가
- 계산 비용 고려

성능 vs 시간 트레이드오프

from pycaret.classification import *
import time

clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')

# 081 빠른 튜닝 (프로토타입)
start = time.time()
fast_tuned = tune_model(rf, n_iter=10, optimize='Accuracy')
fast_time = time.time() - start
print(f"빠른 튜닝: {fast_time:.1f}초")

# 081 깊은 튜닝 (프로덕션)
start = time.time()
deep_tuned = tune_model(rf, n_iter=50, optimize='Accuracy')
deep_time = time.time() - start
print(f"깊은 튜닝: {deep_time:.1f}초")

정리

  • tune_model(): 하이퍼파라미터 자동 최적화
  • n_iter: 탐색 횟수 (많을수록 정밀)
  • optimize: 최적화 기준 (Accuracy, F1, AUC 등)
  • search_library: optuna, scikit-optimize
  • custom_grid: 직접 탐색 범위 지정
  • 모델별 중요 파라미터 이해 필요

다음 글 예고

다음 글에서는 **모델 앙상블 (blend_models)**을 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #081