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