본문 바로가기
정보/IT 지식 정보

배깅 vs 부스팅 — 결정 트리의 과적합을 잡는 두 전략[5편]

by 안다니. 2026. 4. 3.
반응형
배깅 부스팅

 

BaggingClassifier와 AdaBoost를 코드로 비교하며 배깅과 부스팅의 차이를 명확히 이해합니다

 

학습 목표: 배깅과 부스팅이라는 두 가지 샘플링 기반 앙상블 전략의 원리를 학습하고, 각각의 특성을 이해한 후 실무에서 올바른 기법을 선택하는 능력을 갖춥니다.

1. 배깅(Bagging)이란?

배깅(Bootstrap Aggregating)은 원본 데이터에서 복원 추출(Bootstrapping)을 통해 여러 개의 부분 데이터셋을 생성한 후, 각각에 대해 동일한 모델을 학습하고 결과를 결합하는 기법입니다.

💡 핵심 원리: 다양한 데이터 부분집합으로 학습한 여러 모델의 예측을 평균(회귀) 또는 투표(분류)로 결합하면, 높은 분산을 가진 불안정한 모델의 분산을 크게 감소시킬 수 있습니다.

배깅의 특징:

  • 병렬 처리 가능 (각 모델은 독립적)
  • 분산(Variance) 감소에 효과적
  • 결정 트리같은 불안정한 모델에 유리
  • 편향(Bias)은 원본 모델과 동일
  • 복원 추출로 약 63.2%의 고유 샘플 포함

2. BaggingClassifier 구현

scikit-learn의 BaggingClassifier를 사용하여 결정 트리 기반의 배깅 모델을 구현합니다. Wine 데이터셋을 활용합니다.

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine

# Wine 데이터 로드
wine = load_wine()
X, y = wine.data, wine.target

# 학습/테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=1
)

# 기본 결정 트리 (제약 없음)
tree = DecisionTreeClassifier(criterion='entropy', max_depth=None, random_state=1)

# 배깅 분류기: 500개의 부트스트랩 표본으로 500개 트리 학습
bag = BaggingClassifier(
    estimator=tree,
    n_estimators=500,           # 500개 부트스트랩 표본
    max_samples=1.0,          # 전체 데이터 크기 사용
    max_features=1.0,          # 모든 피처 사용
    bootstrap=True,            # 복원 추출
    bootstrap_features=False,    # 피처는 복원 추출 안 함
    n_jobs=-1,                 # 모든 CPU 코어 사용
    random_state=1
)

3. 단일 결정 트리 vs 배깅 성능 비교

단일 결정 트리의 높은 분산 문제를 배깅이 어떻게 해결하는지 실제 정확도로 비교합니다.

from sklearn.metrics import accuracy_score

# 단일 결정 트리 학습 및 평가
tree = tree.fit(X_train, y_train)
tree_train = accuracy_score(y_train, tree.predict(X_train))
tree_test = accuracy_score(y_test, tree.predict(X_test))

# 배깅 분류기 학습 및 평가
bag = bag.fit(X_train, y_train)
bag_train = accuracy_score(y_train, bag.predict(X_train))
bag_test = accuracy_score(y_test, bag.predict(X_test))

# 결과 비교
print(f'단일 트리 - 학습: {tree_train:.4f}, 테스트: {tree_test:.4f}')
print(f'배깅       - 학습: {bag_train:.4f}, 테스트: {bag_test:.4f}')

# 배깅은 보통 테스트 성능이 크게 향상됨

📊 기대되는 결과: 단일 트리는 높은 과적합을 보이지만(학습 정확도 높음, 테스트 정확도 낮음), 배깅은 이 격차를 크게 줄입니다.

4. AdaBoost (에이다부스트)란?

반응형

AdaBoost(Adaptive Boosting)는 순차적으로 모델을 학습하되, 이전 모델에서 잘못 분류한 샘플에 더 높은 가중치를 부여하여 학습하는 앙상블 기법입니다.

💡 핵심 원리: 약한 분류기들을 순차적으로 결합하되, 각 분류기는 이전 분류기가 실수한 샘플에 집중합니다. 최종 예측은 각 분류기의 가중 투표로 결정됩니다.

부스팅의 특징:

  • 순차적 학습 (병렬 처리 불가)
  • 편향(Bias)과 분산 모두 감소
  • 약한 분류기를 강한 분류기로 변환
  • 샘플 가중치 적응적 조정
  • 과적합 위험도 존재

5. AdaBoostClassifier 구현

scikit-learn의 AdaBoostClassifier를 사용하여 부스팅 모델을 구현합니다. 깊이 1의 약한 결정 트리를 기본 학습기로 사용합니다.

from sklearn.ensemble import AdaBoostClassifier

# 약한 학습기: 깊이 1의 결정 트리 (스텀프)
tree = DecisionTreeClassifier(criterion='entropy', max_depth=1, random_state=0)

# AdaBoost 분류기
ada = AdaBoostClassifier(
    estimator=tree,
    n_estimators=500,          # 500개의 약한 분류기
    learning_rate=0.1,          # 학습률 (가중치 조정도)
    random_state=1
)

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

# 성능 평가
ada_train = accuracy_score(y_train, ada.predict(X_train))
ada_test = accuracy_score(y_test, ada.predict(X_test))

print(f'AdaBoost - 학습: {ada_train:.4f}, 테스트: {ada_test:.4f}')

6. 결정 트리 vs 배깅 vs AdaBoost 비교

세 가지 모델의 성능을 종합적으로 비교하고, 각 기법의 특성을 명확히 이해합니다.

import pandas as pd

# 결과 종합 비교
comparison = pd.DataFrame({
    '모델': ['단일 트리', '배깅', '부스팅'],
    '학습 정확도': [tree_train, bag_train, ada_train],
    '테스트 정확도': [tree_test, bag_test, ada_test],
    '과적합 정도': [tree_train - tree_test,
                    bag_train - bag_test,
                    ada_train - ada_test]
})

print(comparison.to_string(index=False))
구분 단일 결정 트리 배깅 AdaBoost
학습 방식 단일 모델 병렬 (독립적) 순차적 (의존적)
편향 감소 - 약함 강함
분산 감소 - 강함 강함
과적합 위험 높음 낮음 중간~높음
계산 효율 높음 높음 (병렬) 낮음 (순차)

배깅 vs 부스팅 선택 기준

배깅을 선택해야 할 때:

  • 불안정한 모델(결정 트리)의 분산이 주 문제일 때
  • 높은 계산 효율이 필요할 때
  • 병렬 처리가 가능할 때

부스팅을 선택해야 할 때:

  • 편향과 분산을 모두 줄여야 할 때
  • 약한 분류기를 강력한 분류기로 변환해야 할 때
  • 최고 성능이 최우선일 때 (계산 비용 감수)
  • 과적합을 주의깊게 모니터링할 수 있을 때

📌 요점 정리:
• 배깅: 병렬 처리로 분산 감소, 결정 트리에 최적
• 부스팅: 순차 학습으로 편향+분산 감소, 최고 성능 추구
• 배깅은 분산이 높은 모델에, 부스팅은 약한 모델에 적합
• 부스팅이 성능은 우수하지만 과적합 관리가 필수
• GridSearchCV로 n_estimators, learning_rate 등을 튜닝

학습 정리:

본 편에서는 배깅과 부스팅이라는 두 가지 샘플링 기반 앙상블 기법의 근본적인 차이를 이해했습니다. 배깅은 높은 분산을 가진 모델의 안정성을 개선하고, 부스팅은 약한 분류기들을 순차적으로 결합하여 강력한 모델을 구축합니다. 각 기법의 특성을 명확히 이해하면 실무에서 상황에 맞는 최적의 앙상블 기법을 선택할 수 있습니다.

반응형

댓글