머신러닝과 딥러닝 모델을 여러 개 학습한 후, 그 결과를 결합하는 앙상블(Ensemble)은 성능 향상을 위한 대표적인 기법입니다. 특히 모델들이 서로 다른 구조나 특성을 가질 경우, 적절한 앙상블 전략은 단일 모델보다 훨씬 나은 결과를 만들어냅니다.
이번 글에서는 단순 평균이나 다수결보다 한 단계 진보한 방식인 XGBoost 기반 Stacking 기법에 대해 자세히 설명드리겠습니다.
단순 앙상블은 다음과 같은 방식으로 구현됩니다:
이 방식은 직관적이고 과적합 위험이 적다는 장점이 있지만,
모델 간 예측 신뢰도나 특정 상황에서의 강점을 전혀 고려하지 못합니다.
Stacking은 여러 모델의 예측값을 모아서, 이를 다시 메타 모델(meta-learner)에 학습시키는 방식입니다.
가장 널리 쓰이는 메타 모델 중 하나가 바로 XGBoost입니다.
XGBoost는 다음과 같은 이유로 stacking에서 매우 강력한 성능을 발휘합니다:
모델 A, B, C의 예측값 사이의 비선형적 조합을 학습할 수 있습니다.
단순 평균은 선형 결합만 가능하지만, XGBoost는 훨씬 복잡한 패턴을 포착합니다.
어떤 모델은 특정 클래스에 강하고, 다른 모델은 다른 클래스에 강할 수 있습니다.
XGBoost는 이러한 조건부 상호작용을 트리 분기로 자연스럽게 학습합니다.
모델의 예측이 신뢰할 수 없을 경우, 해당 모델의 출력을 무시하거나 낮은 가중치를 둘 수 있습니다.
이런 점에서 XGBoost는 단순 평균보다 훨씬 유연합니다.
model_a = train_model_a()
model_b = train_model_b()
model_c = train_model_c()
probs_a = model_a.predict_proba(x_valid)
probs_b = model_b.predict_proba(x_valid)
probs_c = model_c.predict_proba(x_valid)
stack_input = np.concatenate([probs_a, probs_b, probs_c], axis=1)
import xgboost as xgb
xgb_model = xgb.XGBClassifier(n_estimators=100, max_depth=4)
xgb_model.fit(stack_input, y_valid)
# 각 모델의 test 예측도 위와 같이 stack_input_test 생성
final_pred = xgb_model.predict(stack_input_test)
방법 | Accuracy (Public LB) |
---|---|
단순 확률 평균 | 86.5% |
XGBoost Stacking | 87.8% |
→ 다양한 Kaggle 대회에서도 Stacking이 눈에 띄는 성능 향상을 보여주는 경우가 많습니다.
단순한 앙상블은 빠르게 구현할 수 있는 장점이 있지만, 모델 간의 상호작용을 효과적으로 반영하고, 예측 신뢰도에 따라 다르게 가중치를 줄 수 있는 XGBoost 기반 Stacking은 그보다 한 단계 발전된 전략입니다.
딥러닝 모델 여러 개를 학습한 상황이라면, 그 예측값을 기반으로 XGBoost를 메타 모델로 사용해 보는 것을 강력히 추천드립니다.