728x90

스태킹 Stacking

- 여러 모델들을 결합하여 결과를 도출하는 앙상블 기법 중 하나.

- 각 모델들의 예측 결과를 학습하여 최종 예측결과를 도출

 

 

1. 라이브러리 임포트

- 기본 모델로 knn, random forest, adaboost, decisiont tree 4가지

- 마지막 모델로 logistic regression

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
from utils.common import show_metrics

 

 

2. 데이터 로드 및 조회

- 행 569, 열 30개 데이터

- 악성과 양성사이 큰 비율 차이는 없음

data = load_breast_cancer()
X = data.data
y = data.target
print(data.DESCR)

import pandas as pd
print(pd.Series(y).value_counts())

 

 

 

3. 각 분류기 학습, 성능 확인

- 각 분류기 학습 및 성능 출력, 예측 데이터 쌓기

- lr_final에 학습 용 데이터를 만들기 위해 예측 데이터 shape가 (4, 114) 인것을 전치. 114행 4열 데이터로 변환

 

def get_model_train_eval(model, ftr_train=None, ftr_test=None,
                        tgt_train=None, tgt_test=None):
    model.fit(ftr_train, tgt_train)
    y_pred = model.predict(ftr_test)
    show_metrics(y_test, y_pred)
    return model, y_pred

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
                                                   random_state=10)
knn = KNeighborsClassifier()
rf = RandomForestClassifier(random_state=10)
dt = DecisionTreeClassifier()
ada = AdaBoostClassifier()
lr_final = LogisticRegression()

clfs = [knn, rf, dt, ada]
y_preds = []
for idx, clf in enumerate(clfs):
    print("\n", clf.__class__.__name__)
    clfs[idx], y_pred = get_model_train_eval(clf, ftr_train=X_train, ftr_test=X_test,
                        tgt_train=y_train, tgt_test=y_test)
    y_preds.append(y_pred)

y_preds = np.array(y_preds)
print(y_preds.shape)
y_preds = y_preds.T

 

 

4. 최종 스태킹 모델 학습 결과

- 랜덤 포레스트 하나만 사용한 경우 보다는 성능이 저하되었으나, 타 분류기들보다는 개선된 결과를 보임

- 실제 사용시 하이퍼 파라미터를 최적으로 튜닝한 후에 사용하여야 함.

 

final, y_pred = get_model_train_eval(lr_final, ftr_train=y_preds, ftr_test=y_preds,
                    tgt_train=y_test, tgt_test=y_test)

 

300x250

+ Recent posts