Stacking

김승혁·2024년 11월 18일
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}%")

Stacking 앙상블 모델에서 1차 모델(level-1 모델)의 예측값은 2차 모델(level-2 모델)의 입력값이 됩니다.

자세한 설명:

  1. 1차 모델 (Base Model)들:

    • 여러 개의 1차 모델을 사용하여, 훈련 데이터를 기반으로 예측을 수행합니다.
    • 예를 들어, 로지스틱 회귀, 랜덤 포레스트, SVM 등 여러 모델이 있을 수 있습니다.
    • 각 1차 모델은 입력 데이터를 처리하여 예측값(보통 확률값)을 출력합니다.
    • 각 모델의 예측값이 결국 2차 모델(메타 모델)의 입력값이 됩니다.
  2. 2차 모델 (Meta-Model):

    • 2차 모델은 1차 모델들의 예측값을 입력으로 받아, 최종 예측을 생성하는 모델입니다.
    • 1차 모델들이 예측한 확률값을 특징(feature)으로 사용하여, 2차 모델은 이를 기반으로 최종 클래스를 예측합니다.
    • 로지스틱 회귀와 같은 간단한 모델을 2차 모델로 사용하는 경우가 많습니다.

예시:

  • 예를 들어, 3개의 1차 모델(로지스틱 회귀, 랜덤 포레스트, SVM)이 있다고 합시다.
  • 각 모델은 1차 예측값을 확률값 형태로 출력합니다. 예를 들어, 각 모델의 예측값은 다음과 같을 수 있습니다:
    • 모델 1 (로지스틱 회귀): [0.3, 0.7]
    • 모델 2 (랜덤 포레스트): [0.4, 0.6]
    • 모델 3 (SVM): [0.2, 0.8]
  • 이 예측값들은 2차 모델의 입력값으로 사용됩니다. 2차 모델(예: 로지스틱 회귀)은 이 예측값들을 바탕으로 최종 예측을 생성합니다.

구체적인 과정:

  1. 1차 모델 학습:
    각 모델이 훈련 데이터에서 학습을 수행합니다. 이때 각 모델은 독립적으로 학습하고, 훈련 데이터에 대한 예측값을 생성합니다.

  2. 예측값 결합:
    각 모델의 예측값(일반적으로 확률값)을 결합하여 새로운 특징 벡터를 만듭니다. 이 벡터는 2차 모델의 입력값이 됩니다.

  3. 2차 모델 학습:
    1차 모델들의 예측값을 특징으로 사용하여 2차 모델을 학습합니다. 이 모델은 각 1차 모델의 예측이 얼마나 신뢰할 수 있는지(어떤 모델의 예측을 더 신뢰할 것인지) 학습합니다.

  4. 최종 예측:
    학습된 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.stackNumPy에서 제공하는 함수로, 여러 배열을 하나의 새로운 축(axis)으로 결합하는 데 사용됩니다. 이 함수는 여러 배열을 새로운 축을 기준으로 "스택"하여 하나의 큰 배열을 생성합니다.

기본 구문:

numpy.stack(arrays, axis=0, out=None)

매개변수:

  • arrays: 결합하려는 배열들의 리스트 또는 튜플입니다. 모든 배열의 크기(shape)가 동일해야 합니다.
  • axis: 결합할 축을 지정하는 정수입니다. 기본값은 0입니다.
    • axis=0: 배열들을 새로운 첫 번째 축(axis)으로 결합.
    • axis=1: 배열들을 새로운 두 번째 축으로 결합.
    • axis=2: 배열들을 새로운 세 번째 축으로 결합.
  • out: 결과를 저장할 배열로, 지정하지 않으면 새로운 배열이 반환됩니다.

반환값:

  • 새로운 배열이 반환됩니다. 원본 배열들은 변경되지 않습니다.

예시:

  1. 기본 예시: 여러 1D 배열을 새로운 축으로 결합하기
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)

profile
열심히 사는 척

0개의 댓글