
여러 약한/강한 학습기의 예측을 결합하여 단일 모델보다 일반화 성능을 높이는 기법이다. 서로 다른 관점을 가진 모델들을 다양화(variance↓)하거나, 체계적으로 보정(bias↓)해 성능을 끌어올린다.
여러 분류기의 출력을 투표로 합쳐 최종 클래스를 결정한다. 종류는 아래와 같다.
샘플뿐 아니라 특성(feature) 도 샘플링하여 추가로 다양화한다.
많은 결정트리를 베깅으로 학습하되, 각 분할에서 사용할 특성도 무작위로 제한하는 앙상블이다. 트리 간 상관을 낮춰 분산을 크게 줄이는 것이 핵심이다.

max_features개로 무작위 제한한다(분류 기본=√p, 회귀 기본=p).장점
단점
다른 앙상블과 비교
즉, 랜덤포레스트는 “여러 무작위화된 트리의 집단지성”으로 성능을 끌어올리는 대표적 앙상블 모델이다.
# scikit-learn 예시 (분류)
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.inspection import permutation_importance
import pandas as pd
# 1) 데이터
X, y = make_classification(n_samples=8000, n_features=20, n_informative=8,
n_redundant=4, class_sep=1.2, random_state=42)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, stratify=y, test_size=0.2, random_state=42)
# 2) 모델: OOB 점수로 대략 평가, 트리 깊이/수 최소 규제
rf = RandomForestClassifier(
n_estimators=400,
max_depth=None, # 필요 시 10~30 등으로 제한
min_samples_leaf=2, # 노이즈 분할 억제
max_features="sqrt", # 분류 권장값
oob_score=True,
n_jobs=-1,
random_state=42
)
rf.fit(X_tr, y_tr)
print("OOB score:", rf.oob_score_)
print("Test score:", rf.score(X_te, y_te))
print(classification_report(y_te, rf.predict(X_te), digits=3))
# 3) 중요도
imp_impurity = pd.Series(rf.feature_importances_).sort_values(ascending=False)
print("Impurity-based top5:\n", imp_impurity.head())
perm = permutation_importance(rf, X_te, y_te, n_repeats=10, random_state=42, n_jobs=-1)
imp_perm = pd.Series(perm.importances_mean).sort_values(ascending=False)
print("Permutation-based top5:\n", imp_perm.head())
n_estimators를 충분히 크게(수백)하고, min_samples_leaf(또는 min_samples_split)로 과적합을 1차 제어.class_weight="balanced" 또는 표본 전략 조합.여러 약한 학습기를 직렬로 학습하여 앞선 모델의 오류를 다음 모델이 보완하도록 하는 방법(가중 재학습). 바이어스↓ 효과가 크다.
GradientBoosting*, HistGradientBoosting*(대용량 효율), 외부 라이브러리 XGBoost/LightGBM/CatBoost 가 실무 표준.서로 다른 종류의 모델들을 수평으로 학습하고, 그들의 예측값을 입력으로 하는 메타 모델이 최종 결합을 학습하는 방법.
# 간단 예시: scikit-learn StackingClassifier
from sklearn.ensemble import StackingClassifier, RandomForestClassifier, HistGradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
base_estimators = [
("rf", RandomForestClassifier(n_estimators=300, random_state=42)),
("hgb", HistGradientBoostingClassifier(random_state=42)),
("svm", SVC(probability=True, random_state=42))
]
stack = StackingClassifier(
estimators=base_estimators,
final_estimator=LogisticRegression(max_iter=200),
n_jobs=-1,
passthrough=False # True로 하면 원본 특징도 메타에 함께 사용
)
stack.fit(X_tr, y_tr)
print("Stacking test score:", stack.score(X_te, y_te))

| 관점 | 배깅(Bagging) | 부스팅(Boosting) | 스태킹(Stacking) |
|---|---|---|---|
| 학습 흐름 | 병렬로 여러 모델을 독립 학습 | 직렬(순차)로 이전 오류를 보정 | 수평 결합 + 메타 학습(2단계) |
| 다양성 원천 | 데이터 부트스트랩 샘플링(복원추출), 경우에 따라 특성 서브샘플 | 단계마다 가중치/잔차에 초점 | 서로 다른 유형의 모델을 혼합 |
| 결합 방식 | 평균(회귀) / 다수결(분류) | 가중 합(누적 개선) | 1단계 예측을 메타 모델이 학습해 결합 |
| 편향/분산 영향 | 분산↓(안정화) | 바이어스↓(정확도 향상) | 모델 간 보완으로 추가 이득 |
| 대표 알고리즘 | Random Forest, BaggingRegressor | AdaBoost, Gradient Boosting, XGBoost/LightGBM/CatBoost | StackingClassifier/Regressor(메타: 로지스틱/GBM 등) |
| 장점 | 튜닝 쉬움, 전처리 부담 적음, 안정적 | 탭형 데이터에서 강력한 성능 | 이질 모델 조합으로 추가 개선 가능 |
| 주의 | 트리 수↑→비용↑ | 학습률/트리깊이/트리 수 튜닝, 과적합·조기종료 | OOF 예측로 데이터 누수 방지, 파이프라인 복잡 |