본문 바로가기
Data Analysis/Python

분류_GBM(Gradient Boost Machine)

by su_hyeon 2023. 2. 1.

https://hmkim312.github.io/posts/%EC%99%80%EC%9D%B8_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A1%9C_%ED%95%B4%EB%B3%B4%EB%8A%94_%EB%B6%80%EC%8A%A4%ED%8C%85_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_Boosting_Algorithm_/

 

위의 그림과 같이 기본적으로 부스팅 기법은 여러 개의 약한 학습기를 반복적으로 학습, 예측하면서 잘못 예측한 데이터에 가중치를 부여하여 오류를 개선해 나가는 학습 방식이다.

부스팅의 대표적인 알고리즘으로는 AdaBoost와 그래디언트부스트가 있다.

 

  • AdaBoost(에이다부스트)

에이다부스트 기법은 AdaptiveBoosting을 줄여서 부르는 말로 관측치들에 가중치를 더한다. 즉, 약간 학습기의 오류에 가중치를 더하면서 부스팅을 수행한다.

 

  • GBM

그래디언트 부스팅 기법은 에이다부스트기법과는 유사하나, 가중치 업데이트를 경사하강법을 통해서 최적의 결과를 얻는 알고리즘이다. 쉽게 말하면 학습기의 오류에 가중치를더하는 것이 아니라 아니라 경사하강법을 통해 발생한 잔여 오차(Resudial Error), 잔차에 대해서 학습 시킨다.

 

GBM은 CART 기반으로써 분류와 회귀 둘 다 가능하다. 랜덤포레스트에서 사용한 사용자 행동 인식 데이터 세트를 이용해서 실습을 해보았다. 

 

from sklearn.ensemble import GradientBoostingClassifier
import time
import warnings
warnings.filterwarnings('ignore')

X_train, X_test, y_train, y_test = get_human_dataset()

# GBM 수행 시간 측정을 위함. 시작 시간 설정.
start_time = time.time()

gb_clf = GradientBoostClassifier(random_state = 0)
gb_clf.fit(X_train, y_train)
gb_pred = gb_clf.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)

print('GBM 정확도: {0:.4f}'.format(gb_accuracy))
print('GBM 수행 시간: {0:.1f} 초'.format(time.time() - start_time))


#output
GBM 정확도: 0.9389
GBM 수행 시간: 537.7초

기본 파라미터로만 적용했을 때에도 높은 정확도를 가지는 것을 알 수 있다.

 

하지만 GBM은 수행시간이 오래 걸리고, 파라미터 튜닝을 하는데에 어려움을 겪는다는 단점이 존재한다.

 

GBM의 하이퍼 파라미터에는 아래와 같은 것들이 있다.

loss 경사하강법에서 사용하는 비용함수

기본 값 = "deviance"
learning_rate 학습률을 의미하면, 약한 학습기가 순차적으로 오류 값을 보정해 나가는 데 적용하는 계수이다.

0 ~ 1 값을 지정할 수 있으며, 기본 값 = 0.1

n_estimators와 상호 보완적으로 적용하는 것이 좋음
n_estimators 학습기의 갯수

기본 값 = 100
subsample 학습기가 학습에 사용하는 데이터 샘플링의 비율

기본 값 = 1, 이는 전체 학습 데이터를 다 사용한다는 의미

과적합이 염려되면, 1보다 작은 값을 사용