082 모델 앙상블 (blend_models)
키워드: blend_models, 앙상블
개요
blend_models()는 여러 모델의 예측을 결합하여 더 강건한 예측을 만드는 소프트 보팅(Soft Voting) 앙상블입니다. 개별 모델의 약점을 보완하고 전체 성능을 향상시킵니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
앙상블이란?
앙상블 (Ensemble):
여러 모델의 예측을 결합
장점:
- 분산 감소 (더 안정적)
- 과적합 감소
- 성능 향상
종류:
- Voting: 예측 평균/다수결
- Bagging: 데이터 샘플링 + 병렬
- Boosting: 순차적 학습
- Stacking: 메타 모델 사용
기본 사용법
from pycaret.classification import *
from pycaret.datasets import get_data
# 082 데이터 로드
data = get_data('diabetes')
# 082 환경 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 082 여러 모델 생성
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 블렌딩
blended = blend_models([rf, xgb, lgbm])
compare_models와 함께 사용
from pycaret.classification import *
# 082 데이터 설정
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 082 상위 5개 모델 선택
top5 = compare_models(n_select=5)
# 082 상위 모델들 블렌딩
blended = blend_models(top5)
# 082 또는 상위 3개만
top3 = compare_models(n_select=3)
blended_top3 = blend_models(top3)
블렌딩 방법
소프트 보팅 (기본)
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 소프트 보팅: 확률 평균
soft_blend = blend_models([rf, xgb, lgbm], method='soft')
# 082 예측 과정:
# 082 모델1 확률: [0.3, 0.7]
# 082 모델2 확률: [0.4, 0.6]
# 082 모델3 확률: [0.2, 0.8]
# 082 평균: [0.3, 0.7] → 클래스 1
하드 보팅
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 하드 보팅: 다수결
hard_blend = blend_models([rf, xgb, lgbm], method='hard')
# 082 예측 과정:
# 082 모델1: 클래스 1
# 082 모델2: 클래스 0
# 082 모델3: 클래스 1
# 082 다수결: 클래스 1
가중치 설정
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 가중치 부여 (성능 좋은 모델에 더 높은 가중치)
weighted_blend = blend_models(
[rf, xgb, lgbm],
weights=[0.3, 0.4, 0.3] # XGBoost에 더 높은 가중치
)
최적화 기준
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 Accuracy 기준 (기본)
blend_acc = blend_models([rf, xgb, lgbm], optimize='Accuracy')
# 082 F1 기준
blend_f1 = blend_models([rf, xgb, lgbm], optimize='F1')
# 082 AUC 기준
blend_auc = blend_models([rf, xgb, lgbm], optimize='AUC')
튜닝된 모델 블렌딩
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 082 모델 생성 및 튜닝
rf = create_model('rf')
tuned_rf = tune_model(rf, n_iter=20)
xgb = create_model('xgboost')
tuned_xgb = tune_model(xgb, n_iter=20)
lgbm = create_model('lightgbm')
tuned_lgbm = tune_model(lgbm, n_iter=20)
# 082 튜닝된 모델들 블렌딩
blended_tuned = blend_models([tuned_rf, tuned_xgb, tuned_lgbm])
다양한 모델 조합
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 082 다양한 알고리즘 유형 혼합 (추천)
rf = create_model('rf') # 트리 기반
lr = create_model('lr') # 선형
knn = create_model('knn') # 거리 기반
nb = create_model('nb') # 확률 기반
# 082 다양성이 높은 앙상블
diverse_blend = blend_models([rf, lr, knn, nb])
# 082 비슷한 모델만 (비추천)
rf2 = create_model('rf')
et = create_model('et') # Extra Trees
dt = create_model('dt') # Decision Tree
# 082 다양성이 낮음
similar_blend = blend_models([rf2, et, dt])
회귀 문제에서 블렌딩
from pycaret.regression import *
from pycaret.datasets import get_data
# 082 회귀 데이터
data = get_data('boston')
# 082 환경 설정
reg = setup(data, target='medv', session_id=42, verbose=False)
# 082 모델 생성
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
ridge = create_model('ridge')
# 082 블렌딩 (회귀: 예측값 평균)
blended = blend_models([rf, xgb, lgbm, ridge])
# 082 MAE 기준 최적화
blended_mae = blend_models([rf, xgb, lgbm], optimize='MAE')
블렌딩 성능 비교
from pycaret.classification import *
import pandas as pd
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 082 개별 모델
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 블렌딩
blended = blend_models([rf, xgb, lgbm])
# 082 모든 모델 비교
all_models = [rf, xgb, lgbm, blended]
best = compare_models(include=all_models)
블렌딩 모델 저장
from pycaret.classification import *
clf = setup(data, target='Class variable', session_id=42, verbose=False)
rf = create_model('rf')
xgb = create_model('xgboost')
lgbm = create_model('lightgbm')
# 082 블렌딩
blended = blend_models([rf, xgb, lgbm])
# 082 전체 데이터로 재학습
final_model = finalize_model(blended)
# 082 저장
save_model(final_model, 'blended_model')
# 082 로드 및 예측
loaded = load_model('blended_model')
predictions = predict_model(loaded, data=data.head())
블렌딩 vs 개별 모델
from pycaret.classification import *
import matplotlib.pyplot as plt
import numpy as np
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 082 여러 번 실행하여 안정성 확인
results = {'RF': [], 'XGB': [], 'LGBM': [], 'Blend': []}
for i in range(5):
rf = create_model('rf', verbose=False)
xgb = create_model('xgboost', verbose=False)
lgbm = create_model('lightgbm', verbose=False)
blended = blend_models([rf, xgb, lgbm], verbose=False)
# 각 모델의 점수 기록 (실제로는 교차 검증 결과에서 추출)
# 082 블렌딩의 장점:
# 082 - 분산이 더 작음 (안정적)
# 082 - 평균 성능이 개별 모델보다 좋거나 비슷
언제 블렌딩을 사용하나?
블렌딩 추천:
- 여러 모델의 성능이 비슷할 때
- 안정적인 예측이 필요할 때
- 프로덕션 배포 전
- 다양한 알고리즘 유형 혼합 가능할 때
블렌딩 비추천:
- 하나의 모델이 압도적으로 좋을 때
- 해석 가능성이 중요할 때
- 예측 속도가 중요할 때 (여러 모델 실행)
정리
- blend_models(): 여러 모델의 예측 결합
- 소프트 보팅: 확률 평균 (추천)
- 하드 보팅: 다수결
- 가중치로 모델별 중요도 조절
- 다양한 알고리즘 혼합 시 효과적
- 분산 감소, 안정성 향상
다음 글 예고
다음 글에서는 **스태킹 앙상블 (stack_models)**을 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #082