susinlee 님의 블로그

앙상블 본문

학습/머신러닝

앙상블

susinlee 2025. 2. 2. 00:34

앙상블

  • 여러 개의 머신러닝 모델을 조합하여 더 나은 예측 성능을 얻는 기법
  • 하나의 모델보다 여러 개의 모델을 조합하면 일반적으로 과적합 방지 및 성능 향상 효과를 얻을 수 있음
  • 대표적인 기법: 보팅, 배깅, 부스팅, 스태킹

1. 보팅(Voting) 

  • 서로 다른 모델을 여러 개 조합하여 최종 예측을 하는 방법
  • 특징
    • 여러 개의 다양한 모델을 조합하여 예측
    • 모델들이 서로 다른 알고리즘을 사용
    • 예측 방식에 따라 하드 보팅과 소프트 보팅이 있음
  • 보팅의 종류
    1. 하드 보팅 → 다수결 방식
      • 각 모델이 예측한 결과 중 가장 많이 선택된 클래스를 최종 결과로 함
    2. 소프트 보팅 → 확률 평균 방식
      • 각 모델이 예측한 확률 값의 평균을 계산한 후, 가장 높은 확률을 가진 클래스를 선택
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier

from sklearn.datasets import load_iris

# 데이터 셋 로드
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 개별 모델 정의
xgb = XGBClassifier()
lgbm = LGBMClassifier(verbose=-1)
catboost = CatBoostClassifier(verbose=0)
rf = RandomForestClassifier()

# 보팅 분류기 (소프트 보팅)
voting_clf = VotingClassifier(
    estimators=[ 
        ('xgb', xgb), # 앞의 모델 이름은 자유롭게 써도 됨
        ('lgbm', lgbm), 
        ('catboost', catboost),
        ('rf', rf)
    ],
    voting='soft' # 확률 기반 평균, 'hard': 최빈값을 예측
    # weight=[3, 2, 2, 1] # XGBoost에 높은 가중치 부여
)

# 모델 학습
voting_clf.fit(X_train, y_train)

# 예측 및 평가
y_pred = voting_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Voting Classifier Accuracy: {accuracy:.4f}')

# 개별 모델과 비교
models = {
    'XGBoost': xgb,
    'LightGBM': lgbm,
    'CatBoost': catboost,
    'RandomForest': rf
}

for name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    acc = accuracy_score(y_test, y_pred)
    print(f'{name} Accuracy: {acc:.4f}')

 

 

2. 배깅(Bagging) 

  • 동일한 모델을 여러 개 훈련하여 예측 결과를 평균 내는 방식
  • 배깅의 특징
    • 같은 모델을 여러 개 훈련하지만, 훈련 데이터가 서로 다름
    • 데이터 샘플링 시 중복 허용(bootstrap sampling) → 일부 데이터가 반복적으로 선택될 수 있음
    • 개별 모델을 독립적으로 학습하여 분산을 줄이는 효과가 있음
from sklearn.ensemble import BaggingClassifier

# 배깅 분류기 생성 (기본 모델: 결정 트리)
bagging_clf = BaggingClassifier(
    estimator=RandomForestClassifier(),
    n_estimators=10, # 10개의 모델 사용
    bootstrap=True, # 중복 샘플링 허용
    random_state=42
)

# 모델 학습
bagging_clf.fit(X_train, y_train)

# 예측 및 평가
y_pred = bagging_clf.predict(X_test)
print(f'Bagging Classifier Accuracy: {accuracy_score(y_test, y_pred):.4f}')

 

  보팅 배깅
모델 서로 다른 모델 사용 가능 같은 모델을 여러 개 사용
데이터 샘플링 원본 데이터 그대로 사용 데이터 샘플을 부트스트랩 샘플링 (중복 포함)
결합 방식 다수결(hard)
또는 확률 평균(soft)
평균 또는 다수결
대표적인 알고리즘 VotingClassifier BaggingClassifier

 

재밌는 점

랜덤포레스트 자체가 배깅을 기반으로 한 모델임에도  배깅에 랜덤포레스트를 기본 모델로 사용할 수 있음!

배깅에 배깅...

→ 효율적이지 않으며 랜덤포레스트 n_estimators 파라미터에 높은 값을 쓰는 게 더 낫다!

 

 

2. 스태킹(Stacking)

  • 여러 개의 서로 다른 개별 모델(기본 학습기, Base Models)을 훈련
  • 각 모델의 예측 결과를 새로운 데이터셋(메타 피처, Meta Features)으로 변환
  • 이 메타 피처를 이용해 최종 예측을 수행하는 메타 모델(Meta Learner)을 훈련

 

  • 1단계 모델
    • 서로 다른 머신러닝 알고리즘을 사용하여 다양한 특성을 학습
    • 예: 선형 회귀, 랜덤 포레스트, XGBoost 등
  • 2단계 모델
    • 1단계 모델이 생성한 예측값을 입력으로 받아 최종 예측을 수행
    • 일반적으로 선형 회귀, 로지스틱 회귀, 신경망 등이 사용됨
    • 역할: 1단계 모델의 약점을 보완하고, 가장 적절한 조합을 찾음

 

  • 다양한 모델 조합 가능
  • 개별 모델보다 성능 향상 기능
  • 과적합 위험 존재 → 교차 검증 필수
  • 훈련 시간이 길고 계산 비용이 큼
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 데이터 준비
X, y = load_some_data()  # 데이터셋 로드 (사용자 정의 함수)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 1단계 모델 (Base Models)
model_1 = RandomForestClassifier(n_estimators=100, random_state=42)
model_2 = GradientBoostingClassifier(n_estimators=100, random_state=42)

# 모델 훈련
model_1.fit(X_train, y_train)
model_2.fit(X_train, y_train)

# 1단계 모델 예측값 생성 (메타 데이터)
meta_train = np.column_stack([
    model_1.predict_proba(X_train)[:, 1],
    model_2.predict_proba(X_train)[:, 1]
])

meta_test = np.column_stack([
    model_1.predict_proba(X_test)[:, 1],
    model_2.predict_proba(X_test)[:, 1]
])

# 2단계 모델 (Meta Model)
meta_model = LogisticRegression()
meta_model.fit(meta_train, y_train)

# 최종 예측
final_pred = meta_model.predict(meta_test)

# 성능 평가
print("Stacking Accuracy:", accuracy_score(y_test, final_pred))

 

  • 스태킹은 서로 다른 모델을 결합하여 최적의 조합을 찾는 앙상블 기법
  • 기본 모델의 예측값을 메타 모델이 학습하여 최종 예측을 수행
  • 계산 비용이 크지만, 성능 향상 가능성이 높음
  • 데이터 분할 및 교차 검증을 통해 과적합을 방지하는 것이 중요

'학습 > 머신러닝' 카테고리의 다른 글

k-NN, 선형 모델, 나이브 베이즈 분류  (0) 2025.02.09
손실, 비용, 목적 함수  (0) 2025.02.09
결측치  (0) 2025.01.30
회귀  (0) 2025.01.30
분류  (0) 2025.01.29