준비하는 대학생

[기계학습] 에이다부스트, 그래디언트 부스트 본문

Programming/Machine learning

[기계학습] 에이다부스트, 그래디언트 부스트

Bangii 2023. 6. 8. 19:33

에이다부스트(AdaBoost)

에이다부스트는 Adaptive Boosting의 줄임말로, 약한 학습기를 순차적으로 학습시키면서 이전 모델들이 잘못 분류한 데이터에 대해 가중치를 조정해 나가는 방법입니다.

  1. 가중치 부여: 처음에는 모든 데이터 샘플에 동일한 가중치가 부여됩니다.
  2. 학습 및 가중치 업데이트: 각 학습기가 순차적으로 학습하면서, 잘못 분류된 데이터 샘플들의 가중치를 높이고, 올바르게 분류된 데이터 샘플들의 가중치를 낮춥니다.
  3. 최종 예측: 모든 학습기가 학습을 마친 후, 학습기들의 예측을 가중합하여 최종 예측을 만듭니다.

에이다부스트(AdaBoost) 동작 원리

AdaBoost는 아래와 같은 순서로 동작합니다:

  1. 데이터셋의 각 샘플에 동일한 가중치가 부여됩니다. 초기 가중치는 1/N으로 설정되며, N은 샘플의 개수입니다.
  2. *약한 학습기가 훈련 데이터에 적합하도록 학습됩니다. 학습기는 간단한 의사결정나무와 같은 단순한 모델을 사용할 수 있습니다.
  3. 각 학습기는 가중치가 적용된 데이터셋에서 오류를 최소화하는 방향으로 학습합니다.
  4. 학습기의 오류를 계산하고, 학습기에 가중치(alpha)를 부여합니다. 여기서 alpha는 학습기의 정확도에 따라 결정됩니다.
  5. 샘플의 가중치를 업데이트합니다. 잘못 분류된 샘플의 가중치는 증가시키고, 올바르게 분류된 샘플의 가중치는 감소시킵니다.
  6. 여러 개의 학습기를 순차적으로 학습시키며 3-5단계를 반복합니다.
  7. 최종적으로, 학습기들의 예측을 가중합하여 최종 예측을 생성합니다.

* 약한 학습기를 사용하는 이유

  • 계산 효율성: 약한 학습기는 일반적으로 단순한 모델로 구성되며, 학습과 예측이 빠릅니다. 이로 인해 에이다 부스트는 여러 개의 약한 학습기를 조합하여 복잡한 문제를 해결할 수 있으면서도 계산상 효율적입니다.
  • 과적합 방지: 복잡한 모델은 과적합(overfitting)되기 쉽습니다. 약한 학습기는 단순하기 때문에 과적합되기 어렵고, 이를 통해 에이다 부스트는 일반화 성능을 향상시킵니다.
  • 가중치 조절에 의한 특징 학습: 에이다 부스트는 학습 과정에서 약한 학습기가 잘못 분류한 샘플에 더 높은 가중치를 부여합니다. 이는 각 약한 학습기가 데이터셋의 다른 부분에 초점을 맞추도록 하여, 다양한 특징을 학습할 수 있게 합니다.
  • 앙상블 학습의 강점 활용: 단일 복잡한 모델 대신 여러 개의 약한 학습기를 결합함으로써, 각 학습기의 장점을 취합하고 단점을 상쇄시킬 수 있습니다. 이를 통해 에이다 부스트는 더 높은 정확도와 안정성을 달성합니다.
  • 특성 선택: 약한 학습기가 단순한 모델인 경우, 예를 들어 결정 트리의 경우, 데이터의 일부 특성에만 초점을 맞추게 됩니다. 이를 통해 에이다 부스트는 자연스럽게 특성 선택(feature selection)이 이루어지며, 더욱 효율적인 학습이 가능해집니다.

 

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=20, n_informative=2, n_redundant=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# AdaBoost 분류기 생성
adaboost = AdaBoostClassifier(n_estimators=50, learning_rate=1, random_state=42)

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

# 성능 테스트
accuracy = adaboost.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
Accuracy: 0.89

에이다부스트 하이퍼 파라미터

 

  1. n_estimators: AdaBoost에서 사용할 약한 학습기의 수를 결정합니다. 너무 적으면 underfitting, 너무 많으면 overfitting의 위험이 있으며, 계산 시간이 늘어납니다.
  2. learning_rate: 학습기의 기여도를 조절하는 파라미터입니다. 이 값이 작을수록, 각 학습기의 기여도가 작아져서 더 많은 학습기가 필요할 수 있습니다. 큰 값은 더 적은 학습기가 필요하지만 과적합될 수 있습니다.
  3. algorithm: AdaBoost의 구현 방식을 선택합니다. 'SAMME.R'는 일반적으로 더 나은 성능을 내며, 연속 값을 처리할 수 있습니다. 'SAMME'는 이산 값을 처리합니다.
  4. base_estimator: 사용할 약한 학습기를 지정합니다. 기본적으로 DecisionTreeClassifier를 사용합니다.

에이다부스트는 단순하고 효과적인 알고리즘이지만, 이상치에 민감하고, 학습시간이 길다는 단점이 있습니다.

그레디언트 부스트(Gradient Boosting)

그레디언트 부스트 역시 부스팅 기법 중 하나로, 에이다부스트와 비슷한 방법으로 약한 학습기를 순차적으로 학습시키는 기법입니다. 하지만, 그레디언트 부스트는 이전 학습기들의 오차를 줄이는 방향으로 모델을 학습시키는데, 이 때 경사 하강법(Gradient Descent)을 사용하여 최적화합니다.

  1. 초기 모델 생성: 모든 데이터 샘플에 대해 기본 값을 출력하는 간단한 모델로 시작합니다.
  2. 오차 계산 및 학습: 각 학습기가 순차적으로 학습하면서 이전 모델들의 오차를 최소화하는 방향으로 학습합니다. 이 때 경사 하강법을 사용하여 오차를 최소화합니다.
  3. 모델 결합: 학습이 끝난 후, 각 학습기의 예측을 결합하여 최종 예측을 만듭니다.

그레디언트 부스트(Gradient Boost) 동작 원리

Gradient Boosting은 다음과 같은 순서로 동작합니다:

  1. 전체 데이터셋에 대한 기본 예측값(예: 평균)을 설정합니다.
  2. 현재 모델의 *잔차(residual)를 계산합니다. 잔차는 실제 값과 현재 모델의 예측 값 사이의 차이입니다.
  3. 잔차에 대해 새로운 학습기(예: 의사결정나무)를 학습시킵니다.
  4. 새로운 학습기를 이용하여 잔차를 예측하고, 이를 기존 모델에 추가합니다.
  5. 위의 과정을 여러 번 반복하여, 최종적으로 여러 개의 학습기를 결합한 복잡한 모델을 얻습니다.

* 잔차 : (실제데이터-예측데이터) 제곱합

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

# 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Gradient Boosting 분류기 생성
gboost = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=42)

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

# 성능 테스트
accuracy = gboost.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
Accuracy: 0.88

그래디언트 부스트 하이퍼 파라미터

 

  1. n_estimators: 생성할 트리의 개수를 결정합니다. 많을수록 모델이 복잡해지지만, 너무 많으면 과대적합의 위험이 있습니다.
  2. learning_rate: 각 트리의 기여를 조절합니다. 낮은 learning_rate는 더 많은 트리가 필요하지만, 일반적으로 더 나은 성능을 제공합니다.
  3. max_depth: 각 의사결정나무의 최대 깊이를 제한합니다. 이는 트리가 얼마나 복잡한 패턴을 학습할 수 있는지 제어합니다.
  4. min_samples_split: 노드를 분할하기 위해 필요한 최소 샘플 수입니다. 이 값이 크면 트리가 단순해져 과소적합 할 수 있습니다.
  5. min_samples_leaf: 리프 노드에 있어야 하는 최소 샘플 수입니다. 이는 트리의 크기를 줄이고 과대적합을 방지하는데 도움이 됩니다.
  6. subsample: 각 트리를 학습할 때 사용하는 샘플의 비율입니다. 값이 낮을수록 무작위성이 증가하고 과대적합을 방지하지만, 너무 낮으면 과소적합될 수 있습니다.

그레디언트 부스트는 높은 정확도를 가지지만, 학습 시간이 길고, 하이퍼파라미터 튜닝이 중요하다는 특징이 있습니다.

두 알고리즘 모두 강력한 성능을 제공하지만, 특정 문제에 더 적합한 것을 선택하는 것이 중요합니다. 특히, 그레디언트 부스트는 복잡한 모델을 생성하므로, 하이퍼파라미터 튜닝에 신경을 써야 할 수 있습니다.

마무리

에이다부스트와 그레디언트 부스트는 앙상블 학습 중 부스팅 기법에 속하며, 약한 학습기들을 순차적으로 학습시켜 강력한 모델을 만드는 데 사용됩니다. 이 두 알고리즘은 높은 성능을 자랑하지만, 학습 시간이 오래 걸리고 하이퍼파라미터 튜닝에 신경을 써야한다는 점을 고려해야 합니다. 알맞은 상황에 따라 적절한 알고리즘을 선택하여 사용하는 것이 중요합니다.

Comments