Day to_day

[지도 학습] 여러가지 부스팅 알고리즘 알아보기 (GBM, Adaboost, XGBoost) 본문

Machine Learning/지도 학습

[지도 학습] 여러가지 부스팅 알고리즘 알아보기 (GBM, Adaboost, XGBoost)

m_inglet 2023. 3. 15. 21:52
728x90
반응형

❗본 포스팅은 권철민 선생님의 '파이썬 머신러닝 완벽가이드' 강의와 '파이썬 라이브러리를 활용한 머신러닝' 서적을 기반으로 개인적인 정리 목적 하에 재구성하여 작성된 글입니다.

 

 

포스팅 개요

앙상블 기법의 한 종류인 부스팅에 대해서 알아보고, 부스팅 기반 모델 종류를 살펴보기로 한다.

GBM, AdaBoost, XGBoost의 실습 코드도 함께 작성해 보며 개념을 정리하자.

 

 

Boosting 부스팅

부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습/예측 하면서 잘못 예측한 데이터나 학습 트리에 가중치를 부여해 오류를 개선해 나가면서 학습하는 방식이다.

병렬적으로 처리해 평균을 내는 배깅과 달리 순차적으로 모델을 실행한다는 것이 다른 점이다.

부스팅은 대표적으로 AdaBoost 그래디언트 부스트(GBM)가 있다.

 

 

AdaBoost

 

동작 순서

1. step 1에서 하나를 기준으로 분류한다.

2. 분류하지 못한 + 에 대해 가중치를 부여한다.

3. step 2에서 가중치를 부여받은 것을 기준으로 또 분류한다.

4. 그러면 여러 개의 분류 기준이 나올 텐데 그 기준들을 모두 결합한다.

 

 

[예제 코드]

# two_moons dataset 적용
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(n_estimators=5, random_state=42)
ada.fit(Xm_train, ym_train)

# 시각화하기
import matplotlib.pyplot as plt
import mglearn

fig, axes = plt.subplots(2,3, figsize=(20,10))
for i, (ax, tree) in enumerate(zip(axes.ravel(), ada.estimators_)):
    ax.set_title('tree {}'.format(i))
    mglearn.plots.plot_tree_partition(Xm, ym, tree, ax=ax)
    
mglearn.plots.plot_2d_separator(ada, Xm, fill=True, ax=axes[-1,-1], alpha=.4)
axes[-1,-1].set_title('AdaBoost')
mglearn.discrete_scatter(Xm[:, 0], Xm[:, 1], ym)
plt.show()

 

 

AdaBoost의 특징

  • AdaBoostClassifier의 기본 값 : DecisionTreeClassifier(max_depth = 1)
  • AdaBoostRegressor의 기본 값 : DecisionTreeRegressor(max_depth = 3)
  • 순차적으로 학습하기 때문에 n_jobs 매개변수 지원하지 않는다.

 

AdaBoost의 장단점

장점

  • 높은 정확도를 가지고 여러 약한 분류기를 결합하여 형성하기 때문에 다른 알고리즘보다 과적합할 가능성이 낮다.
  • AdaBoost는 의사결정트리, SVM 및 신경망을 비롯한 다양한 유형의 약한 분류기와 함께 사용할 수 있다.
  • AdaBoost는 자동으로 중요한 feature를 선택하여 성능을 개선하고, 작업에 필요한 feature수를 줄 일 수도 있다.

단점

  • 노이즈 데이터에 민감하다. 이상값은 모델의 성능에 상당히 영향을 미칠 수 있다.
  • 다른 알고리즘에 비해 비교적 시간 소모가 크다.
  • 가끔 AdaBoost는 모델의 내부 작동을 해석하기 어렵고 예측에 도달하는 방법을 이해하기 어렵다.

 

 

GBM (Gradient Boost Machine) 

그래디언트 부스팅은 이전 트리의 오차를 보완하는 방식으로 순차적으로 트리를 만든다.

그래디언트 부스팅 회귀 트리에는 무작위성이 없고, 그래디언트 부스팅 트리는 보통 하나에서 다섯개 정도의 깊지 않은 트리를 사용하므로 메모리를 적게 사용한다.

 

 

GBM의 하이퍼 파라미터 튜닝

  • loss : 비용함수를 지정. 기본값인 ‘deviance’를 적용하기
  • learning rate : 학습률. 0~1사이의 값을 지정할 수 있으며 기본값은 0.1 가장 중요한 파라미터
  • n_estimators : weak learner의 개수. 개수가 많을수록 수행시간 오래 걸림
  • subsample : 학습에 사용하는 데이터 샘플링의 비율. 기본값은 1이며, 이 의미는 전체 학습 데이터를 기반으로 학습한다는 의미. 0.5면 학습 데이터의 50%를 가지고 학습한다.

 

 

[예제 코드]

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

cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# 과대적합을 막기 위해 max_depth 줄이기
gbrt = GradientBoostingClassifier(random_state=0, max_depth=1)
gbrt.fit(X_train, y_train)

print('Train data accuracy: {:.3f}'.format(gbrt.score(X_train, y_train)))
print('Test data accuracy: {:.3f}'.format(gbrt.score(X_test, y_test)))
Train data accuracy: 0.991
Test data accuracy: 0.972

 

 

GBM의 장단점

장점

  • 다른 트리 기반 모델처럼 특성의 스케일을 조정하지 않아도 되고, 이진 특성이나 연속적인 특성에서도 잘 동작

단점

  • 매개변수를 잘 조정해야 하고, 훈련 시간이 길다.
  • 고차원 데이터에는 잘 작동하지 않음

사용 시 유의할 점

  • n_estimators : 트리 개수 지정 (개수가 많을수록 모델이 복잡해지고 과적합 가능성 올라감)
  • 기억하자! 얕은 트리를 많이 연결하는 것!
  • learning_rate : 이전트리의 오차 보정 (learning_rate를 낮추면 비슷한 복잡도 모델을 만들기 위해 더 많은 트리를 추가해야 함.
  • 일반적으로 시간과 메모리 한도에서 n_estimators를 맞추고 나서 적절한 learning_rate를 찾는다.
  • max_depth : 트리의 복잡도를 낮춤 (max_depth를 매우 작게 설정하며 트리의 깊이가 5보다 깊어지지 않게 함)

 

 

GBM과 AdaBoost의 차이점

AdaBoost

  1. train set에서 잘못 분류한 샘플의 가중치를 조정하여 동작한다.
  2. 약한 학습기 : 일반적으로 의사결정트리를 사용
  3. output 방법 : 모든 약한 학습기의 가중 평균을 계산
  4. 노이즈가 많거나 이상값이 많거나 약한 학습기가 과적합 되기 쉬운 경우에 잘 수행된다.
  5. 교육 시간 : GBM에 비하면 빠른 편

GBM

  1. 약한 학습기를 모델에 반복적으로 추가하여 각각의 새 학습기가 이전 학습기의 오류를 수정하는 방식으로 동작한다.
  2. 약한 학습기 : 의사 결정 트리, 선형 회귀 모델 및 신경망과 같은 다양한 모델 사용 가능
  3. output 방법 : 약한 학습기의 출력 합계를 생성하며 각 학습기는 최종 예측에 대한 기여도에 따라 가중치 부여
  4. 약한 학습기가 단순하고 편향을 최소화하는 것이 목표일 때 잘 수행되는 경향이 있다.
  5. 교육 시간 : 약한 학습기를 순차적으로 피팅하기 때문에 시간이 오래 걸림

 

 

GBM기반의 다른 모델 - XGBoost

XGBoost는 의사결정나무로 하며 Gradient Boosting과 같이 잔차를 이용하여 이전 모형의 약점을 보완하는 방식으로 학습한다. XGBoost는 병렬학습이 지원되도록 구현한 라이브러리이다. Regression, Classification 문제를 모두 지원하며, 성능과 자원 효율이 좋아서 인기 있게 사용되는 알고리즘이다.

 

 

XGBoost (eXtra Gradient Boost)

[예제 코드]

from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
   
xgb = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3, eval_metric='logloss')
xgb.fit(X_train, y_train, verbose=True)
pred = xgb.predict(X_test)
print('xgb accuracy: {:.2f}'.format(accuracy_score(y_test, pred)))

 

 

장점

  • 뛰어난 예측 성능
  • GBM 대비 빠른 수행시간
    • CPU 병렬처리, GPU 지원
  • 다양한 성능 향상 기능
    • 규제(Regularization) 기능 탑재
    • Tree Pruning
  • 다양한 편의 기능
    • 조기 중단 (Early Stopping)
    • 자체 내장된 교차 검증
    • 결손값 자체 처리

사용방법

  • 사이킷런 지원
    • XGBClassifier : 분류 모델일 때
    • XGBRegressor : 회귀 모델일 때
    • fit(), predict()로 수행

 

 

히스토그램 기반 부스팅

히스토그램 기반 부스팅은 입력 특성을 256개의 구간으로 나누기 때문에 노드를 분할할 때 최적의 분할을 빠르게 찾을 수 있는 장점이 있다.

 

[예제 코드]

from sklearn.ensemble import HistGradientBoostingClassifier

hgb = HistGradientBoostingClassifier(random_state=42)
hgb.fit(Xm_train, ym_train)

mglearn.plots.plot_2d_separator(hgb, Xm, fill=True, alpha=.4)
plt.title('HistGradientBoosting')
mglearn.discrete_scatter(Xm[:,0], Xm[:, 1], ym)
plt.show()

히스토그램 기반 부스팅 특징

  • 256개 구간 중 하나를 누락된 값을 위해서 사용하기 때문에 누락된 값을 위해 전처리할 필요가 없다.
  • 일반적으로 샘플 수가 1만 개보다 많은 경우 그래디언트 부스팅보다 히스토그램 기반 부스팅이 훨씬 빠르다.
  • feature importances_ 함수는 따로 제공하진 않는다.
728x90
반응형
BIG
Comments