"교수님, 보팅은 여러 모델이 민주적으로 투표하는 방식이었고, 배깅과 부스팅은 같은 종류의 모델을 여러 개 사용하는 방식이었어요. 그런데 만약 완전히 다른 종류의 모델들, 예를 들어 로지스틱 회귀, SVM, 랜덤 포레스트처럼 각자 장점이 다른 모델들을 모아서, 그저 투표만 하는 게 아니라 더 똑똑하게 조합할 수는 없을까요?"
준이는 마치 어벤져스처럼 각기 다른 능력을 가진 영웅들을 모아, 각자의 능력을 최적으로 활용하는 지휘관을 두고 싶다는 생각을 했습니다. 김교수님은 그것이 바로 앙상블의 최종 진화형이라고 말했습니다.
"바로 그거야! 오늘 배울 스태킹(Stacking)이 바로 그런 아이디어를 구현한, 가장 정교하고 강력한 앙상블 기법 중 하나라네. 스태킹은 여러 모델의 예측 결과를 단순 종합하는 것을 넘어, '어떤 모델의 의견을 얼마나 더 신뢰할지'를 학습하는 또 다른 모델을 두는 방식이지."
스태킹(Stacking)의 작동 원리: 예측을 다시 학습하는 모델
"스태킹은 2단계의 계층 구조를 가진다네. 1층에는 다양한 기본 모델들이, 2층에는 이들의 예측을 종합하여 최종 결정을 내리는 단 하나의 메타 모델이 있지."
스태킹(Stacking)의 작동 방식
- 1단계 (Base Models): 여러 개의 서로 다른 기본 모델(Base Model)들이 각자 전체 학습 데이터로 예측값을 만든다.
- 2단계 (Meta Model): 1단계에서 나온 예측값들을 새로운 학습 데이터로 삼아, 최종 예측을 담당하는 메타 모델(Meta Model)을 학습시킨다.
"즉, 메타 모델은 'A 모델이 1이라고 예측하고, B 모델이 0이라고 예측하고, C 모델이 1이라고 예측했을 때, 정답은 1이더라' 와 같은 패턴을 학습하는 거야. 각 모델의 예측 결과를 보고 최종 결정을 내리는 '감독' 또는 '매니저' 모델이 하나 더 있는 셈이지."
<그림 19: 스태킹 앙상블. 기본 모델들의 예측 결과를 메타 모델이 다시 학습하여 최종 예측을 만든다.>
스태킹 실습: 감독 모델을 영입하라
"Scikit-learn의 StackingClassifier로 직접 구현해보자. 기본 모델로는 로지스틱 회귀, 랜덤 포레스트, SVM을 사용하고, 이들의 예측을 종합할 메타 모델로는 로지스틱 회귀를 사용해보자."
from sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import make_pipelinefrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.svm import SVCfrom sklearn.ensemble import StackingClassifier# 데이터 준비cancer = load_breast_cancer()X, y = cancer.data, cancer.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 1. 기본 모델(Base Models) 정의# 각 모델은 파이프라인으로 묶어주는 것이 좋습니다.estimators = [ ('lr', make_pipeline(StandardScaler(), LogisticRegression(random_state=42))), ('rf', RandomForestClassifier(n_estimators=10, random_state=42)), ('svm', make_pipeline(StandardScaler(), SVC(random_state=42)))]# 2. 스태킹 분류기 생성# final_estimator: 메타 모델로 사용할 모델 객체stacking_model = StackingClassifier( estimators=estimators, final_estimator=LogisticRegression())# 3. 스태킹 모델 학습 및 평가stacking_model.fit(X_train, y_train)accuracy = stacking_model.score(X_test, y_test)print(f"스태킹 분류기 정확도: {accuracy:.4f}")
"스태킹은 이론적으로 가장 뛰어난 성능을 낼 수 있는 앙상블 기법 중 하나라네. 하지만 여러 모델을 학습시키고, 그 예측으로 또 다른 모델을 학습시키는 구조이므로 학습 시간이 오래 걸리고 과적합의 위험도 존재하지. 따라서 신중하게 사용해야 하는 최종 병기와도 같다네."
준이는 이제 단일 모델을 넘어, 여러 모델을 조합하여 최강의 팀을 만드는 다양한 전략들을 모두 배우게 되었습니다. 문제의 특성과 주어진 자원을 고려하여 최적의 앙상블 전략을 선택하는 것이 중요하다는 것을 깨달았습니다.
"자, 이것으로 우리는 머신러닝의 기본 모델부터 성능을 극대화하는 앙상블 기법까지, 아주 긴 여정을 함께했네. 이제 남은 것은 우리가 만든 모델을 어떻게 객관적으로 평가하고, 또 어떻게 최적화할 것인지에 대한 마지막 관문들이야. 다음 장에서는 모델 평가의 또 다른 측면과 차원 축소에 대해 알아보도록 하자."
이번 시간 핵심 정리
- 스태킹(Stacking): 여러 기본 모델(Base Model)의 예측 결과를 새로운 학습 데이터로 사용하여, 최종 결정을 내리는 메타 모델(Meta Model)을 학습시키는 앙상블 기법.
- 계층적 구조: 1단계(기본 모델)와 2단계(메타 모델)의 계층적 구조를 가진다.
- 장점: 이론적으로 가장 높은 성능을 기대할 수 있는 정교한 앙상블 기법이다.
- 단점: 구조가 복잡하고, 학습 시간이 길며, 과적합의 위험이 있다.
- 활용: 최고의 성능을 위해 마지막 한 방울까지 짜내야 하는 데이터 경진대회 등에서 많이 사용된다.