머신러닝 & 딥러닝

[공부기록] 부스팅(Boosting) 모델 간단 리뷰 (AdaBoost, Gradient Boost, XGBoost)

에멜라 2023. 12. 22. 16:24

 

0. 참고

 

https://www.youtube.com/watch?v=GciPwN2cde4

 

https://hyunlee103.tistory.com/25

 

[머신러닝] Boosting Algorithm

처음 머신러닝을 공부할 때, 가장 어려웠던 부스팅 계열 알고리즘, 보아즈에서 발표를 하게 되면서 다시 한번 내용을 정리해두려고 한다. 학부생의 철없는 질문을 받아주신 건국대학교 권성훈

hyunlee103.tistory.com

 

 


 

 

1. 앙상블과 Boosting

 

일반적으로 앙상블은 가장 많이 언급되는 방식인 배깅 방식과 부스팅 방식, 그리고 일반적으로는 많이 이야기하지 않지만 스태킹까지 크게 세가지로 분류 가능하다. (스태킹은 기존에 공부한 자료가 있어 나중에 정리할 예정)

 

기본적인 앙상블의 아이디어는, 서로 다른 독립된 학습모델들을 결합하여 개별 모델보다 더 뛰어난 하나의 모델을 만드는 것이다. 그 중 대표적인 배깅은 하나의 표본집합을 여러번의 독립추출을 통해 데이터를 추출한 후 개별 sample에 대해 독립된 모델을 병렬적으로 생성하여 결합하는 반면, 부스팅 방식은 분류기를 직렬적으로 쌓아가며 기존의 분류기들이 잘 풀지 못했던 데이터를 다음 분류기가 더 잘 분류해내도록 학습해가며 모든 분류기를 합친 하나의 모델을 부스팅 모델로 사용한다. 

 

위 티스토리에서는 Additive model 로도 해석할 수 있다고도 설명하고 있는데, 이는 다시 말하면 하나의 부스팅 모델을 여러개의 비선형 분류기의 선형결합으로 해석해볼 수 있음을 의미한다.

 

 

 

배깅 참고 (Polikar , R. (2006). Ensemble based systems in decision making)

 

부스팅 참고(https://injo.tistory.com/31)

 

 


 

 

2. Boosting 모델의 종류

 

  • AdaBoost (초기 부스팅 알고리즘)
  • Gradient Boost (gradient decent를 활용한 부스팅)
  • XGBoost  (regularization  및 추가 기능을 지원하는 부스팅) <- (여기까지만 러프하게 다룰 예정)
  • Light Gradient Boosting
  • CatBoosting

 

 


 

 

3. AdaBoost Model

정확하게는 Adaptive Boosting 으로, 직렬 모델을 쌓아가는 과정은 기존의 단계에서 학습된 base learner를 보완하는 새로운 간단한 base learner를 만드는 과정이다. 아래의 그림과 같다.

 

 

 

 

이때 training error 가 큰 관측치의 선택 확률을 높이기 때문에 다음 단계의 모델은 기존 모델이 틀렸던 데이터에 더 경건하게 작동한다. 정확하게는 기존 모델이 틀렸던 데이터에 대한 가중치를 더 받게 되며 (그림 상으로는 데이터의 기호가 더 커지는 것으로 표현), 이를 다음 모델에서 또 틀릴 경우 더 많은 loss 값이 계산되므로, 기존 모델이 틀린 데이터에 대해 더 잘 맞출 수 있는 모델이 학습되게 되는 것이다.

 

이렇게 모델이 언제 어떤데이터를 얼마나 틀렸는지에 따라 각 데이터에 대한 개별 가중치값은 새로운 classifier 를 학습시킬 때 마다 달라지며 이에따라 서로 독립적이고 상호 보완되는 개별 모델들이 순차적으로 생성되어간다.

 

최종적으로 이 모델을 하나로 합칠 뿐 아니라 각 classifier에 대한 중요도를 가중치로 하여 최종 의사결정에 포함시키므로, 좀 더 정확한 앙상블 결과를 얻을 수 있다.

 

 

 

 

 

여기서 sign 함수의 경우 간단한 계단함수로 sign(x) 의 x 값이 기존의 threshold 값 이상이면 1, 이하면 0을 뱉어내는 함수이므로 즉 어떤 데이터에 대한 부스팅 값의 계산결과가 threshold 값을 넘으면 1로 예측한다는 것이다.

 

 

 

 

위는 실제 논문의 알고리즘과 동일하나, 영상을 제작하신 '김성범' 교수님이 간단하게 정리하신 버전인것 같다.

 

간단하게 변수에 대해 설명하자면, W_i 는 i번째 데이터에 대한 가중치(초기 가중치는 모든 데이터가 동일하게 1/n), j 는 모델 학습 수이자 곧 부스팅 모델의 깊이를 의미한다. 그리고 h_j(x) 는 j 번째 반복에서의 분류모델 classifier_j 이며 이때 L_j 는 h_j(x) loss 계산식이다(이때, weight 가 높은 데이터를 분류하지 못할 경우 loss값이 더 커지므로, loss값이 작아지는 h_j 탐색 시 기존에 틀린 문제에 대해 더 잘 풀어내는 학습기가 학습됨) α _j 값은 h_j(x) 모델에 대한 가중치이면서 h_j(x) 가 분류해 내지 못한 새로운 데이터들에 대해 가중치 업데이트에 활용되며(맞춘 데이터는 가중치 그대로), 최종적으로 h(x) 는 최종적으로 얻게되는 Adaboost 모델로 모든 h_j(x) 에 대한 가중합(Addition model)으로 나타내어진다.

 

실제 예시를 바탕으로 각 반복에 대해 어떻게 계산되는지는 원본 영상을 참고하는것이 매우 도움이 될것이다.

 

 

 

 


 

 

3. Gradient Boosting Model

 

Gradient Desent를 활용한 Boosting 모델이다. 조금 다르게 이야기하면, 간단한 트리 모델을 활용하여 Y를 예측, 이 모델로부터 발생한 residual(predict_Y - true_Y) 값을 다음 트리모델이 학습하도록 한다. 이에 대한 반복을 통해 여러개의 weak learner 를 합친 GBM은 훨씬 세세한 predict_Y 를 만들어낼 수 있다.

 

아래의 그림은, Ground truth 즉 true_Y 의 실제 최적의 그래프 즉 탐색 그래프이고, 첫번째 그래프는 러프하게 Y를 탐색한 weak leaner(Tree1) 이 예측한 predict_y 이다. 여기서 true_Y - predict_Y 즉 잔차값을 다음 그래프에 옮겨놓고, 이를 새로운 weak learner(Tree2) 로 예측, 이에따라 새로 계산되는 잔차값을 또 Tree3로 예측하는 것이다.

 

최종적으로 Tree1 + Tree2 + Tree3 = Gradient Boosting  Model 이 되는것이다.

 

 

 

 

여기서 gradient decent와 residual을 교차하여 설명한 이유는 Negative gradient = Residual 이 되기 때문에 가능한 것이다. 우리가 최적의 트리를 탐색하기 위하여 아래와 같은 loss 값을 최소화 하는 weak learner를 탐색한다고 하자. 아래의 loss L은 잔차 제곱합 즉  OLS로 이를 최소화 하는 모델은 곧 True y_i 를 가장 잘 적합하는 f(x) 를 의미한다. 이를 gradient decent를 위하여 negative gradient를 계산해보면 아래와 같이 residual 계산식으로 바뀐다. 즉, loss 값을 최소화 하는 방향인 negative gradient방향으로의 이동은 곧, residual 값을 최소로 하는 방향으로 이동하는것과 동치이다.

 

 

 

 

 

이를 이해한다면 Gradient Boosting 과정을 위와같이 변환하여 생각할 수 있다. Tree1 에 대한 탐색은 Original Dataset에 대하여 loss를 최소화하는 최적의 f_1(x) 를 탐색, Tree2 는 Original Data 와 Tree1에 대한 잔차(Modified Dataset #1)를 최소화 하는 최적의 f_2(x) 를 탐색, Tree3 는 Modified Dataset #1 와 Tree2에 대한 잔차(Modified Dataset #2)를 최소화 하는 최적의 f_3(x) 를 탐색하는 과정이다.

 

이를 깊게 진행할 수록 predict Y 와 true Y에 대한 간격은 줄어들 것이고 이를 Boosting 모델로서 활용가능한 것이다. 더 자세한 알고리즘은 아래와 같다.

 

 

 

 

이때 loss Function L(y_i, F(x)) 로는 MSE, L1 loss, Logistic Loss 가 모두 활용가능하다. step2 의 계산과정은 기존의

F_(m-1) 즉 기존까지 학습된 모델들을 통해 loss 의 Negative Gradient 인 r_im 을 계산하고, 이를 최적화하는 weak learner r_im 을 계산한다. (이때 C의 과정처럼 조금 더 정확한 γ 모델을 탐색하기도 하지만 이는 생략되가도 한다) 이를 통해 계산된 weak learner를 기존의 learner 들과 더하여 새로운 F_m(x) 를 업데이트하여 사용한다. 최종적으로 반복문이 모두 완료된 F_M(x) 모델을 GBM 모델로서 사용한다.

 

 


 

 

GBM 모델은 Gradient decent를 활용하여 더 빠르고 높은 성능을 자랑하지만, training residual을 반복적으로 예측함으로서 overfitting이 될 가능성 역시 높다. 이를 방지하기 위한 Regularization 방식으로 아래의 세가지 방식이 제안된다.

 

Subsampling

말 그대로 각 weak learner 학습시, 학습 데이터 전체를 활용하는 것이 아닌 일부만을 사용하는 것이다. 예를들어 subsampling을 0.8로 둔 경우, 매 weak learner 학습시 데이터셋의 80% 만을 샘플링하여 학습에 활용하고, 다음 반복에서 또 새로운 80% 학습데이터셋을 재추출하는 방식을 반복하는것이다.

 

Shringkage

이는 나중에 생성되는 모형들의 영향력을 지수적으로 감소시키는 방식이다. 예를들어 shringkage를 0.9로 둔 경우, GBM 계산식은 아래와 같이 변경된다.>> f(x) = (1) * f_1(x) + (0.9) * f_2(x)  + (0.9)^2 * f_2(x) + (0.9)^3 * f_2(x) + ... + (0.9)^M * f_M(x)

 

Ealy stopping

 일반적 머신러닝 모델에서 많이 활용하는 방식으로 validation 의 성능향상 없이 학습이 일정 수 이상 진행될 경우 학습을 중단하는 방식을 취하므로, train 데이터셋에 대한 과적합을 사전에 방지하는 역할을 한다.

 

 


 

 

또한 Boosting 모델은 변수 중요도 역시 계산 가능하다. 아래는 잘 정리된 '이주현'님의 깃허브가 있어 이를 참고하였다.

(https://github.com/lee-ju/ensemble/blob/main/gbm.md)

아래와 같이 개별 트리에 대한 변수 사용 여부를 단순 1/0 으로 구분하여 누적하는 방식을 취한다. 즉 boosting과정에서 사용된 트리에서 특정 변수가 몇번이나 활용되었는지를 단순히 따지는 방식이다.

 

https://github.com/lee-ju/ensemble/blob/main/gbm.md

 

 


 

 

4. XGBoost Model

xgboost 는 간단하게만 설명하면 Gradient Boost 모델에 regularization term을 추가, 이 외에도 다양한 loss function을 추가 지원함으로서 확장성 및 일반화에 더 강점을 둔 모델이다. 따라서, XGBoost 기반 모델들이 다양한 컴페티션에서 딥러닝 모델들과 우위를 겨누는 성능높은 모델이더라도, 실제로 이를 활용할 때는 다양한 확장성에 걸맞게 테스크에 적합한 하이퍼파라미더를 정확하게 세팅하는 과정이 필요하다.

 

실제로 이를 활용하기 위해서 다양한 하이퍼파라미터를 설정해두고 grid search 및 random search를 활용하여 최적의 모델을 탐색한 경험이 있고, 이를 위한 하이퍼파라미터 세팅은 아래의 '나무늘보' 님의 티스토리를 많이 참고하였다.

 

https://continuous-development.tistory.com/entry/MLDL-XGboost%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EA%B5%AC%ED%98%84-%EB%B0%8F-hyper-parameter-%EC%84%A4%EC%A0%95

 

[ML/DL] XGboost의 정의와 구현 및 hyper parameter 설정

1.XGboost 1-1.xgboost란? 앙상블 모델의 한 종류인 boosting의 종류이다. 부스팅은 약한 분류기를 세트로 묶어서 정확도를 예측하는 기법이다. 또한 Xgboosting 은 gradient boosting 알고리즘의 단점을 보완해

continuous-development.tistory.com