앙상블 방법 (Ensemble Methods)¶
난이도: 중급
선수 지식: 트리 기반 모델, 과적합과 과소적합의 편향-분산 트레이드오프
관련 문서: 트리 기반 모델 | 정규화 이론 | 경사 하강법
개요¶
앙상블 방법(Ensemble Methods)은 여러 개의 모델을 결합하여 단일 모델보다 더 나은 예측 성능을 달성하는 기법이다. "대중의 지혜(Wisdom of Crowds)" 원리에 기반하며, 다양한 모델의 예측을 합치면 개별 모델의 오류가 상쇄될 수 있다.
주요 앙상블 전략: - 배깅 (Bagging): 분산 감소 - 부스팅 (Boosting): 편향 감소 - 스태킹 (Stacking): 다양한 모델의 장점 결합 - 보팅 (Voting): 단순 결합
핵심 개념¶
1. 왜 앙상블이 동작하는가?¶
Condorcet의 배심원 정리 비유¶
각 모델의 정확도가 50%를 넘고 오류가 독립적이면, 앙상블 크기가 커질수록 정확도는 1에 수렴한다.
편향-분산 분해¶
| 전략 | 주로 감소시키는 것 |
|---|---|
| 배깅 | 분산 |
| 부스팅 | 편향 (+ 일부 분산) |
| 스태킹 | 둘 다 |
핵심 조건: 다양성 (Diversity)¶
앙상블이 효과적이려면 개별 모델들이 서로 다른 유형의 오류를 만들어야 한다. 모든 모델이 동일한 오류를 만들면 앙상블의 이점이 없다.
2. 배깅 (Bootstrap Aggregating)¶
알고리즘¶
- 원본 훈련 데이터에서 부트스트랩 샘플 (복원 추출) \(B\)개 생성
- 각 부트스트랩 샘플로 독립적인 모델 훈련 (병렬 가능)
- 예측 집계: 다수결 투표(분류) 또는 평균(회귀)
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\)일 때:
- \(\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)¶
- 모든 샘플에 동일한 가중치 \(w_i = 1/n\) 부여
- 가중 데이터로 약한 학습기 학습
- 오분류율 \(\epsilon_m\) 계산
- 학습기 가중치: \(\alpha_m = \frac{1}{2}\ln\frac{1-\epsilon_m}{\epsilon_m}\)
- 오분류된 샘플의 가중치 증가, 정분류된 샘플의 가중치 감소
-
반복
-
\(\epsilon_m < 0.5\)일 때만 의미가 있음 (무작위보다 나은 학습기)
- 최종 예측: \(H(x) = \text{sign}\left(\sum \alpha_m h_m(x)\right)\)
그래디언트 부스팅¶
손실 함수의 음의 기울기(negative gradient)를 유사 잔차로 사용하여 학습:
- \(\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)¶
알고리즘¶
- Level-0 (기본 학습기): 다양한 모델들을 훈련
- 기본 학습기의 예측을 교차 검증으로 생성 (데이터 누출 방지)
- 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)¶
예측 확률의 평균 --> 보통 하드 보팅보다 우수
가중 보팅 (Weighted Voting)¶
각 모델에 다른 가중치 부여:
상세 비교¶
| 방법 | 감소 대상 | 기본 모델 | 학습 방식 | 위험 |
|---|---|---|---|---|
| 배깅 | 분산 | 고분산 (깊은 트리) | 병렬 | 과적합 위험 낮음 |
| 부스팅 | 편향 (주로) | 고편향 (얕은 트리) | 순차 | 과적합 가능 |
| 스태킹 | 둘 다 | 다양한 모델 | 2단계 | 복잡, 누출 위험 |
| 보팅 | 분산 | 다양한 모델 | 병렬 | 가장 단순 |
언제 사용하는가¶
| 상황 | 추천 방법 |
|---|---|
| 빠르고 안정적인 성능 향상 | 배깅 (랜덤 포레스트) |
| 최고 성능이 필요한 경우 | 부스팅 (XGBoost/LightGBM) |
| 대회/프로덕션 최적화 | 스태킹 |
| 빠른 프로토타이핑 | 보팅 |
| 다양한 모델의 장점 결합 | 스태킹 또는 보팅 |
| 과적합이 걱정되는 경우 | 배깅 |
흔한 오해와 함정¶
1. "배깅은 편향을 줄인다"¶
- 아니다. 배깅은 분산만 줄인다. 기본 모델의 편향은 그대로 유지된다.
2. "부스팅은 항상 배깅보다 낫다"¶
- 부스팅은 튜닝이 제대로 되지 않으면 과적합되기 쉽다. 데이터가 노이즈가 많으면 배깅이 더 안정적일 수 있다.
3. "스태킹에서 더 많은 레벨이 항상 좋다"¶
- 레벨이 많아지면 과적합 위험이 증가하고 복잡도가 급격히 올라간다. 보통 2레벨이면 충분하다.
4. "앙상블의 모든 모델이 좋아야 한다"¶
- 개별 모델의 성능보다 다양성이 더 중요하다. 약한 모델이라도 다른 유형의 오류를 만들면 앙상블에 기여한다.
5. "앙상블은 항상 단일 모델보다 낫다"¶
- 지연 시간(latency), 해석 가능성, 배포 복잡도 등 실용적 제약을 고려해야 한다. 때로는 잘 튜닝된 단일 모델이 더 적합할 수 있다.
다른 주제와의 연결¶
- 트리 기반 모델: 배깅(RF), 부스팅(GBDT)의 구체적 구현
- 과적합과 과소적합: 편향-분산 분해의 실질적 응용
- 정규화 이론: 부스팅의 정규화 기법
- 경사 하강법: 그래디언트 부스팅의 최적화 기초
- No Free Lunch: 다양한 모델의 앙상블이 NFL 정리에 대한 실질적 헤지
자주 묻는 면접 질문¶
- 배깅이 분산을 줄이지만 편향은 줄이지 않는 이유는?
-
배깅은 동일한 편향을 가진 모델들의 평균이므로, 편향은 기본 모델과 동일. 독립적 오류의 평균으로 분산만 감소.
-
부스팅이 편향을 줄이는 이유는?
-
순차적으로 이전 모델의 잔차(오류)에 맞추므로, 반복할수록 편향이 줄어듦
-
스태킹이 성능을 해칠 수 있는 경우는?
-
기본 모델이 다양하지 않거나, 교차 검증 없이 훈련 예측을 사용하면 데이터 누출로 과적합
-
다양한 모델의 앙상블이 더 잘 동작하는 이유는?
-
서로 다른 유형의 오류가 상쇄되므로. 동일한 모델의 복제본은 같은 오류를 만들어 앙상블 효과가 없음
-
랜덤 포레스트 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