Ensemble Methods (앙상블 기법)¶
개요¶
앙상블 기법은 여러 개의 학습 모델을 결합하여 단일 모델보다 더 좋은 예측 성능을 얻는 방법이다.
핵심 원리¶
"군중의 지혜 (Wisdom of Crowds)"
개별 모델이 서로 다른 오차를 만든다면, 이들을 결합하면 오차가 상쇄되어 성능이 향상됨.
Bias-Variance Tradeoff¶
\[\text{Error} = \text{Bias}^2 + \text{Variance} + \text{Noise}\]
| 앙상블 유형 | 주요 효과 | 기반 모델 |
|---|---|---|
| Bagging | Variance 감소 | 고분산 (복잡한) 모델 |
| Boosting | Bias 감소 | 고편향 (단순한) 모델 |
| Stacking | 둘 다 개선 | 다양한 모델 |
앙상블 분류¶
Ensemble Methods
│
┌─────────────────┼─────────────────┐
│ │ │
Bagging Boosting Stacking
│ │ │
┌───────┴───────┐ ┌─────┴─────┐ Meta-
│ │ │ │ Learner
Random Pasting AdaBoost Gradient
Forest Boosting
│
┌────┴────┐
XGBoost LightGBM
기법 비교¶
| 기법 | 학습 방식 | 결합 방법 | 병렬화 | 과적합 경향 |
|---|---|---|---|---|
| Bagging | 독립 (병렬) | 평균/투표 | 가능 | 낮음 |
| Boosting | 순차 | 가중 합 | 제한적 | 있음 |
| Stacking | 독립 -> 순차 | 메타 모델 | 부분적 | 주의 필요 |
다양성 (Diversity)¶
앙상블 성능의 핵심은 다양성:
\[\text{Ensemble Error} = \bar{E} - \bar{A}\]
- \(\bar{E}\): 개별 모델의 평균 오차
- \(\bar{A}\): 모델 간 불일치도 (Ambiguity)
다양성 확보 방법¶
| 방법 | 설명 | 예시 |
|---|---|---|
| 데이터 샘플링 | 서로 다른 부분집합 학습 | Bootstrap (Bagging) |
| 특성 샘플링 | 서로 다른 특성 사용 | Random Subspace |
| 모델 다양성 | 다른 알고리즘 사용 | Stacking |
| 하이퍼파라미터 | 다른 설정 사용 | 다양한 max_depth |
| 초기화 | 다른 랜덤 시드 | Neural Network 앙상블 |
투표 방식¶
분류¶
Hard Voting: 다수결
\[\hat{y} = \text{mode}(h_1(x), h_2(x), ..., h_n(x))\]
Soft Voting: 확률 평균
\[\hat{y} = \arg\max_k \frac{1}{n} \sum_{i=1}^{n} P_i(y=k|x)\]
회귀¶
평균:
\[\hat{y} = \frac{1}{n} \sum_{i=1}^{n} h_i(x)\]
가중 평균:
\[\hat{y} = \sum_{i=1}^{n} w_i h_i(x), \quad \sum_i w_i = 1\]
기본 사용법 (scikit-learn)¶
Voting Classifier¶
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
# 데이터
X, y = load_iris(return_X_y=True)
# 개별 모델
clf1 = LogisticRegression(max_iter=1000)
clf2 = DecisionTreeClassifier()
clf3 = SVC(probability=True)
# Hard voting
hard_voting = VotingClassifier(
estimators=[('lr', clf1), ('dt', clf2), ('svc', clf3)],
voting='hard'
)
# Soft voting
soft_voting = VotingClassifier(
estimators=[('lr', clf1), ('dt', clf2), ('svc', clf3)],
voting='soft'
)
# 평가
for clf, name in [(clf1, 'LR'), (clf2, 'DT'), (clf3, 'SVC'),
(hard_voting, 'Hard'), (soft_voting, 'Soft')]:
scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
print(f"{name}: {scores.mean():.4f} (+/- {scores.std():.4f})")
Voting Regressor¶
from sklearn.ensemble import VotingRegressor
from sklearn.linear_model import Ridge
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.datasets import fetch_california_housing
X, y = fetch_california_housing(return_X_y=True)
X, y = X[:2000], y[:2000] # 샘플 축소
reg1 = Ridge()
reg2 = DecisionTreeRegressor()
reg3 = SVR()
voting_reg = VotingRegressor(
estimators=[('ridge', reg1), ('dt', reg2), ('svr', reg3)]
)
scores = cross_val_score(voting_reg, X, y, cv=5, scoring='r2')
print(f"Voting R2: {scores.mean():.4f}")
관련 문서¶
| 주제 | 링크 |
|---|---|
| Bagging | bagging.md |
| Boosting | boosting.md |
| Stacking | stacking.md |
| Random Forest | ../supervised/classification/random-forest.md |
| XGBoost | ../supervised/classification/xgboost.md |
| LightGBM | ../supervised/classification/lightgbm.md |
참고¶
- Dietterich, T.G. (2000). "Ensemble Methods in Machine Learning"
- Zhou, Z.H. (2012). "Ensemble Methods: Foundations and Algorithms"
- scikit-learn Ensemble: https://scikit-learn.org/stable/modules/ensemble.html