Bagging·랜덤 포레스트와 Boosting·XGBoost의 앙상블 학습
Bagging, 랜덤 포레스트, Gradient Boosting, XGBoost의 학습 방식과 규제 요소, 운영 트레이드오프를 정리한다.
2026-08-14 · 최초 발행 2024-04-29
독립 모델을 합칠지, 오차를 이어서 보정할지
분류와 회귀에서 단일 모델의 한계를 넘기 위해 Bagging, Random Forest, Gradient Boosting, XGBoost 같은 앙상블 기법을 사용한다. 핵심은 여러 모델을 결합해 편향과 분산의 균형을 다루고, 일반화 성능과 운영 안정성을 확보하는 데 있다.
Bagging은 데이터에서 부트스트랩 샘플을 여러 개 만든 뒤 각각의 학습기를 병렬로 훈련하고, 평균 또는 투표로 결과를 합친다. 주된 효과는 분산 감소다.
랜덤 포레스트는 Bagging에 특성 무작위성(feature subsampling)을 더한 결정트리 앙상블이다. 각 분기에서 임의의 특성 부분집합을 사용해 분할을 시도하므로 트리 사이의 상관을 낮추고 성능과 안정성을 높인다.
Boosting은 약한 학습기를 순서대로 추가하면서 이전 단계의 오차, 즉 잔차를 보정하는 가법 모델이다. 편향 감소가 중심이며, 학습률과 반복 수의 조절이 중요하다.
Gradient Boosting은 손실 함수의 음의 기울기인 잔차를 예측하도록 단계별 트리를 학습한다. 작은 학습률과 얕은 트리를 다수 적재해 일반화 성능을 확보한다.
XGBoost는 Gradient Boosting 구현에 정규화(L1/L2), 2차 미분(헤시안) 기반 최적화, 컬럼 블록화, 히스토그램 분할(tree_method=hist), 조기 종료를 결합한다. 분산 학습, 스파스 처리, 컬럼·로우 서브샘플링, 스케일 포지티브 웨이트(scale_pos_weight)로 대규모·불균형 데이터에도 대응한다.
샘플링과 규제로 성능 균형 맞추기
Bagging은 부트스트랩 행(row) 샘플링과 병렬 학습을 사용한다. 랜덤 포레스트는 여기에 분할 시 특성 부분집합(column) 샘플링을 더한다. 독립 모델의 평균이나 투표로 예측을 결합하며, 모델 사이의 상관이 낮을수록 분산 감소 효과가 커진다.
Boosting은 보통 원본 데이터를 사용하고, 단계마다 표본 가중치 또는 잔차를 갱신한다. subsample은 규제와 가속에 사용할 수 있다. 순차적 가법 모델이라는 특성상 eta와 트리 깊이가 과적합과 일반화 사이의 균형을 좌우한다.
복잡도 제어 방식도 다르다. Bagging에서는 트리의 max_depth, min_samples_leaf, max_features가 주요 제어점이며, 많은 트리를 사용하면 안정성이 높아진다. Boosting과 XGBoost에서는 학습률, n_estimators, max_depth, min_child_weight, subsample, colsample_bytree, reg_alpha/lambda, 조기 종료를 함께 조절해 과적합을 억제한다.
특성 중요도는 분할 기반 중요도(impurity), 퍼뮤테이션 중요도, SHAP으로 전역과 국소 수준에서 해석할 수 있다. 부스팅 계열에서는 SHAP 활용이 권장된다. 다만 상관 특성이 많으면 중요도가 왜곡될 수 있으므로 퍼뮤테이션 중요도와 SHAP을 병행해 검증한다.
Bagging은 튜닝 부담이 낮고 병렬화하기 쉬우며 예측 안정성이 좋다. 반면 최상위 성능은 부스팅보다 낮을 수 있다. Boosting과 XGBoost는 높은 성능을 달성할 잠재력이 있지만, 튜닝 민감도와 학습 시간, 메모리 사용량이 늘어나는 트레이드오프가 있다.
병렬 결합과 순차 보정의 흐름
데이터 성격에 맞춘 운영 기준
제조 품질 이상 탐지에서는 랜덤 포레스트로 빠르게 베이스라인을 만들고, 변수 중요도를 이용해 공정 변수의 우선순위를 정할 수 있다. 결측과 잡음이 많은 센서 데이터로 확장할 때는 퍼뮤테이션 중요도와 SHAP을 검증하고, 경고 임계값은 리스크 허용도를 기준으로 조정한다.
금융 신용·사기 탐지에서는 XGBoost의 scale_pos_weight, AUC 기반 조기 종료, 비용 민감 임계값 최적화가 불균형 데이터 처리에 쓰인다. 운영 단계에서는 주 단위 리트레이닝, 데이터 드리프트 모니터링(PSI/KS), 모델 레지스트리를 통한 버전 관리가 필요하다.
마케팅 이탈 예측에서는 범주형 원-핫/타깃 인코딩과 시계열 스냅샷 기준 분리가 전처리의 기준이 된다. Gradient Boosting으로 해석과 성과의 균형을 맞추고, SHAP으로 캠페인 타깃 규칙을 도출할 수 있다.
일반적인 도입 과정에서는 시간 누수를 막은 학습·검증·테스트 분리부터 잡는다. 검증에는 Stratified K-Fold와 AUC/LogLoss/치우침 지표를 함께 쓰고, 학습률, 트리 깊이, 규제, 서브샘플 순으로 단계적 탐색을 진행한다. 부스팅에는 조기 종료를 적용하며, 운영 환경에서는 시드와 환경을 고정하고 피처 파이프라인 버전 및 예측 모니터링 대시보드를 관리한다.
| 방법 | 성능(일반) | 확장성 | 일관성 | 안정성 | 운영 편의 | 비고 |
|---|---|---|---|---|---|---|
| Bagging(랜덤 포레스트) | 중~상 | 상 | 상 | 상 | 상 | 튜닝 부담 낮음, 해석·배포 용이 |
| Gradient Boosting | 상 | 중 | 중 | 중 | 중 | 튜닝 민감, 학습률·깊이 중요 |
| XGBoost | 상~최상 | 상 | 중~상 | 중~상 | 중 | 정규화·조기 종료·분산 학습 지원 |
분류 AUC 비교 코드
전제조건은 Python 3.10+, scikit-learn 1.3+, xgboost 2.0+이며, 버전은 변경 가능하므로 최신 정보 확인이 필요하다. 아래 예시는 CPU 환경을 기준으로 재현성 시드를 고정한다.
# 실행 가능 예시: 분류 AUC 비교
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.metrics import roc_auc_score
from xgboost import XGBClassifier
import numpy as np
# 1) 데이터 생성
X, y = make_classification(
n_samples=10000, n_features=30,
n_informative=10, n_redundant=5,
weights=[0.9, 0.1], random_state=42
)
X_train, X_valid, y_train, y_valid = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
# 2) 모델 정의
rf = RandomForestClassifier(
n_estimators=300, min_samples_leaf=2,
n_jobs=-1, random_state=42
)
gb = GradientBoostingClassifier(
n_estimators=300, learning_rate=0.05,
max_depth=3, random_state=42
)
# 불균형 대응: 음성/양성 비율로 scale_pos_weight 계산
neg, pos = np.sum(y_train == 0), np.sum(y_train == 1)
xgb = XGBClassifier(
n_estimators=2000, learning_rate=0.03, max_depth=6,
subsample=0.8, colsample_bytree=0.8,
reg_alpha=0.0, reg_lambda=1.0,
objective="binary:logistic", tree_method="hist",
scale_pos_weight=neg / pos,
n_jobs=-1, random_state=42
)
# 3) 학습 (+ 조기 종료)
rf.fit(X_train, y_train)
gb.fit(X_train, y_train)
xgb.fit(
X_train, y_train,
eval_set=[(X_valid, y_valid)],
eval_metric="auc",
early_stopping_rounds=100,
verbose=False
)
# 4) 평가
pred_rf = rf.predict_proba(X_valid)[:, 1]
pred_gb = gb.predict_proba(X_valid)[:, 1]
pred_xgb = xgb.predict_proba(X_valid)[:, 1]
for name, pred in [("RF", pred_rf), ("GB", pred_gb), ("XGB", pred_xgb)]:
print(f"{name} AUC: {roc_auc_score(y_valid, pred):.4f}")
부스팅 계열은 learning_rate를 낮추고 n_estimators를 크게 설정하며 조기 종료를 적용한다. 확률 출력 교정이 필요하면 CalibratedClassifierCV(Platt/Isotonic)을 적용할 수 있다. 고차원 희소 피처에서는 XGBoost의 tree_method="hist"와 정규화 파라미터를 우선 적용한다.
성능 개선과 운영 선택
탭형 데이터에서는 단일 트리·로지스틱 회귀와 비교해 AUC 310%p, 정확도 26%p 향상을 기대할 수 있으며 데이터 특성에 따라 달라진다. 적절한 튜닝과 조기 종료를 적용하면 과적합으로 인한 오프라인-온라인 성능 괴리를 30~70% 줄일 수 있다.
앙상블 모델은 예측 안정성과 재현성을 확보해 운영 리스크를 낮추고, 변수 중요도와 SHAP을 통한 원인 분석으로 의사결정을 지원한다. 초기 기준선과 운영 단순화가 우선이라면 랜덤 포레스트가 맞고, 튜닝과 모니터링 비용을 감수할 수 있는 중요 과제에서는 Gradient Boosting 또는 XGBoost가 적합하다. 랜덤 포레스트로 기준선을 수립한 뒤 XGBoost로 성능 상한을 탐색하고, SHAP 기반 해석과 드리프트 모니터링을 더해 운영화하는 흐름을 사용할 수 있다.