본문 바로가기
DATA_SCIENCE/Deep Learning

[딥러닝] 앙상블 모델 (Ensemble) 방법, 배깅 (Bagging), 부스팅 (Boosting), 스태킹 (Stacking) 해설, 정리, 요약

by HYUNHP 2023. 2. 9.
728x90
반응형

안녕하세요, HELLO

오늘은 딥러닝에서 여러 모델을 합성하여, 모델의 성능을 개선하는 앙상블 (Ensemble) 방법에 대해서 정리하고자 합니다. 앙상블 방법에는 배깅 (Bagging), 부스팅 (Boosting), 스태킹 (Stacking)으로 구성되고, 개념 정리, 예시 그리고 각각의 코드 구현을 통해 살펴보고자 합니다.


CHAPTER 1. '앙상블 (Ensemble) 방법' 선행 지식

CHAPTER 2. '배깅 (Bagging)' 정리

CHAPTER 3. '부스팅 (Boosting)' 정리

CHAPTER 4. '스태킹 (Stacking)' 정리


CHAPTER 1. '앙상블 (Ensemble) 방법' 선행 지식

ensemble image


딥러닝의 앙상블 (Ensemble) 방법은 시스템의 전반적인 성능과 견고성을 개선하기 위해, 여러 딥러닝 모델을 결합하는 데 사용되는 일련의 기술을 의미합니다. 여러 모델의 예측을 결합하고 집합적인 강점을 더하고과 약점을 개선함으로써 모델의 성능 향상을 달성합니다.

딥러닝의 앙상블 방법에는 다음과 같은 몇 가지 기술이 사용됩니다.

  • Model Averaging: 동일한 데이터 세트에서 여러 모델을 교육한 다음 모든 모델의 예측을 평균하여 최종 결과를 얻는 것이 포함됩니다. 이 방법의 기본 아이디어는 결합된 모델이 데이터 세트의 특정 기능에 의해 영향을 받을 가능성이 적기 때문에, 단일 모델보다 더 강력하다는 것입니다.
  • Model Stacking: 여러 모델을 교육한 다음 메타 모델을 교육하여, 다른 모델의 예측을 기반으로 최종 예측을 수행하는 것입니다. 이 방법의 기본 아이디어는 여러 모델의 강점을 활용하여 보다 정확한 최종 예측을 수행하는 것입니다.
  • Ensemble Convolutional Neural Networks(ECNNs): 여러 개의 CNN(Convolutional Neural Networks)을 교육하고, 이러한 모델의 예측을 결합하여 최종 예측을 수행하는 것이 포함됩니다. 이 방법의 기본 아이디어는 여러 CNN의 강점을 활용하여 보다 정확한 예측을 하는 것입니다.
  • Model Ensemble with Boosting: 여러 모델을 교육하고 부스팅 알고리즘을 사용하여 다양한 모델의 예측에 가중치를 부여하여 최종 예측을 수행합니다. 이 방법의 기본 아이디어는 데이터 세트에서 더 잘 수행되는 모델에 더 많은 가중치를 부여하고, 제대로 수행되지 않는 모델에 더 적은 가중치를 부여하는 것입니다.
  • 앙상블 순환 신경망(Ensemble Recurrent Neural Networks, ERNN): 여러 순환 신경망(RNN)을 교육하고 이러한 모델의 예측을 결합하여 최종 예측을 수행하는 것이 포함됩니다. 이 방법의 기본 아이디어는 여러 RNN의 강점을 활용하여 보다 정확한 예측을 하는 것입니다.


딥러닝에서 앙상블 방법은 이미지 분류, 객체 감지, 음성 인식, 자연어 처리와 같은 다양한 작업에 적용될 수 있습니다. 앙상블 방법을 사용하면 시스템의 전반적인 성능과 견고성을 개선하고 과적합을 줄이고 일반화를 개선하는 데 도움이 될 수 있습니다.

앙상블 학습에 사용되는 알고리즘

  • 랜덤 포레스트
  • 그래디언트 부스팅 머신(GBM)
  • 에이다부스트
  • XGBoost
  • etc

CHAPTER 2. '배깅 (Bagging)' 정리

bagging structure


Bootstrap Aggregating의 약자인 Bagging은 딥러닝에서도 널리 사용되는 기술입니다. Bagging은 신경망 모델의 성능과 안정성을 향상하기 위한 앙상블 방법입니다. Bagging의 기본 아이디어는 학습 데이터의 서로 다른 하위 집합에 대해, 동일한 아키텍처로 여러 독립 모델을 학습한 다음, 이러한 모델의 예측을 결합하여 최종 예측을 만드는 것입니다.

Bagging을 적용하는 방법은 다음과 같습니다.

  • 데이터 샘플링: 먼저 데이터의 여러 하위 집합을 생성하기 위해 대체 데이터를 사용하여 교육 데이터를 무작위로 샘플링해야 합니다. 이는 부트스트래핑 또는 무작위 샘플링을 통해 달성할 수 있습니다.
  • 모델 교육: 다음으로 데이터의 서로 다른 하위 집합에서 동일한 아키텍처로 여러 독립 모델을 교육합니다. 이러한 모델은 병렬로 훈련될 수 있으므로 훈련 프로세스를 보다 효율적으로 만듭니다.
  • 모델 예측: 모델을 교육한 후 각 모델을 사용하여 새 데이터를 예측할 수 있습니다. 각 모델의 예측은 다양한 방식으로 결합되어 최종 예측을 할 수 있습니다. 예를 들어, 예측을 결합하는 가장 일반적인 방법은 평균 또는 다수결 투표를 하는 것입니다.

딥러닝에서 Bagging을 사용하는 이점 중 하나는 과적합을 줄이는 데 도움이 된다는 것입니다. 데이터의 서로 다른 하위 집합에 대해 여러 모델을 교육함으로써, 모델이 데이터의 한 하위 집합에 너무 근접하게 적합하지 않도록 하여 과적합을 방지할 수 있습니다. Bagging은 또한 최종 예측이 하나가 아닌 여러 모델을 기반으로 하기 때문에, 분산을 줄이는 데 도움이 됩니다.

결론적으로 Bagging은 신경망 모델의 성능과 안정성을 향상하기 위해 딥러닝에 적용할 수 있는 유용한 앙상블 기법입니다.

Bagging에 사용되는 알고리즘

  • 랜덤 포레스트
  • etc

Python에서 Random Forest 알고리즘은 scikit-learn 라이브러리를 사용하여 구현할 수 있습니다.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)

clf = RandomForestClassifier(n_estimators=100, random_state=0)
clf.fit(X, y)

print("Accuracy:", clf.score(X, y))

 

반응형


CHAPTER 3. '부스팅 (Boosting)' 정리

boosting structure


Boosting은 딥러닝 분야, 특히 컴퓨터 비전 및 자연어 처리 영역에서 널리 사용되는 강력한 앙상블 방법입니다. Boosting은 여러 약한 모델을 결합하여 정확도가 향상된 강력한 모델을 형성하는 반복 알고리즘입니다. 딥러닝 분야에서 Boosting은 딥뉴럴 네트워크의 성능을 향상하기 위해 자주 사용됩니다.

Boosting 알고리즘에는 다음을 포함하여 여러 방법이 있습니다.

  • Adaboost: Adaboost는 딥 러닝에서 널리 사용되는 인기 있는 부스팅 알고리즘입니다. 여러 약한 분류기를 훈련하고 잘못 분류된 샘플에 더 높은 가중치를 할당하여 작동합니다. 이러한 가중치는 다음 약한 분류기를 훈련하는 데 사용되며 원하는 수의 분류기가 훈련될 때까지 프로세스가 반복됩니다. 최종 예측은 모든 약한 분류기의 출력을 결합하여 이루어집니다.
  • Gradient Boosting: Gradient Boosting은 경사하강법 최적화 알고리즘을 기반으로 하는 부스팅 알고리즘입니다. 각 분류자가 이전 분류자가 저지른 오차를 수정하도록 훈련되는 반복적인 방식으로, 약한 분류자 (weak classifier)를 훈련함으로써 작동합니다. 최종 예측은 모든 약한 분류기의 출력을 결합하여 이루어집니다.
  • XGBoost: XGBoost는 딥러닝에서 널리 사용되는 인기 있는 오픈 소스 Gradient Boosting 알고리즘입니다. 정규화, 기능 선택 및 병렬 처리와 같은 몇 가지 기본 제공 기능이 있어 딥 러닝 문제에 효과적인 알고리즘이 됩니다.


딥러닝 분야에서 부스팅 알고리즘은 CNN(Convolutional Neural Networks) 및 RNN(Recurrent Neural Networks)과 함께 성능 향상을 위해 자주 사용됩니다. 그리고 사전 훈련된 심층 신경망을 새로운 작업에 적용하는 데 사용되는 기술인 전이 학습의 성능을 향상하기 위해, 부스팅 알고리즘을 사용할 수도 있습니다.

부스팅에 사용되는 알고리즘

  • AdaBoost
  • Gradient Boosting Machines (GBM)
  • XGBoost
  • etc

Python에서 Adaboost 알고리즘은 scikit-learn 라이브러리를 사용하여 구현할 수 있습니다.

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

clf = AdaBoostClassifier(n_estimators=100, random_state=0)
clf.fit(X_train, y_train)

print("Accuracy:", clf.score(X_test, y_test))


Python에서 Adaboost 알고리즘을 scikit-learn 라이브러리와 케라스를 사용해서도 구현할 수 있습니다.

from keras.layers import Dense, Input
from keras.models import Model
from keras.utils import to_categorical
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

inputs = Input(shape=(4,))
x = Dense(64, activation="relu")(inputs)
x = Dense(32, activation="relu")(x)
outputs = Dense(2, activation="softmax")(x)

model = Model(inputs, outputs)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
model.fit(X_train, to_categorical(y_train), epochs=10, batch_size=32)

clf = AdaBoostClassifier(base_estimator=model, n_estimators=100, random_state=0)
clf.fit(X_train, y_train)

print("Accuracy:", clf.score(X_test, y_test)

 


CHAPTER 4. '스태킹 (Stacking)' 정리

stacking structure


Stacking은 딥러닝 분야에서 널리 사용되는 대중적인 앙상블 방법입니다. 딥러닝에서 Stacking은 여러 모델을 학습하고 결합하여 단일 모델의 성능을 향상하는 기술입니다. Stacking의 기본 아이디어는 동일한 교육 데이터에 대해 서로 다른 모델을 교육한 다음 이러한 모델의 출력을 결합하여 최종 예측을 만드는 것입니다.

Stacking은 여러 가지 방법으로 구현할 수 있습니다. 일반적인 접근 방식 중 하나는 여러 기본 모델의 출력을 입력으로 사용하고 최종 예측을 수행하는 모델인 메타 모델을 사용하는 것입니다. 기본 모델은 CNN(Convolutional Neural Networks), RNN(Recurrent Neural Networks) 또는 ANN(Artificial Neural Networks)과 같은 모든 유형의 심층 학습 모델이 될 수 있습니다.

스태킹에 사용되는 알고리즘

  • Stacked Generalization (Stacking)
  • etc

Python에서 Stacked Generalization(Stacking) 알고리즘은 scikit-learn 라이브러리를 사용하여 구현할 수 있습니다.

from sklearn.ensemble import StackingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

estimators = [("dt", DecisionTreeClassifier(random_state=0)), ("lr", LogisticRegression(random_state=0))]
clf = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression(random_state=0))
clf.fit(X_train, y_train)

print("Accuracy:", clf.score(X_test, y_test))


추가적으로, 다른 Stacking 모델을 구현하기 위한 Python의 예제 코드입니다.

이 예에서 Stacking 모델은 2개의 기본 모델 (Logistic Regression and Decision Tree Classifier)과 메타 모델 (a simple Neural Network with two dense layers)으로 구성됩니다. 기본 모델은 훈련 데이터에 대해 훈련되고, 그 출력은 meta-features matrix를 형성하기 위해 결합됩니다. 그리고 meta-features matrix는 최종 예측을 만드는 메타 모델에 대한 입력으로 사용됩니다.

import numpy as np
from sklearn.ensemble import StackingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from keras.models import Sequential
from keras.layers import Dense

X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

# Define the base models
base_models = [LogisticRegression(random_state=0), DecisionTreeClassifier(random_state=0)]

# Define the meta-model
meta_model = Sequential()
meta_model.add(Dense(64, activation='relu', input_dim=2))
meta_model.add(Dense(1, activation='sigmoid'))
meta_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# Fit the stacking model
stacking = StackingClassifier(estimators=base_models, final_estimator=meta_model, cv=3)
stacking.fit(X_train, y_train)

# Evaluate the model
print("Accuracy:", stacking.score(X_test, y_test))

■ 마무리

'앙상블 모델 (Ensemble) 방법, 배깅 (Bagging), 부스팅 (Boosting), 스태킹 (Stacking)'에 대해서 정리해 봤습니다.

그럼 오늘 하루도 즐거운 나날 되길 기도하겠습니다
좋아요댓글 부탁드립니다 :)

감사합니다.

반응형

댓글