Table of Contents

ML

Adaboost(Adaptive Boosting)

꼬꼬마코더 2024. 5. 30. 15:13
728x90

GBM, XGB, LGBM, CATB, NG-B의 아버지 Adaboost, 옛날 모델이므로 성능이 좋지 않다 발전된 모델을 사용하도록 한다

 

Adaboost(AdaBoost, Adaptive Boosting)는 약한 학습기(weak learners)를 결합하여 강한 학습기(strong learner)를 만드는 앙상블 학습 방법 중 하나입니다. 여기서 약한 학습기란 개별적으로는 성능이 좋지 않지만, 여러 개를 결합하면 성능이 크게 향상되는 모델을 말합니다. AdaBoost는 주로 의사결정 스텀프(decision stump, 깊이가 1인 의사결정 나무)를 약한 학습기로 사용합니다.

AdaBoost의 원리

AdaBoost의 핵심 아이디어는 각 학습기의 예측 오류에 따라 데이터 포인트의 가중치를 조정하여 다음 학습기에서 더 나은 예측을 할 수 있도록 하는 것입니다. AdaBoost는 반복적으로 학습기를 학습시키고 결합하는 과정에서 오류가 큰 데이터 포인트에 더 많은 가중치를 부여합니다.

AdaBoost 알고리즘 단계

  1. 초기화:
    • 각 데이터 포인트에 동일한 가중치를 부여합니다. 예를 들어, 데이터셋이 ( N )개의 샘플로 구성되어 있다면 각 샘플의 초기 가중치는 ( \frac{1}{N} )입니다.
  2. 반복:
    • 약한 학습기 학습: 현재 가중치를 사용하여 약한 학습기를 학습시킵니다.
    • 오류 계산: 학습기의 예측 오류율 ( \epsilon )을 계산합니다. 이는 잘못 분류된 샘플들의 가중치 합으로 계산됩니다.
    • 학습기의 가중치 계산: 학습기의 가중치 ( \alpha )를 계산합니다. 이는 다음과 같이 계산됩니다:
      [
      \alpha = \frac{1}{2} \ln\left(\frac{1 - \epsilon}{\epsilon}\right)
      ]
    • 가중치 업데이트: 잘못 분류된 샘플들의 가중치를 증가시키고, 올바르게 분류된 샘플들의 가중치를 감소시킵니다. 이때 새로운 가중치는 다음과 같이 계산됩니다:
      [
      w_i = w_i \times \exp(\alpha \times I(y_i \neq h(x_i)))
      ]
      여기서 ( I(y_i \neq h(x_i)) )는 샘플 ( i )가 잘못 분류된 경우 1이고, 그렇지 않으면 0입니다. 가중치는 전체 가중치 합이 1이 되도록 정규화됩니다.
  3. 결합:
    • 최종 모델은 각 약한 학습기의 가중치를 반영한 가중치 합으로 결합됩니다. 최종 예측은 다음과 같이 계산됩니다:
      [
      H(x) = \text{sign}\left(\sum_{t=1}^{T} \alpha_t h_t(x)\right)
      ]
      여기서 ( T )는 약한 학습기의 수입니다.

AdaBoost의 장점

  • 단순성: 구현이 비교적 간단합니다.
  • 성능: 잘 설계된 AdaBoost는 강력한 분류 성능을 보입니다.
  • 적응성: 오류가 큰 데이터 포인트에 더 많은 가중치를 부여하여 학습기를 개선합니다.
  • 해석력: 각 학습기의 가중치를 통해 모델의 결정 과정을 어느 정도 해석할 수 있습니다.

AdaBoost의 단점

  • 노이즈 민감성: 노이즈가 많은 데이터에 대해 민감할 수 있습니다. 잘못된 레이블을 가진 데이터 포인트에 높은 가중치가 부여될 수 있습니다.
  • 과적합: 너무 많은 학습기를 결합하면 과적합이 발생할 수 있습니다.

Python을 사용한 AdaBoost 예제

다음은 Scikit-learn을 사용하여 AdaBoost를 구현하는 간단한 예제입니다:

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

# 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# AdaBoost 분류기 생성
# 기본 학습기로 깊이 1인 결정 스텀프 사용
base_estimator = DecisionTreeClassifier(max_depth=1)
model = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, random_state=42)

# 모델 학습
model.fit(X_train, y_train)

# 예측
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)

# 성능 평가
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)

print(f'Train Accuracy: {train_accuracy:.4f}')
print(f'Test Accuracy: {test_accuracy:.4f}')

이 코드는 AdaBoost 알고리즘을 사용하여 데이터를 학습하고 예측하며, 학습 세트와 테스트 세트의 정확도를 출력합니다. 이 예제에서 기본 학습기로 깊이가 1인 결정 스텀프를 사용하고, 50개의 약한 학습기를 결합합니다.