728x90
stacking
개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어(stacking) 별도의 ML알고리즘으로 최종학습을 수행하고,
테스트 데이터를 기반으로 다시 최종 예측을 수행하는 방식
교차 검증 세트 기반의 스태킹
스텝1
- 학습데이터 세트와 테스트 데이터 세트로 분리
- 학습데이터를 K-fold 교차검증 함 (이미지에서는 3번)
- 학습폴드 2개, 검증폴드 1로 예측결과 값을 쌓음 (교차검증이 3이라 3개가 쌓임)
- 해당 예측 결과값들은 최종 메타 모델에서 학습데이터로 사용
- K-fold로 한번 교차검증 할 때마다 학습된 개별모델로 테스트 세트를 예측하고, 예측한 결과값을 쌓음
- 학습데이터가 교차검증 3번했으니, 그때마다 학습된 개별 모델로 학습하기 때문에 예측 결과값이 3개쌓임
- 해당 예측 결과값은 최종 메타 모델에서 테스트 데이터로 사용
스텝2
- 위에서 설명한 스텝1이 이미지의 개별모델 1에 해당
- 다른 머신러닝 모델을 4개를 각각 스텝1처럼 쌓아서 스텝 1에서 학습데이터로 예측한 결과값들끼리(학습데이터로 사용됨), 테스트 데이터에서 예측한 결과값끼리 쌓음(예측 데이터로 사용 됨)
- 최종 메타모델로 학습데이터로 쌓은 데이터 세트를 학습하고, 테스트 데이터로 쌓은 예측 결과값으로 예측
- 평가는 원본 테스트 데이터로 진행
교차 검증 세트 기반의 스태킹 실습
1. test데이터와 train데이터로 분리
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)
2. 우선 모델 학습을 위한 classifier 생성
개별ML모델을 위한 classifier, 최종 stacking 모델을 위한 classifier 생성
# 개별 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()
3. train데이터에서 kfold 교차검증으로 학습/검증한 예측 결과값을 쌓고, 각 학습된 모델로 test데이터를 예측한 결과값을 평균하여 테스트 데이터로 생성
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
# 개별 기반 모델에서 최종 메타 모델이 사용할 학습 및 테스트용 데이터를 생성하기 위한 함수.
def get_stacking_base_datasets(model, X_train_n, y_train_n, X_test_n, n_folds ):
# 지정된 n_folds값으로 KFold 생성.
kf = KFold(n_splits=n_folds, shuffle=False)
#추후에 메타 모델이 사용할 학습 데이터 반환을 위한 넘파이 배열 초기화
train_fold_pred = np.zeros((X_train_n.shape[0] ,1 ))
test_pred = np.zeros((X_test_n.shape[0],n_folds))
print(model.__class__.__name__ , ' model 시작 ')
for folder_counter , (train_index, valid_index) in enumerate(kf.split(X_train_n)):
#입력된 학습 데이터에서 기반 모델이 학습/예측할 폴드 데이터 셋 추출
print('\t 폴드 세트: ',folder_counter,' 시작 ')
X_tr = X_train_n[train_index]
y_tr = y_train_n[train_index]
X_te = X_train_n[valid_index]
#폴드 세트 내부에서 다시 만들어진 학습 데이터로 기반 모델의 학습 수행.
model.fit(X_tr , y_tr)
#폴드 세트 내부에서 다시 만들어진 검증 데이터로 기반 모델 예측 후 데이터 저장.
train_fold_pred[valid_index, :] = model.predict(X_te).reshape(-1,1)
#입력된 원본 테스트 데이터를 폴드 세트내 학습된 기반 모델에서 예측 후 데이터 저장.
test_pred[:, folder_counter] = model.predict(X_test_n)
# 폴드 세트 내에서 원본 테스트 데이터를 예측한 데이터를 평균하여 테스트 데이터로 생성
test_pred_mean = np.mean(test_pred, axis=1).reshape(-1,1)
#train_fold_pred는 최종 메타 모델이 사용하는 학습 데이터, test_pred_mean은 테스트 데이터
return train_fold_pred , test_pred_mean
각 머신러닝 모델별로 학습
knn_train, knn_test = get_stacking_base_datasets(knn_clf, X_train, y_train, X_test, 7)
rf_train, rf_test = get_stacking_base_datasets(rf_clf, X_train, y_train, X_test, 7)
dt_train, dt_test = get_stacking_base_datasets(dt_clf, X_train, y_train, X_test, 7)
ada_train, ada_test = get_stacking_base_datasets(ada_clf, X_train, y_train, X_test, 7)
4. 각 모델별로 쌓은 학습과 테스트 데이터를 합침
Stack_final_X_train = np.concatenate((knn_train, rf_train, dt_train, ada_train), axis=1)
Stack_final_X_test = np.concatenate((knn_test, rf_test, dt_test, ada_test), axis=1)
print('원본 학습 피처 데이터 Shape:',X_train.shape, '원본 테스트 피처 Shape:',X_test.shape)
print('스태킹 학습 피처 데이터 Shape:', Stack_final_X_train.shape,
'스태킹 테스트 피처 데이터 Shape:',Stack_final_X_test.shape)
5. 최종모델로 학습 및 예측
각 모델에서 학습데이터를 쌓은 데이터 세트로 학습하고, 테스트 데이터로 쌓은 예측 결과값을 예측
평가는 원본 테스트 데이터로 진행
lr_final.fit(Stack_final_X_train, y_train)
stack_final = lr_final.predict(Stack_final_X_test)
print('최종 메타 모델의 예측 정확도: {0:.4f}'.format(accuracy_score(y_test, stack_final)))
728x90
'머신러닝' 카테고리의 다른 글
[분류] 신용카드 사기 검출 (1) | 2024.03.06 |
---|---|
하이퍼파라미터 튜닝 방법 - Bayesian Optimization (0) | 2024.03.04 |
[분류] 부스팅 - XGBoost (0) | 2024.03.03 |
[분류] 앙상블 학습 - 보팅, 배깅, 부스팅 (0) | 2024.03.03 |
[분류] 랜덤포레스트 RandomForest (0) | 2024.03.03 |