1. 스태킹 앙상블

<aside> 💡 개별 알고리즘의 예측 결과 dataset을 최종적인 메타 dataset으로 만들어 별도 ML 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행하는 방식이다.

</aside>

공통점 & 차이점

공통점

배깅, 부스팅 그리고 스태킹 모두 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출한다.

차이점

스태킹은 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행한다.

스태킹 수행 과정

→ 스태킹엔 개별적인 기반 모델과 최종 메타 모델이 필요

→ 여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해 최종 메타 모델의 학습용 feature dataset와 테스트 feature dataset을 만드는 것

Untitled

Example > M개의 row, N개의 feature(column)을 가진 dataset(M x N)가 있고 스태킹 앙상블을 위해 3개의 개별 모델이 있다고 가정

  1. 각 개별 모델을 학습을 시킨 뒤 예측을 수행하면 각 M개의 row를 가진 1개의 label 값을 도출
  2. 각 개별 모델에서 도출된 label들을 stacking하여 M개의 row와 3개의 column(모델이 3개)을 가진 새로운 dataset를 생성
  3. 최종 모델에 적용하여 최종 예측을 수행

2. 기본 스태킹 모델

# Library
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 불러오기
cancer_data = load_breast_cancer()

X_data = cancer_data.data
y_label = cancer_data.target

# 훈련 데이터와 테스트(검증)데이터 나누기
X_train, X_test, y_train, y_test = train_test_split(
													X_data, y_label, test_size = 0.2,
													random_state = 0)

# 개별 ML 모델을 위한 Classifier 모델 생성
knn_clf = KNeighborsClassifier(n_neighbors = 4)
rf_clf = RandomForestClassifier(n_estimators = 100, random_state = 0)
dt_clf = DecisionTreeClassifier()
ada_clf = AdaBoostClassifier(n_estimators = 100)

# 최종 Stacking 모델을 위한 Classifier 모델 생성
lr_final = LogisticRegression(C = 10)

# 개별 모델들을 학습
knn_clf.fit(X_train, y_train)
rf_clf.fit(X_train, y_train)
dt_clf.fit(X_train, y_train)
ada_clf.fit(X_train, y_train)

# 학습된 개별 모델들이 각자 반환하는 예측 데이터 셋을 생성하고 개별 모델의 정확도 측정
knn_pred = knn_clf.predict(X_test)
rf_pred = rf_clf.predict(X_test)
dt_pred = dt_clf.predict(X_test)
ada_pred = ada_clf.predict(X_test)

print('KNN 정확도: {0:.4f}'.format(accuracy_score(y_test, knn_pred)))
print('랜덤 포레스트 정확도: {0:.4f}'.format(accuracy_score(y_test, rf_pred)))
print('결정 트리 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))
print('에이다부스트 정확도: {0:.4f}'.format(accuracy_score(y_test, ada_pred)))
# 예측된 예측값을 column level로 옆으로 붙인 후 feature 값 생성
pred = np.array([knn_pred, rf_pred, dt_pred, ada_pred])

# transpose를 이용해 행과 열의 위치 교환
# column level로 각 알고리즘의 예측 결과를 피처로 만듦
pred = np.transpose(pred)

lr_final.fit(pred, y_test)
final = lr_final.predict(pred)
print('최종 메타 모델의 예측 정확도: {0:.4f}'.format(accuracy_score(y_test , final)))

3. CV 세트 기반의 스태킹

<aside> 💡 CV 세트 기반의 스태킹 모델은 개별 모델들이 각각 교차 검증으로 메타 모델을 위한 학습용 스태킹 데이터 생성과 예측을 위한 테스트용 스태킹 데이터를 생성한 뒤 이를 기반으로 메타 모델이 학습과 예측을 수행한다.

</aside>

CV 세트 기반의 스태킹