import numpy as np
import pandas as pd
from sklearn.model_selection import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
# Iris 데이터 로드
data = load_iris()
X = data.data
y = data.target
# KFold 설정
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# Level 1 모델 정의
model_1 = LogisticRegression(max_iter=1000)
model_2 = RandomForestClassifier(n_estimators=100, random_state=42)
model_3 = SVC(kernel='linear', probability=True, random_state=42)
# Level 2 스택 모델을 위한 로지스틱 회귀
stacking_model = LogisticRegression()
# 각 모델의 예측을 저장할 리스트
level_1_predictions = []
# KFold cross-validation
for train_index, val_index in kf.split(X):
X_train, X_val = X[train_index], X[val_index]
y_train, y_val = y[train_index], y[val_index]
# 1단계 모델 훈련
model_1.fit(X_train, y_train)
model_2.fit(X_train, y_train)
model_3.fit(X_train, y_train)
# 1단계 모델들의 예측 결과 (각 모델의 예측 확률을 사용)
pred_1 = model_1.predict_proba(X_val)
pred_2 = model_2.predict_proba(X_val)
pred_3 = model_3.predict_proba(X_val)
# 예측 결과를 stacking 모델의 훈련 데이터로 사용하기 위해 저장
level_1_predictions.append(np.column_stack((pred_1, pred_2, pred_3)))
# Level 1 모델들의 예측을 하나의 데이터셋으로 결합
X_level_1 = np.vstack(level_1_predictions)
# Level 2 모델 훈련
# Level 1의 예측값 == Level2의 입력값
stacking_model.fit(X_level_1, y)
# 최종 예측
final_predictions = stacking_model.predict(X_level_1)
# 정확도 평가
accuracy = accuracy_score(y, final_predictions)
print(f"Stacking 모델의 정확도: {accuracy * 100:.2f}%")
1차 모델 (Base Model)들:
2차 모델 (Meta-Model):
1차 모델 학습:
각 모델이 훈련 데이터에서 학습을 수행합니다. 이때 각 모델은 독립적으로 학습하고, 훈련 데이터에 대한 예측값을 생성합니다.
예측값 결합:
각 모델의 예측값(일반적으로 확률값)을 결합하여 새로운 특징 벡터를 만듭니다. 이 벡터는 2차 모델의 입력값이 됩니다.
2차 모델 학습:
1차 모델들의 예측값을 특징으로 사용하여 2차 모델을 학습합니다. 이 모델은 각 1차 모델의 예측이 얼마나 신뢰할 수 있는지(어떤 모델의 예측을 더 신뢰할 것인지) 학습합니다.
최종 예측:
학습된 2차 모델은 1차 모델들의 예측값을 바탕으로 최종 예측을 생성합니다.
# 1차 모델 학습 및 예측
model_1.fit(X_train, y_train)
model_2.fit(X_train, y_train)
model_3.fit(X_train, y_train)
# 1차 모델들의 예측 (확률값)
pred_1 = model_1.predict_proba(X_val)
pred_2 = model_2.predict_proba(X_val)
pred_3 = model_3.predict_proba(X_val)
# 예측값을 결합하여 2차 모델의 입력값 생성
X_level_1 = np.column_stack((pred_1[:, 1], pred_2[:, 1], pred_3[:, 1]))
# 2차 모델 (로지스틱 회귀) 학습
stacking_model.fit(X_level_1, y_val)
# 2차 모델을 사용한 최종 예측
final_predictions = stacking_model.predict(X_level_1)
X_level_1은 1차 모델들의 예측 결과를 결합한 것입니다. 각 모델의 예측 확률을 결합하여 2차 모델의 학습 데이터를 만듭니다.stacking_model.fit(X_level_1, y_val)에서 로지스틱 회귀 모델이 학습되며, 이는 1차 모델들의 예측값을 기반으로 최종 예측을 생성할 수 있도록 학습됩니다.결과적으로, 2차 모델은 1차 모델들의 예측값을 입력으로 받아 최종 예측을 생성하는 역할을 합니다.
np.stack은 NumPy에서 제공하는 함수로, 여러 배열을 하나의 새로운 축(axis)으로 결합하는 데 사용됩니다. 이 함수는 여러 배열을 새로운 축을 기준으로 "스택"하여 하나의 큰 배열을 생성합니다.
numpy.stack(arrays, axis=0, out=None)
arrays: 결합하려는 배열들의 리스트 또는 튜플입니다. 모든 배열의 크기(shape)가 동일해야 합니다.axis: 결합할 축을 지정하는 정수입니다. 기본값은 0입니다.axis=0: 배열들을 새로운 첫 번째 축(axis)으로 결합.axis=1: 배열들을 새로운 두 번째 축으로 결합.axis=2: 배열들을 새로운 세 번째 축으로 결합.out: 결과를 저장할 배열로, 지정하지 않으면 새로운 배열이 반환됩니다.import numpy as np
# 1D 배열들
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])
# axis=0으로 스택
result = np.stack([a, b, c], axis=0)
print(result)