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()
'머신러닝 > 머신러닝: 심화 내용' 카테고리의 다른 글
머신러닝 앙상블 기법 1 : 보팅(Voting) (0) | 2024.12.26 |
---|---|
LightGBM 모델 (0) | 2024.12.25 |
피처 선택(Feature Selection) (0) | 2024.12.24 |
피처 중요도(Feature Importance) (0) | 2024.12.24 |
피처 생성(Feature Generation) 2 : 다항식 피처 생성 (0) | 2024.12.24 |