본문 바로가기
[AI] - Machine Learning

# 10. GBM (Gradient Boosting Machine)

by Bebsae 2021. 11. 6.

부스팅 알고리즘에는 대표적으로 AdaBoost와 GBM 방식이 있다. AdaBoost는 여러 개의 week learner를 순차적으로 학습하면서 틀린 데이터에 가중치를 부여하여 뒤에 있는 week learner가 분류하여 모든 분류 결과들을 취합하는 것을 의미한다.

 

출처 : https://www.researchgate.net/figure/Illustration-of-AdaBoost-algorithm-for-creating-a-strong-classifier-based-on-multiple_fig9_288699540

 

반면, GBM은 여러 개의 week learner를 순차적으로 학습하면서 앞에 있는 week learner가 틀린 데이터에 가중치를 부여하여 오류를 개선하는 방향으로 학습하는 방식이지만 AdaBoost와의 차이점은 Gradient를 사용한다는 것이다. 딥러닝에 관심이 있다면 경사하강법 (Gradient Descent)에 대해 한번쯤은 들어봤을 것이다.

 

손수 그린 경사하강법

 

경사하강법에 대해 간략하게 설명하면, 실제 정답과 예측 정답 사이의 오차가 존재할 것이다. 이를 잔차(Residual)이라고 하는데, 잔차를 곡선형태의 함수로 표현했다고 가정하고, 이를 최소화 시키는 방향으로 반복적으로 업데이트를 하는것이다.

 

위 그림을 직관적으로 설명하자면 가로 축은 특정 파라미터, 세로 축은 해당 파라미터에 해당하는 잔차를 의미한다. 여기서는 잔차를 Loss라고 표기했다. 우리의 목적은 기울기가 0인 지점의 파라미터가 잔차가 제일 적으므로, 우리는 기울기가 0인 방향으로 파라미터 w를 업데이트 해나가야 한다. Loss function을 파라미터 w에 대해 미분하면 그 순간의 기울기가 도출된다. 업데이트 식은 그림의 하단에 적어놓은 식(새로운 w = 이전 w - 학습률 * 순간기울기)과 같다.

 

여기서 이전 w에 마이너스(-)를 하는 이유는, 순간기울기가 0보다 클 경우 양수의 값(순간기울기)을 이전 w에서 빼야하고, 순간기울기가 0보다 작은 경우 음수의 값을 이전 w에서 빼야 기울기가 0인 구간으로 이동한다. 즉, 이름에서 알 수 있듯이 경사를 타고 내려가기 때문에 Gradient Descent이다. 

 

import time

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score


X_train, X_test, y_train, y_test = get_human_dataset()

start_time = time.time()
gb_clf = GradientBoostingClassifier()
gb_clf.fit(X_train, y_train)
pred = gb_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)

print('accuracy : ', accuracy)
print('elapse time : ', time.time() - start_time)

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html

 

sklearn.ensemble.GradientBoostingClassifier

Examples using sklearn.ensemble.GradientBoostingClassifier: Gradient Boosting regularization Gradient Boosting regularization, Feature transformations with ensembles of trees Feature transformation...

scikit-learn.org

위 코드는 GradientBossting 기반의 Classification 알고리즘을 사용하는 코드이다. GradientBoostingClassifier 생성자의 인자는 위 링크에서 확인할 수 있다.

 

loss : 경사하강법을 통해 최적화할 손실함수의 종류를 정할 수 있다.

learning_rate : 학습률, 경사하강법을 할때에 이동할 비율을 의미한다.

n_estimator : Grdient Boosting Classifier는 회귀 트리로 구성되어 있다. 그 회귀 트리의 갯수를 의미한다. Gradient boosting은 과적합에 강건하기 때문에 큰 숫자가 더 좋은 퍼포먼스가 나온다.

subsample : 각각의 분류기에 학습시키기 위해 사용될 샘플의 비율을 의미한다. 1.0 보다 작으면 Stochastic Gradient Boosting의 효과가 있다. subsample 파라미터는 n_estimator 파라미터와 상호작용한다. 1.0 보다 작을 경우 분산을 줄이고, 편향을 증가하는 효과가 있다.

 

댓글