콘텐츠로 이동

앙상블 방법 (Ensemble Methods)

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


핵심 요약: 앙상블 방법(Ensemble Methods)은 모델 여러 개를 합치면 하나보다 더 정확하다는 원리이다. 배깅(Bagging)은 분산(Variance)을 줄이고, 부스팅(Boosting)은 편향(Bias)을 줄이며, 스태킹(Stacking)은 다양한 모델의 장점을 결합한다. “대중의 지혜(Wisdom of Crowds)“가 핵심이다.

핵심 용어 미리보기:

  • 배깅 (Bagging, Bootstrap Aggregating): 데이터를 복원 추출하여 여러 모델을 병렬로 학습하고 평균/투표하는 기법. 분산(Variance) 감소가 목적
  • 부스팅 (Boosting): 이전 모델이 틀린 데이터에 가중치를 높여 순차적으로 학습하는 기법. 편향(Bias) 감소가 목적
  • 스태킹 (Stacking): 여러 모델의 예측을 새로운 특성으로 사용하여 메타 모델(Meta Model)을 학습하는 2단계 앙상블
  • 약한 학습기 (Weak Learner): 무작위 추측보다 약간만 나은 모델 (예: 깊이 1인 결정 트리, Decision Stump)

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

주요 앙상블 전략:

  • 배깅 (Bagging): 분산 감소
  • 부스팅 (Boosting): 편향 감소
  • 스태킹 (Stacking): 다양한 모델의 장점 결합
  • 보팅 (Voting): 단순 결합

앙상블 방법의 지적 뿌리는 놀랍게도 18세기 프랑스 혁명 시대까지 거슬러 올라간다. 1785년 수학자 콩도르세(Condorcet)는 “배심원 정리(Jury Theorem)“를 증명하였다: 개별 배심원의 정답 확률이 50%를 넘으면, 다수결로 판단하는 배심원단의 정확도는 인원이 늘어날수록 1에 수렴한다. 이것이 바로 “군중의 지혜(Wisdom of Crowds)“의 수학적 기초이다.

이 원리가 머신러닝에 본격적으로 적용된 것은 200년 뒤이다. 1996년 Leo Breiman이 Bagging을 발표하면서 부트스트랩 샘플링으로 다양한 모델을 만들어 평균하면 분산이 줄어든다는 것을 보였고, 같은 해 랜덤 포레스트(Random Forest)의 초기 형태가 제안되었다. 1997년 Freund와 Schapire가 AdaBoost를 발표하며 “약한 학습기를 순차적으로 결합하여 강한 학습기를 만든다”는 부스팅의 패러다임을 열었다. AdaBoost는 2003년 괴델상(Godel Prize)을 수상하며 그 이론적 중요성을 인정받았다.

이후 Friedman (2001)의 Gradient Boosting, Chen & Guestrin (2016)의 XGBoost, Ke et al. (2017)의 LightGBM으로 이어지는 부스팅의 혁신은 Kaggle을 비롯한 ML 대회에서 앙상블이 사실상 표준이 되는 결과를 낳았다.

콩도르세 배심원 정리 (1785) → Bagging (1996) → AdaBoost (1997) → Gradient Boosting (2001) → XGBoost (2016) → LightGBM (2017). 핵심 통찰은 시종일관 동일하다: 다양성 있는 다수의 판단은 소수 전문가의 판단을 능가한다.


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

3명의 전문가가 각각 독립적으로 70% 정확도(Accuracy)로 예측한다고 하자. 다수결(Majority Vote)의 정확도는?

  • 3명 모두 정답: 0.73=0.3430.7^3 = 0.343
  • 2명 정답, 1명 오답: (32)×0.72×0.3=3×0.147=0.441\binom{3}{2} \times 0.7^2 \times 0.3 = 3 \times 0.147 = 0.441
  • 다수결 정답 확률: 0.343+0.441=0.7840.343 + 0.441 = 0.784

이미 78.4%로 올라갔다! 5명이면 0.8370.837(83.7%), 101명이면 약 99.9%에 근접한다. 핵심 조건은 각 전문가의 오류(Error)가 서로 독립(Independent)이어야 한다는 것이다.

Error=Bias2+Variance+Noise\text{Error} = \text{Bias}^2 + \text{Variance} + \text{Noise}

전략주로 감소시키는 것
배깅분산
부스팅편향 (+ 일부 분산)
스태킹둘 다

앙상블이 효과적이려면 개별 모델들이 서로 다른 유형의 오류를 만들어야 한다. 모든 모델이 동일한 오류를 만들면 앙상블의 이점이 없다. 비유하자면, 약한 학습기 100개의 합의가 강한 학습기 1개보다 나은 이유는 “다양성” 때문이다. 100명이 전부 같은 실수를 한다면 합쳐도 의미가 없다. 마치 같은 교과서로만 공부한 학생 100명보다, 서로 다른 관점에서 공부한 학생 100명의 토론이 더 나은 결론에 도달하는 것과 같다.


  1. 원본 훈련 데이터에서 부트스트랩 샘플 (복원 추출) BB개 생성
  2. 각 부트스트랩 샘플로 독립적인 모델 훈련 (병렬 가능)
  3. 예측 집계: 다수결 투표(분류) 또는 평균(회귀)

알고리즘 다이어그램

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

Varensemble=ρσ2+1ρnσ2\text{Var}_{\text{ensemble}} = \rho\sigma^2 + \frac{1-\rho}{n}\sigma^2

  • ρ\rho를 줄이면 두 번째 항이 지배적으로, nn이 커질수록 분산 감소
  • 부트스트랩만으로는 ρ\rho를 크게 줄이지 못함 —> 랜덤 포레스트에서 특성 무작위화를 추가
  • 높은 분산, 낮은 편향: 깊은 결정 트리가 이상적
  • 이미 낮은 분산인 모델(선형 모델 등)에는 배깅의 효과가 미미함

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

알고리즘 개요 다이어그램

  1. 모든 샘플에 동일한 가중치 wi=1/nw_i = 1/n 부여
  2. 가중 데이터로 약한 학습기 학습
  3. 오분류율 ϵm\epsilon_m 계산
  4. 학습기 가중치: αm=12ln1ϵmϵm\alpha_m = \frac{1}{2}\ln\frac{1-\epsilon_m}{\epsilon_m}
  5. 오분류된 샘플의 가중치 증가, 정분류된 샘플의 가중치 감소
  6. 반복
  • ϵm<0.5\epsilon_m < 0.5일 때만 의미가 있음 (무작위보다 나은 학습기)
  • 최종 예측: H(x)=sign(αmhm(x))H(x) = \text{sign}\left(\sum \alpha_m h_m(x)\right)

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

rim=L(yi,Fm1(xi))Fm1(xi)r_{im} = -\frac{\partial L(y_i, F_{m-1}(x_i))}{\partial F_{m-1}(x_i)}

Fm(x)=Fm1(x)+ηhm(x)F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)

  • η\eta (학습률): 각 트리의 기여도 조절
  • MSE 손실의 경우 유사 잔차 = 실제 잔차

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

섹션 제목: “확률적 그래디언트 부스팅 (Stochastic Gradient Boosting)”
  • 각 반복에서 행(row)과 열(column) 샘플링 추가
  • 분산도 함께 감소시키는 효과
  • 학습률 축소 (learning rate shrinkage): 작은 η\eta 사용
  • 조기 종료 (early stopping): 검증 손실 모니터링
  • 트리 깊이 제한: 얕은 트리 (3-8)
  • 정규화: L1/L2 (XGBoost의 γ\gamma, λ\lambda)

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


  1. Level-0 (기본 학습기): 다양한 모델들을 훈련
  2. 기본 학습기의 예측을 교차 검증으로 생성 (데이터 누출 방지)
  3. Level-1 (메타 학습기): Level-0의 예측을 특성으로 사용하여 최종 모델 학습

알고리즘 다이어그램

  • 메타 학습기: 보통 단순한 모델 (로지스틱 회귀, 선형 회귀)
  • 교차 검증 필수: Level-0 예측을 훈련 데이터로 직접 만들면 데이터 누출
  • 다양성이 핵심: 기본 학습기는 서로 다른 유형/알고리즘이어야 효과적
  • 스태킹의 간소화된 버전
  • 교차 검증 대신 홀드아웃 세트를 사용하여 Level-0 예측 생성
  • 더 간단하지만 데이터 효율이 낮음

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

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

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

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

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


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

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

Kaggle 우승자들의 앙상블 전략 — 왜 항상 모델을 합치는가

섹션 제목: “Kaggle 우승자들의 앙상블 전략 — 왜 항상 모델을 합치는가”

Kaggle 대회의 역사를 살펴보면, 단일 모델로 최종 우승한 사례는 극히 드물다. 거의 모든 우승 솔루션은 앙상블을 활용하며, 그 전략은 대회의 특성에 따라 정교하게 설계된다.

사례 1 — Netflix Prize (2009): 100만 달러 상금의 이 대회에서 우승팀 “BellKor’s Pragmatic Chaos”는 서로 다른 알고리즘(행렬 분해, 이웃 기반, RBM 등)을 블렌딩한 앙상블로 최종 성능을 달성하였다. 흥미로운 점은 준우승팀 “The Ensemble”과 RMSE 차이가 소수점 넷째 자리에서 갈렸다는 것이다 — 두 팀 모두 핵심 전략은 앙상블이었다.

사례 2 — 정형 데이터 대회의 패턴: Kaggle의 정형 데이터(tabular data) 대회에서는 XGBoost, LightGBM, CatBoost를 각각 다른 하이퍼파라미터와 특성 집합으로 훈련한 뒤, 스태킹 또는 가중 블렌딩으로 결합하는 것이 사실상 표준 파이프라인이다. 개별 모델 간의 상관관계가 낮을수록 앙상블의 이득이 크므로, 의도적으로 다른 전처리, 다른 특성 부분집합, 다른 무작위 시드를 사용한다.

핵심 교훈: 실무에서 앙상블은 “성능의 마지막 1%“를 짜내기 위한 도구이지만, 그 1%가 비즈니스에 큰 차이를 만드는 경우(광고 CTR 예측, 금융 리스크 등)에는 앙상블의 추가 복잡성을 정당화할 수 있다. 반면, 지연 시간(latency)이나 유지보수 비용이 중요한 프로덕션 환경에서는 앙상블 대신 지식 증류(Knowledge Distillation)로 앙상블의 성능을 단일 모델에 압축하는 접근도 널리 사용된다.


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

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

섹션 제목: “2. “부스팅은 항상 배깅보다 낫다””
  • 부스팅은 튜닝이 제대로 되지 않으면 과적합되기 쉽다. 데이터가 노이즈가 많으면 배깅이 더 안정적일 수 있다.

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

섹션 제목: “3. “스태킹에서 더 많은 레벨이 항상 좋다””
  • 레벨이 많아지면 과적합 위험이 증가하고 복잡도가 급격히 올라간다. 보통 2레벨이면 충분하다.

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

섹션 제목: “4. “앙상블의 모든 모델이 좋아야 한다””
  • 개별 모델의 성능보다 다양성이 더 중요하다. 약한 모델이라도 다른 유형의 오류를 만들면 앙상블에 기여한다.

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

섹션 제목: “5. “앙상블은 항상 단일 모델보다 낫다””
  • 지연 시간(latency), 해석 가능성, 배포 복잡도 등 실용적 제약을 고려해야 한다. 때로는 잘 튜닝된 단일 모델이 더 적합할 수 있다.


  1. 배깅이 분산을 줄이지만 편향은 줄이지 않는 이유는?

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

    • 순차적으로 이전 모델의 잔차(오류)에 맞추므로, 반복할수록 편향이 줄어듦
  3. 스태킹이 성능을 해칠 수 있는 경우는?

    • 기본 모델이 다양하지 않거나, 교차 검증 없이 훈련 예측을 사용하면 데이터 누출로 과적합
  4. 다양한 모델의 앙상블이 더 잘 동작하는 이유는?

    • 서로 다른 유형의 오류가 상쇄되므로. 동일한 모델의 복제본은 같은 오류를 만들어 앙상블 효과가 없음
  5. 랜덤 포레스트 vs 그래디언트 부스팅의 개념적 차이는?

    • RF: 병렬, 분산 감소, 깊은 트리, 과적합 위험 낮음
    • 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