본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Ensemble 기법의 3가지 핵심 Bagging, Boosting, Stacking 차이와 편향-분산 해결 방법

by Papa Martino V 2026. 4. 28.
728x90

Bagging, Boosting, Stacking
Bagging, Boosting, Stacking

 

머신러닝 모델의 성능을 극한으로 끌어올리기 위한 가장 강력한 무기는 단연 앙상블(Ensemble) 기법입니다. 단일 모델이 가진 한계를 극복하기 위해 여러 모델의 예측을 결합하는 이 방식은, 단순히 성능을 높이는 것을 넘어 모델의 안정성을 결정짓는 편향(Bias)분산(Variance)의 관계를 근본적으로 재정의합니다. 본 포스팅에서는 현대 데이터 사이언스의 핵심인 Bagging, Boosting, Stacking의 세 가지 메커니즘을 수학적 관점에서 분석하고, 각각이 어떻게 편향과 분산을 제어하여 일반화 성능을 극대화하는지 심층적으로 다룹니다.


1. 모델 성능의 본질: 편향-분산 트레이드오프 (Bias-Variance Trade-off)

앙상블의 가치를 이해하기 위해서는 먼저 모델 에러의 구성을 이해해야 합니다. 총 에러는 다음과 같이 정의됩니다.

$$Error = Bias^2 + Variance + Irreducible Error$$

  • Bias (편향): 모델이 데이터의 복잡성을 충분히 반영하지 못해 발생하는 오차입니다. (Underfitting과 관련)
  • Variance (분산): 학습 데이터의 작은 변화에 모델이 민감하게 반응하여 발생하는 오차입니다. (Overfitting과 관련)

앙상블 기법들은 이 두 마리 토끼를 잡기 위해 서로 다른 전략을 취합니다. Bagging은 주로 분산을 낮추는 데 집중하고, Boosting은 편향을 줄이는 데 특화되어 있으며, Stacking은 두 요소를 모두 최적화하기 위한 메타 학습 구조를 가집니다.


2. 앙상블 3대 기법 비교 분석

각 앙상블 기법이 편향과 분산에 미치는 영향과 구조적 차이를 표로 정리하였습니다.

항목 Bagging (Bootstrap Aggregating) Boosting Stacking
핵심 목표 분산(Variance) 감소 편향(Bias) 감소 예측 성능 극대화
모델 관계 독립적 병렬 학습 순차적 학습 (오차 보정) 계층적 구조 (메타 모델)
기본 모델 High Variance 모델 (Deep Tree) High Bias 모델 (Stump/Shallow Tree) 서로 다른 이질적 모델들
데이터 구성 중복 허용 샘플링 (Bootstrap) 이전 단계 오차에 가중치 부여 교차 검증 기반 예측값 생성
대표 알고리즘 Random Forest XGBoost, LightGBM, CatBoost Stacked Generalization

3. 메커니즘별 편향-분산 제어 방법

Bagging: 강력한 분산 억제기

Bagging은 전체 데이터에서 여러 개의 부트스트랩 샘플을 생성하고, 각각의 샘플에 대해 독립적인 모델을 학습시킵니다. 독립적인 예측값들의 평균을 내는 과정은 통계적으로 표본 평균의 분산이 $1/n$로 줄어드는 원리를 이용합니다. 따라서 과적합된 깊은 결정 트리(Decision Tree)들을 결합하여 매우 안정적인 모델을 만듭니다.

Boosting: 편향을 깎아내는 장인

Boosting은 약한 학습기(Weak Learner)를 순차적으로 결합합니다. 첫 번째 모델이 틀린 부분에 대해 더 높은 가중치를 부여하여 두 번째 모델이 학습하도록 유도합니다. 이 과정은 잔차(Residual)를 최적화하는 과정으로, 모델이 반복될수록 편향이 급격히 감소하여 정교한 예측이 가능해집니다.

Stacking: 모델의 결합을 통한 최적화

Stacking은 개별 모델들의 예측 결과를 다시 '입력 피처'로 사용하여 최종 메타 모델을 학습시킵니다. 이는 각 모델이 가진 편향의 특성을 메타 모델이 학습함으로써, 보완 관계를 형성하여 종합적인 에러를 낮추는 해결 방법입니다.


4. 실무 적용을 위한 Python 샘플 예제 (Example 7선)

개발자가 실무 프로젝트에서 즉시 활용할 수 있는 앙상블 구현 코드입니다.

Ex 1. Scikit-learn을 이용한 Bagging Classifier 구현

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
# 분산을 줄이기 위해 깊은 트리를 기본 모델로 사용
bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(), 
                            n_estimators=100, random_state=42)
bagging.fit(X, y)

Ex 2. Random Forest를 통한 고차원 데이터 분산 해결 방법

from sklearn.ensemble import RandomForestClassifier

# max_features 설정을 통해 특성 선택의 무작위성을 부여, 분산을 더욱 억제
rf = RandomForestClassifier(n_estimators=200, max_features='sqrt', bootstrap=True)
rf.fit(X, y)

Ex 3. XGBoost의 편향 감소를 위한 조기 종료(Early Stopping)

from xgboost import XGBClassifier

# n_estimators를 크게 잡고 early_stopping을 통해 편향과 분산의 접점을 찾음
xgb = XGBClassifier(n_estimators=1000, learning_rate=0.05)
xgb.fit(X, y, eval_set=[(X, y)], early_stopping_rounds=10, verbose=False)

Ex 4. LightGBM을 활용한 대용량 데이터 Boosting

from lightgbm import LGBMClassifier

# leaf-wise 성장 방식을 통해 편향을 빠르게 감소시킴
lgb = LGBMClassifier(num_leaves=31, learning_rate=0.1, n_estimators=100)
lgb.fit(X, y)

Ex 5. CatBoost의 범주형 변수 자동 처리 및 규제

from catboost import CatBoostClassifier

# 순서형 부스팅을 통해 과적합(분산 증가)을 방지하며 편향 감소
cat = CatBoostClassifier(iterations=100, depth=6, verbose=0)
cat.fit(X, y)

Ex 6. Scikit-learn StackingClassifier (이질적 모델 결합)

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

# 상이한 편향 특성을 가진 모델들을 결합
estimators = [
    ('rf', RandomForestClassifier(n_estimators=10)),
    ('svr', SVC(probability=True))
]
stacking = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())
stacking.fit(X, y)

Ex 7. VotingClassifier를 이용한 단순 다수결 앙상블

from sklearn.ensemble import VotingClassifier

# 여러 모델의 독립적인 판단을 평균내어 분산 감소 유도
voting = VotingClassifier(estimators=[('lr', LogisticRegression()), ('rf', rf)], voting='soft')
voting.fit(X, y)

5. 결론: 상황에 맞는 앙상블 전략 수립

앙상블 기법의 선택은 현재 모델이 처한 에러의 원인에 달려 있습니다.

  • 과적합이 문제라면? Bagging 기반의 Random Forest가 정답입니다.
  • 과소적합이나 정교한 예측이 필요하다면? Boosting 계열(LGBM, XGBoost)을 선택하십시오.
  • 가용한 모든 모델의 장점을 합치고 싶다면? Stacking이 가장 강력한 해결 방법이 될 것입니다.

앙상블은 공짜 점심(No Free Lunch)이 아닙니다. 연산 복잡도와 모델 해석력 사이의 트레이드오프를 고려하여 시스템에 적합한 기법을 도입하시기 바랍니다.


참고 문헌 (Sources)

  • Breiman, L. (1996). "Bagging Predictors". Machine Learning.
  • Friedman, J. H. (2001). "Greedy Function Approximation: A Gradient Boosting Machine". Annals of Statistics.
  • Wolpert, D. H. (1992). "Stacked Generalization". Neural Networks.
  • James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning. Springer.
728x90