AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

머신러닝/머신러닝: 심화 내용

머신러닝 앙상블 기법 2 : 스태킹(Stacking)

qordnswnd123 2024. 12. 27. 11:45

1. 스태킹(Stacking)

스태킹(Stacking) 은 앙상블 학습의 한 방법으로, 여러 가지 모델의 예측 결과를 결합하여 최종적인 예측을 만드는 기법입니다.
스태킹의 핵심 아이디어는 n개의 개별 모델들의 예측값을 새로운 특성으로 사용하여 최종 예측을 수행하는 1개의 메타 모델(meta model)을 학습하는 것입니다.

 

※ 스태킹의 장점

  • 스태킹은 여러 모델의 강점을 결합하여 전반적인 예측 성능을 향상시키는 데 도움을 줍니다.

※ 스태킹의 주의점

  • 여러 모델을 학습시키고 예측을 수행해야 하므로 계산 비용이 높을 수 있습니다.
  • 본 모델들의 예측 결과를 기반으로 메타 모델이 다시 예측을 수행하기 때문에, 과적합의 위험이 있습니다.

2. 스태킹 코드

2.1 데이터 준비

import pandas as pd
from sklearn.model_selection import train_test_split

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submission = pd.read_csv('sample_submission.csv')

# 독립변수 / 종속변수 설정
train_x = train.drop(['index', 'type', 'quality'], axis = 1)
train_y = train['quality']
x_test = test.drop(['index', 'type'], axis = 1)

# 학습에는 x_train, y_train / 스태킹에는 x_valid, y_valid를 사용  
x_train, x_valid, y_train, y_valid = train_test_split(
                        train_x, train_y, test_size = 0.5, random_state = 42
)

 

2.2 기본 모델의 정의, 학습 및 예측 수행

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, ExtraTreesClassifier

rf = RandomForestClassifier(n_estimators = 10)
gb = GradientBoostingClassifier(n_estimators = 10)
et = ExtraTreesClassifier(n_estimators = 10)

# 학습 데이터로 모델 학습
rf.fit(x_train, y_train)
gb.fit(x_train, y_train)
et.fit(x_train, y_train)

# 스태킹 학습에 사용할 데이터
pred1 = rf.predict_proba(x_valid)
pred2 = gb.predict_proba(x_valid)
pred3 = et.predict_proba(x_valid)

# 스태킹 예측에 사용할 데이터
test_pred1 = rf.predict_proba(x_test)
test_pred2 = gb.predict_proba(x_test)
test_pred3 = et.predict_proba(x_test)

2.3 스태킹을 위한 학습 및 테스트 데이터 생성

import numpy as np

# shape = (학습/ 테스트데이터의 개수, 모델의 수) 
train_stack = np.column_stack((pred1,pred2,pred3))
test_stack = np.column_stack((test_pred1,test_pred2,test_pred3))

print(train_stack)
print(train_stack.shape)
[[0.  0.  0.  ... 0.8 0.1 0. ]
 [0.  0.  0.  ... 0.  0.  0. ]
 [0.  0.  0.2 ... 0.  0.  0. ]
 ...
 [0.  0.  0.2 ... 0.3 0.  0. ]
 [0.  0.  0.2 ... 0.  0.  0. ]
 [0.  0.  0.2 ... 0.3 0.  0. ]]
(2749, 21)

 

train_stack 과 test_stack이 각각 21개의 열을 가지는 이유는 모델별로 predict_porba() 메서드가 반환하는 예측확률이 클래스 수에따라 결정되기 때문입니다.

세 모델이 모두 7개의 클래스에 대한 확률을 예측하기 때문에, 이들 모델의 예측 확률을 수평으로 결합하면 7개 클래스 확률 x 3개 모델 = 총21개의 열 이 생성됩니다.

 

이 데이터는 스태킹 과정에서 메타 모델이 학습할 특성 집합을 형성합니다.

메타 모델은 이러한 확률 데이터를 기반으로 최종 예측을 위한 패턴을 학습합니다.

 

2.4 메타 모델 학습 및 최종 예측 수행

# 메타 모델 정의 및 학습
meta_model = RandomForestClassifier(n_estimators = 10, random_state = 42)
meta_model.fit(train_stack, y_valid)

# 학습된 메타 모델을 사용하여 최종 예측 수행
final_pred = meta_model.predict(test_stack)

submission['quality'] = final_pred
submission.head()


3. 사이킷런의 StackingClassifier 활용

from sklearn.ensemble import StackingClassifier

estimators = [
('rf', RandomForestClassifier(n_estimators = 10)),
('gb', GradientBoostingClassifier(n_estimators = 10)),
('et', ExtraTreesClassifier(n_estimators = 10))
]

meta_model = RandomForestClassifier(n_estimators = 10, random_state = 42)

stacked_model = StackingClassifier(estimators = estimators,
                                  final_estimator = meta_model,
                                  cv = 3)

# train_x, train_y는 전체 train 데이터를 의미합니다.
stacked_model.fit(train_x, train_y)
stack_pred = stacked_model.predict(x_test)

submission['quality'] = stack_pred
submission.head()