앙상블 학습(Ensemble learning)이란?

Study/Deep Learning|2023. 4. 9. 01:01
728x90
반응형

 

앙상블 학습 (Ensemble Learning)은 여러 개의 모델을 조합하여 하나의 예측 모델을 만드는 방법으로, 개별 모델보다 높은 정확도와 안정성을 보이는 것이 특징입니다. 이는 일반적으로 머신러닝에서 최적화 문제를 해결하는 데 사용됩니다.

 
1. 배깅(Bagging)

배깅은 Bootstrap Aggregating의 줄임말로, 동일한 알고리즘을 사용하는 여러 개의 모델을 만들고, 각 모델이 만든 예측 결과를 결합하여 최종 예측을 수행하는 방법입니다. 각 모델은 원래 데이터에서 무작위로 선택된 일부 샘플 데이터를 사용하여 학습됩니다. 이는 과적합을 방지하고 모델의 분산을 줄여 성능을 개선하는 데 도움이 됩니다. 대표적인 알고리즘으로는 랜덤 포레스트 (Random Forest)가 있습니다.

 

  • 랜덤 포레스트(Random Forest)

 랜덤 포레스트는 의사 결정 나무(Decision Tree)를 기본 모델로 사용하는 알고리즘입니다. 여러 개의 의사 결정 나무를 만들어서 학습시키고, 각 나무의 예측 결과를 평균(회귀의 경우) 또는 투표(분류의 경우)를 통해 최종 예측을 결정합니다. 무작위성을 높이기 위해 데이터셋에서 무작위로 특성(feature)을 선택하여 학습시킵니다. 랜덤 포레스트의 학습 과정은 다음과 같습니다.

 

   1) 데이터셋으로부터 부트스트랩 샘플을 추출합니다.

   2) 추출된 샘플로부터 무작위로 특성을 선택하여 의사 결정 나무를 학습시킵니다.

   3) 위 과정을 사용자가 지정한 트리 개수만큼 반복합니다.

   4) 각 트리의 예측 결과를 평균(회귀) 또는 투표(분류)하여 최종 예측을 결정합니다.

 

  • 배깅 결정 나무(Bagging Decision Trees)

배깅 결정 나무(Bagging Decision Trees)는 결정 나무(Decision Tree)를 기본 모델로 사용하고, 배깅(Bagging) 기법을 적용하여 여러 개의 결정 나무를 학습시키고 그 결과를 집계하는 앙상블 학습 방법입니다. 배깅은 과적합을 방지하고 모델의 분산을 줄이는 효과가 있으며, 병렬적으로 학습이 이루어집니다.

 

배깅 결정 나무의 학습 과정은 다음과 같습니다.

 

 1) 데이터셋에서 부트스트랩 샘플(Bootstrap samples)을 추출합니다. 부트스트랩 샘플링은 원본 데이터셋에서 중복을 허용하여 무작위로 샘플을 선택하는 과정입니다. 이렇게 추출된 샘플들은 각각의 결정 나무를 학습시키는 데 사용됩니다.

 2) 각 부트스트랩 샘플에 대해 결정 나무를 학습시킵니다. 이 때, 모든 특성(feature)을 사용하여 학습합니다. 이 과정을 사용자가 지정한 결정 나무의 개수만큼 반복합니다.

 3) 각 결정 나무의 예측 결과를 집계하여 최종 예측을 결정합니다. 회귀 문제의 경우 각 나무의 예측 값을 평균하여 최종 결과를 얻고, 분류 문제의 경우 각 나무의 예측 클래스에 대해 투표를 실시하여 가장 많은 투표를 받은 클래스를 최종 결과로 결정합니다.

 

배깅 결정 나무는 랜덤 포레스트와 비슷한 방식으로 작동하지만, 랜덤 포레스트가 각 결정 나무를 학습할 때 무작위로 특성을 선택하는 반면, 배깅 결정 나무는 모든 특성을 사용하여 학습한다는 점에서 차이가 있습니다. 이로 인해 배깅 결정 나무는 랜덤 포레스트에 비해 다소 덜 무작위하게 작동하며, 랜덤 포레스트에 비해 분산은 높을 수 있지만, 편향은 낮을 수 있습니다.

 

2. 부스팅 (Boosting)

 

부스팅(Boosting)은 앙상블 학습의 한 방법으로, 여러 개의 약한 학습기(Weak Learners)를 순차적으로 학습시켜 각 학습기의 예측 오차를 줄이는 방식으로 작동합니다. 약한 학습기란 단독으로 사용했을 때 예측 성능이 낮은 모델을 의미합니다. 부스팅은 이러한 약한 학습기들을 순차적으로 결합하여 전체적인 예측 성능을 향상시키는 기법입니다.

 

부스팅의 핵심 아이디어는 이전 학습기의 예측 오차를 보완하는 방식으로 새로운 학습기를 학습시키는 것입니다. 각 학습기는 이전 학습기의 오차에 가중치를 더하여 새로운 학습기가 이 오차를 최소화하도록 학습됩니다. 마지막으로, 각 학습기의 예측 결과를 가중치를 고려하여 결합하여 최종 예측을 수행합니다.

 

대표적인 알고리즘으로는 에이다부스트 (AdaBoost), 그래디언트 부스팅 (Gradient Boosting) 등이 있습니다.

AdaBoost(Adaptive Boosting)와 그래디언트 부스팅(Gradient Boosting)은 두 가지 대표적인 부스팅 알고리즘입니다. 두 알고리즘 모두 약한 학습기들을 순차적으로 결합하여 전체적인 예측 성능을 향상시키는 방법이지만, 각각의 접근 방식에 차이가 있습니다.

 

  • AdaBoost(Adaptive Boosting):

AdaBoost는 첫 번째 학습기를 학습시킨 후, 잘못 분류된 데이터 포인트에 높은 가중치를 부여하고 다음 학습기를 학습시킵니다. 이 과정을 반복하면서 각 학습기의 가중치를 업데이트하고, 최종 예측 결과는 각 학습기의 가중치를 고려하여 결합됩니다.

AdaBoost의 학습 과정은 다음과 같습니다.

1) 데이터셋의 모든 관측치에 동일한 가중치를 부여하여 첫 번째 약한 학습기를 학습시킵니다.

2) 첫 번째 약한 학습기의 예측 결과를 바탕으로 오분류된 데이터에 높은 가중치를 부여합니다.

3) 새로 조정된 가중치를 가진 데이터셋을 사용하여 두 번째 약한 학습기를 학습시킵니다.

4) 이 과정을 사용자가 지정한 학습기의 개수만큼 반복합니다.

5) 각 학습기의 가중치를 고려하여 최종 결과를 결합합니다.

 

AdaBoost는 오분류된 데이터에 집중하여 가중치를 조절하고 약한 학습기를 학습시키는 방식으로 작동합니다. 이로 인해 앙상블 모델의 성능이 향상됩니다. 일반적으로 의사 결정 나무를 약한 학습기로 사용하지만, 다른 모델도 사용 가능합니다.

 
  • 그래디언트 부스팅(Gradient Boosting):

그래디언트 부스팅은 약한 학습기를 순차적으로 학습시키되, 이전 학습기의 잔차(Residual)를 최소화하는 방향으로 새로운 학습기를 학습시킵니다. 그래디언트 부스팅은 회귀와 분류 문제 모두에 적용할 수 있으며, 손실 함수의 그래디언트(미분 값)를 사용하여 모델을 업데이트합니다. 이로 인해 최적의 학습 경로를 찾아 손실 함수를 최소화할 수 있습니다.

그래디언트 부스팅의 학습 과정은 다음과 같습니다.

 1) 첫 번째 약한 학습기를 학습시키고 예측 결과를 계산합니다.

 2) 첫 번째 약한 학습기의 예측 결과와 실제 값 사이의 잔차를 계산합니다.

 3) 이 잔차를 목표 변수로 삼아 두 번째 약한 학습기를 학습시킵니다

 4) 이 과정을 사용자가 지정한 학습기의 개수만큼 반복합니다.

 5) 각 학습기의 예측 결과를 합하여 최e) 각 학습기의 예측 결과를 합하여 최종 결과를 얻습니다.

 

그래디언트 부스팅은 손실 함수의 그래디언트(미분 값)를 사용하여 모델을 업데이트하고, 최적의 학습 경로를 찾아 손실 함수를 최소화합니다. 이로 인해 그래디언트 부스팅은 높은 성능을 달성할 수 있습니다. 그래디언트 부스팅은 회귀와 분류 문제 모두에 적용할 수 있으며, 의사 결정 나무 등 다양한 약한 학습기를 사용할 수 있습니다.

AdaBoost와 그래디언트 부스팅은 둘 다 부스팅 방식을 사용하는 알고리즘이지만, 가중치 업데이트 방식과 목표 변수 설정 방식에 차이가 있습니다. AdaBoost는 오분류된 데이터에 가중치를 높이고, 그래디언트 부스팅은 이전 학습기의 예측 결과와 실제 값 사이의 잔차를 최소화하는 방향으로 새로운 학습기를 학습시킵니다.

 

부스팅 알고리즘은 높은 성능을 달성할 수 있지만, 순차적인 학습 방식 때문에 학습 속도가 느리고 병렬화하기 어렵다는 단점이 있습니다. 그러나 최근에는 XGBoost, LightGBM, CatBoost와 같은 효율적인 그래디언트 부스팅 라이브러리가 개발되어 있어, 이러한 문제를 어느 정도 해결할 수 있습니다. 이들 라이브러리는 고급 최적화 기법과 병렬 처리 기능을 사용하여 그래디언트 부스팅의 학습 속도를 크게 개선하였습니다.

 
 

3. 스태킹(Stacking)

스태킹(Stacking)은 앙상블 학습의 한 방법으로, 여러 개의 다양한 기본 모델(Base Models)의 예측 결과를 조합하여 새로운 메타 모델(Meta Model)을 학습시키는 기법입니다. 스태킹은 여러 모델의 강점을 결합하여 더 나은 예측 성능을 달성할 수 있습니다.

 

스태킹의 학습 과정은 다음과 같습니다.

 

1) 훈련 데이터셋을 두 개의 서브셋(Subsets)으로 나눕니다. 일반적으로 첫 번째 서브셋은 기본 모델을 학습시키는 데 사용되며, 두 번째 서브셋은 메타 모델을 학습시키는 데 사용됩니다.

2) 첫 번째 서브셋을 사용하여 다양한 기본 모델을 학습시킵니다. 이 모델들은 서로 다른 알고리즘을 사용하거나 다른 하이퍼파라미터 설정을 가질 수 있습니다.

3) 학습된 기본 모델들을 사용하여 두 번째 서브셋에 대한 예측을 수행합니다. 이 예측 결과는 메타 모델의 훈련 데이터로 사용됩니다. 기본 모델의 예측 결과를 행렬로 나타내면, 각 열은 각 기본 모델의 예측 결과를 의미하고, 각 행은 각 데이터 포인트에 대한 예측 결과를 의미합니다.

4) 메타 모델을 학습시키기 위해 기본 모델들의 예측 결과를 입력으로 사용하고, 원래의 두 번째 서브셋의 타겟 변수를 출력으로 사용하여 학습시킵니다.

5) 메타 모델은 기본 모델들의 예측 결과를 조합하여 최종 예측을 수행합니다.

 

스태킹은 다양한 모델의 성능을 활용하여 더 나은 예측 결과를 얻을 수 있다는 장점이 있습니다. 그러나 스태킹의 단점으로는 모델 학습과 예측 과정이 복잡하고 시간이 오래 걸린다는 점이 있습니다. 이는 기본 모델과 메타 모델을 모두 학습시켜야 하기 때문입니다. 또한, 스태킹은 오버피팅(Overfitting)의 위험성이 존재하므로, 교차 검증(Cross-Validation) 같은 기법을 사용하여 모델의 일반화 성능을 확인하고 향상시키는 것이 중요합니다.

 

스태킹을 사용하는 경우 다음 사항을 고려할 수 있습니다:

 

기본 모델 선택: 서로 다른 알고리즘을 사용하는 다양한 기본 모델을 선택하여 스태킹에 사용할 수 있습니다. 이를 통해 각 모델의 강점을 조합하여 더 나은 성능을 얻을 수 있습니다. 예를 들어, 선형 회귀, 의사 결정 나무, 랜덤 포레스트, 서포트 벡터 머신 등 다양한 모델을 기본 모델로 사용할 수 있습니다.

메타 모델 선택: 메타 모델은 기본 모델들의 예측 결과를 조합하여 최종 예측을 수행하는 모델입니다. 메타 모델로는 간단한 모델(: 선형 회귀)부터 복잡한 모델(: 그래디언트 부스팅)까지 다양한 모델을 사용할 수 있습니다. 메타 모델 선택시 과적합을 피하고, 일반화 성능을 높이는 것이 중요합니다.

교차 검증 사용: 스태킹은 기본 모델과 메타 모델을 모두 학습시켜야 하므로, 오버피팅의 위험이 존재합니다. 이를 방지하기 위해 교차 검증을 사용하여 모델의 일반화 성능을 확인하고 향상시킬 수 있습니다.

하이퍼파라미터 최적화: 기본 모델과 메타 모델 모두 하이퍼파라미터를 최적화하는 것이 중요합니다. 그리드 탐색(Grid Search), 랜덤 탐색(Random Search), 베이지안 최적화(Bayesian Optimization) 등의 기법을 사용하여 최적의 하이퍼파라미터 조합을 찾을 수 있습니다.

 

스태킹은 앙상블 학습 기법 중 하나로, 기본 모델과 메타 모델을 적절히 조합하여 높은 성능을 달성할 수 있습니다. 그러나 복잡한 학습 과정과 오버피팅의 위험성으로 인해 신중하게 사용하고 최적화해야 합니다.

 

 
 
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier, BaggingClassifier, AdaBoostClassifier, GradientBoostingClassifier, StackingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression

# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target

# 데이터를 학습 및 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 랜덤 포레스트
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
print("Random Forest Accuracy:", accuracy_score(y_test, y_pred_rf))

# 배깅 결정 나무
bagging_dt = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=100, random_state=42)
bagging_dt.fit(X_train, y_train)
y_pred_bagging_dt = bagging_dt.predict(X_test)
print("Bagging Decision Tree Accuracy:", accuracy_score(y_test, y_pred_bagging_dt))

# AdaBoost
ada = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=100, random_state=42)
ada.fit(X_train, y_train)
y_pred_ada = ada.predict(X_test)
print("AdaBoost Accuracy:", accuracy_score(y_test, y_pred_ada))

# 그래디언트 부스팅
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb.fit(X_train, y_train)
y_pred_gb = gb.predict(X_test)
print("Gradient Boosting Accuracy:", accuracy_score(y_test, y_pred_gb))

# 스태킹
estimators = [
    ('rf', RandomForestClassifier(n_estimators=100, random_state=42)),
    ('bagging_dt', BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=100, random_state=42)),
    ('ada', AdaBoostClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=100, random_state=42)),
    ('gb', GradientBoostingClassifier(n_estimators=100, random_state=42))
]

stacking = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression(), cv=5)
stacking.fit(X_train, y_train)
y_pred_stacking = stacking.predict(X_test)
print("Stacking Accuracy:", accuracy_score(y_test, y_pred_stacking))

 

위 코드에서는 아이리스 데이터셋을 사용하여 각각의 앙상블 기법을 적용한 분류 모델을 학습시키고 테스트 세트에 대한 정확도를 출력하였습니다.

 
728x90
반응형

댓글()