콘텐츠로 이동

앙상블 방법 (Ensemble Methods)

난이도: 중급
선수 지식: 트리 기반 모델, 과적합과 과소적합의 편향-분산 트레이드오프
관련 문서: 트리 기반 모델 | 정규화 이론 | 경사 하강법


개요

앙상블 방법(Ensemble Methods)은 여러 개의 모델을 결합하여 단일 모델보다 더 나은 예측 성능을 달성하는 기법이다. "대중의 지혜(Wisdom of Crowds)" 원리에 기반하며, 다양한 모델의 예측을 합치면 개별 모델의 오류가 상쇄될 수 있다.

주요 앙상블 전략: - 배깅 (Bagging): 분산 감소 - 부스팅 (Boosting): 편향 감소 - 스태킹 (Stacking): 다양한 모델의 장점 결합 - 보팅 (Voting): 단순 결합


핵심 개념

1. 왜 앙상블이 동작하는가?

Condorcet의 배심원 정리 비유

각 모델의 정확도가 50%를 넘고 오류가 독립적이면, 앙상블 크기가 커질수록 정확도는 1에 수렴한다.

편향-분산 분해

\[\text{Error} = \text{Bias}^2 + \text{Variance} + \text{Noise}\]
전략 주로 감소시키는 것
배깅 분산
부스팅 편향 (+ 일부 분산)
스태킹 둘 다

핵심 조건: 다양성 (Diversity)

앙상블이 효과적이려면 개별 모델들이 서로 다른 유형의 오류를 만들어야 한다. 모든 모델이 동일한 오류를 만들면 앙상블의 이점이 없다.


2. 배깅 (Bootstrap Aggregating)

알고리즘

  1. 원본 훈련 데이터에서 부트스트랩 샘플 (복원 추출) \(B\)개 생성
  2. 각 부트스트랩 샘플로 독립적인 모델 훈련 (병렬 가능)
  3. 예측 집계: 다수결 투표(분류) 또는 평균(회귀)
graph TD
    D[원본 데이터] --> B1[부트스트랩 1]
    D --> B2[부트스트랩 2]
    D --> B3[부트스트랩 ...]
    D --> BN[부트스트랩 N]
    B1 --> M1[모델 1]
    B2 --> M2[모델 2]
    B3 --> M3[모델 ...]
    BN --> MN[모델 N]
    M1 --> A[집계<br/>평균/투표]
    M2 --> A
    M3 --> A
    MN --> A
    A --> P[최종 예측]

왜 분산을 줄이는가?

모델들의 분산이 \(\sigma^2\)이고 상관계수가 \(\rho\)일 때:

\[\text{Var}_{\text{ensemble}} = \rho\sigma^2 + \frac{1-\rho}{n}\sigma^2\]
  • \(\rho\)를 줄이면 두 번째 항이 지배적으로, \(n\)이 커질수록 분산 감소
  • 부트스트랩만으로는 \(\rho\)를 크게 줄이지 못함 --> 랜덤 포레스트에서 특성 무작위화를 추가

효과적인 기본 모델

  • 높은 분산, 낮은 편향: 깊은 결정 트리가 이상적
  • 이미 낮은 분산인 모델(선형 모델 등)에는 배깅의 효과가 미미함

3. 부스팅 (Boosting)

알고리즘 개요

이전 모델의 오류에 집중하여 순차적으로 모델을 학습한다.

graph LR
    M1[모델 1] -->|잔차/오류| M2[모델 2]
    M2 -->|잔차/오류| M3[모델 3]
    M3 -->|잔차/오류| M4[모델 ...]
    M4 -->|잔차/오류| MN[모델 N]
    M1 --> S[가중합]
    M2 --> S
    M3 --> S
    M4 --> S
    MN --> S
    S --> P[최종 예측]

AdaBoost (Adaptive Boosting)

  1. 모든 샘플에 동일한 가중치 \(w_i = 1/n\) 부여
  2. 가중 데이터로 약한 학습기 학습
  3. 오분류율 \(\epsilon_m\) 계산
  4. 학습기 가중치: \(\alpha_m = \frac{1}{2}\ln\frac{1-\epsilon_m}{\epsilon_m}\)
  5. 오분류된 샘플의 가중치 증가, 정분류된 샘플의 가중치 감소
  6. 반복

  7. \(\epsilon_m < 0.5\)일 때만 의미가 있음 (무작위보다 나은 학습기)

  8. 최종 예측: \(H(x) = \text{sign}\left(\sum \alpha_m h_m(x)\right)\)

그래디언트 부스팅

손실 함수의 음의 기울기(negative gradient)를 유사 잔차로 사용하여 학습:

\[r_{im} = -\frac{\partial L(y_i, F_{m-1}(x_i))}{\partial F_{m-1}(x_i)}\]
\[F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)\]
  • \(\eta\) (학습률): 각 트리의 기여도 조절
  • MSE 손실의 경우 유사 잔차 = 실제 잔차

확률적 그래디언트 부스팅 (Stochastic Gradient Boosting)

  • 각 반복에서 행(row)과 열(column) 샘플링 추가
  • 분산도 함께 감소시키는 효과

과적합 방지

  • 학습률 축소 (learning rate shrinkage): 작은 \(\eta\) 사용
  • 조기 종료 (early stopping): 검증 손실 모니터링
  • 트리 깊이 제한: 얕은 트리 (3-8)
  • 정규화: L1/L2 (XGBoost의 \(\gamma\), \(\lambda\))

더 자세한 내용은 트리 기반 모델의 XGBoost/LightGBM/CatBoost 섹션 참조.


4. 스태킹 (Stacked Generalization)

알고리즘

  1. Level-0 (기본 학습기): 다양한 모델들을 훈련
  2. 기본 학습기의 예측을 교차 검증으로 생성 (데이터 누출 방지)
  3. Level-1 (메타 학습기): Level-0의 예측을 특성으로 사용하여 최종 모델 학습
graph TD
    subgraph "Level-0: 기본 학습기"
        D[훈련 데이터] --> M1[RF]
        D --> M2[XGBoost]
        D --> M3[SVM]
        D --> M4[LR]
    end
    subgraph "Level-1: 메타 학습기"
        M1 -->|예측값| META[로지스틱 회귀<br/>메타 학습기]
        M2 -->|예측값| META
        M3 -->|예측값| META
        M4 -->|예측값| META
    end
    META --> P[최종 예측]

핵심 포인트

  • 메타 학습기: 보통 단순한 모델 (로지스틱 회귀, 선형 회귀)
  • 교차 검증 필수: Level-0 예측을 훈련 데이터로 직접 만들면 데이터 누출
  • 다양성이 핵심: 기본 학습기는 서로 다른 유형/알고리즘이어야 효과적

블렌딩 (Blending)

  • 스태킹의 간소화된 버전
  • 교차 검증 대신 홀드아웃 세트를 사용하여 Level-0 예측 생성
  • 더 간단하지만 데이터 효율이 낮음

5. 보팅 (Voting)

하드 보팅 (Hard Voting)

다수결 투표: 가장 많은 모델이 예측한 클래스 선택

소프트 보팅 (Soft Voting)

예측 확률의 평균 --> 보통 하드 보팅보다 우수

\[\hat{y} = \arg\max_c \frac{1}{N}\sum_{i=1}^{N} P_i(y=c|\mathbf{x})\]

가중 보팅 (Weighted Voting)

각 모델에 다른 가중치 부여:

\[\hat{y} = \arg\max_c \sum_{i=1}^{N} w_i \cdot P_i(y=c|\mathbf{x})\]

상세 비교

방법 감소 대상 기본 모델 학습 방식 위험
배깅 분산 고분산 (깊은 트리) 병렬 과적합 위험 낮음
부스팅 편향 (주로) 고편향 (얕은 트리) 순차 과적합 가능
스태킹 둘 다 다양한 모델 2단계 복잡, 누출 위험
보팅 분산 다양한 모델 병렬 가장 단순

언제 사용하는가

상황 추천 방법
빠르고 안정적인 성능 향상 배깅 (랜덤 포레스트)
최고 성능이 필요한 경우 부스팅 (XGBoost/LightGBM)
대회/프로덕션 최적화 스태킹
빠른 프로토타이핑 보팅
다양한 모델의 장점 결합 스태킹 또는 보팅
과적합이 걱정되는 경우 배깅

흔한 오해와 함정

1. "배깅은 편향을 줄인다"

  • 아니다. 배깅은 분산만 줄인다. 기본 모델의 편향은 그대로 유지된다.

2. "부스팅은 항상 배깅보다 낫다"

  • 부스팅은 튜닝이 제대로 되지 않으면 과적합되기 쉽다. 데이터가 노이즈가 많으면 배깅이 더 안정적일 수 있다.

3. "스태킹에서 더 많은 레벨이 항상 좋다"

  • 레벨이 많아지면 과적합 위험이 증가하고 복잡도가 급격히 올라간다. 보통 2레벨이면 충분하다.

4. "앙상블의 모든 모델이 좋아야 한다"

  • 개별 모델의 성능보다 다양성이 더 중요하다. 약한 모델이라도 다른 유형의 오류를 만들면 앙상블에 기여한다.

5. "앙상블은 항상 단일 모델보다 낫다"

  • 지연 시간(latency), 해석 가능성, 배포 복잡도 등 실용적 제약을 고려해야 한다. 때로는 잘 튜닝된 단일 모델이 더 적합할 수 있다.

다른 주제와의 연결


자주 묻는 면접 질문

  1. 배깅이 분산을 줄이지만 편향은 줄이지 않는 이유는?
  2. 배깅은 동일한 편향을 가진 모델들의 평균이므로, 편향은 기본 모델과 동일. 독립적 오류의 평균으로 분산만 감소.

  3. 부스팅이 편향을 줄이는 이유는?

  4. 순차적으로 이전 모델의 잔차(오류)에 맞추므로, 반복할수록 편향이 줄어듦

  5. 스태킹이 성능을 해칠 수 있는 경우는?

  6. 기본 모델이 다양하지 않거나, 교차 검증 없이 훈련 예측을 사용하면 데이터 누출로 과적합

  7. 다양한 모델의 앙상블이 더 잘 동작하는 이유는?

  8. 서로 다른 유형의 오류가 상쇄되므로. 동일한 모델의 복제본은 같은 오류를 만들어 앙상블 효과가 없음

  9. 랜덤 포레스트 vs 그래디언트 부스팅의 개념적 차이는?

  10. RF: 병렬, 분산 감소, 깊은 트리, 과적합 위험 낮음
  11. GB: 순차, 편향 감소, 얕은 트리, 세밀한 튜닝 필요

코드 예시

from sklearn.ensemble import (
    BaggingClassifier, AdaBoostClassifier,
    VotingClassifier, StackingClassifier,
    RandomForestClassifier, GradientBoostingClassifier
)
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

# 배깅
bagging = BaggingClassifier(
    estimator=DecisionTreeClassifier(max_depth=None),
    n_estimators=100, max_samples=1.0, bootstrap=True
)
bagging.fit(X_train, y_train)

# AdaBoost
ada = AdaBoostClassifier(
    estimator=DecisionTreeClassifier(max_depth=1),  # 스텀프
    n_estimators=200, learning_rate=0.1
)
ada.fit(X_train, y_train)

# 보팅 (소프트)
voting = VotingClassifier(
    estimators=[
        ('rf', RandomForestClassifier(n_estimators=100)),
        ('gb', GradientBoostingClassifier(n_estimators=100)),
        ('svc', SVC(probability=True))
    ],
    voting='soft'
)
voting.fit(X_train, y_train)

# 스태킹
stacking = StackingClassifier(
    estimators=[
        ('rf', RandomForestClassifier(n_estimators=100)),
        ('gb', GradientBoostingClassifier(n_estimators=100)),
        ('svc', SVC(probability=True))
    ],
    final_estimator=LogisticRegression(),
    cv=5  # 교차 검증으로 Level-0 예측 생성
)
stacking.fit(X_train, y_train)

용어 정리

영어 한국어
Ensemble 앙상블
Bagging (Bootstrap Aggregating) 배깅 (부트스트랩 집합)
Boosting 부스팅
Stacking (Stacked Generalization) 스태킹
Voting 보팅 (투표)
Base Learner 기본 학습기
Meta Learner 메타 학습기
Weak Learner 약한 학습기
Diversity 다양성
Blending 블렌딩

참고 자료

  • Breiman (1996) - "Bagging Predictors"
  • Freund & Schapire (1997) - "A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting" (AdaBoost)
  • Wolpert (1992) - "Stacked Generalization"
  • Dietterich (2000) - "Ensemble Methods in Machine Learning"
  • Zhou (2012) - Ensemble Methods: Foundations and Algorithms