티스토리 뷰

728x90

이번 포스팅에는 직접 GBM(Gradient Boosting Machine)을 살펴보려고 한다.

boosting의 개념을 모른다면, 이전 글 ada boost를 보고 오길 바란다. boosting의 의미를 알아야 GBM을 알아가는데 직관적으로 와닿을 것이다.

https://sims-solve.tistory.com/95

 

[ML] AdaBoosting 정리

이번 포스팅에서는 Bagging방식의 앙상블과 양대산맥을 이루는 Boosting 앙상블 방식을 사용하는 Ada(아다)Boosting을 한번 살펴보려고 한다. 들어가기 전에.. DT(Decision Tree)에 대해 자세히 알고있으면

sims-solve.tistory.com

1. GBM이란?

GBM은 Ada boost와 같이 boosting 기법을 사용한 모델이다.

Ada boosting은 stump를 이용하여 잘 맞추지 못하는 sample들의 weight을 높게(=같은 데이터를 많이 샘플링) 바꿔 다음 분류기에서 틀렸던 샘플을 보다 잘 구분하도록 만드는 모델이다.

 

그럼 GBM은 어떤 방식으로 학습을 할까?

GBM은 '잔차'를 학습하여 원래 y값에 최대한 비슷하게 다가가는 기법이다.

사실 위처럼 말을하면, 어떤 방법으로 학습을 하게 되는지 정말 막연하다.. 밑에 설명을 한번 보도록 하자.

위와같이 GBM은 이전 분류기에서 예측하지 못한 잔차를 다음 분류기가 예측하여 성능을 보안하는 방식으로 학습하게 된다.

이또한 와닿지 않을 수 있으므로, 간단한 예제를 하나 더 첨부하겠다.

 

위처럼 DataFrame에서 x와 y(target)가 있다고 가정할 때, GBM은 지속적으로 y의 값을 '잔차'로 바꿔가며 학습하는 분류기를 만들어 학습하고, 최종적으로는 모든 분류기를 더하여 최종 예측값을 만들어 낸다.

각 분류기의 역할은 바로 이전 분류기의 부족함을 채워주는 역할을 수행한다고 볼 수 있다.

그럼, 1 ~ N개의 분류기 중, 시작 부분(1번 분류기)에 가까울 수록 일반화된 부분(넓은)을 학습하는 분류기이며,

끝 부분(N번 분류기)에 가까울 수록 보다 세세한 부분(좁은)을 학습하는 분류기라고 볼 수 있다.

이러한 특성으로 인해 GBM은 점점 실제값 y와 유사한 값을 예측할 수 있는 것이다.

 

2) 왜 이름이 Gradient Boosting Machine 일까?

사실 위의 내용만 보면 왜 딥러닝에서나 나올법한 Gradient(기울기)가 나오는지 알 수가 없다.

왜 그럴까?

위 수식처럼, 편미분을 해보면 딥러닝에서 사용하는 gradient descent 알고리즘과 유사한 방식으로 분류기들이 점차 y값에 다가갈 수 있도록 해준다는 것이다. ( 딥러닝에서는 Wegiht값의 영향력을 구하기 위해 W로 편미분)

한마디로, 조금씩 조금씩 y의 값과 유사해 질 수 있도록 학습해 나가는 알고리즘이다. ( 딥러닝도 마찬가지로 조금씩 학습)

 

지금까지 GBM에 대한 기본적인 내용과 학습방법을 살펴보았다. 다수의 분류기가 sequential하게 작동하고, A분류기의 부족함을 다음 분류기가 보완해 나가며 결국 최대한 y값에 가깝도록 만드는 알고리즘 이였다.

 

이러한 이론을 바탕으로 sklearn에 있는 GBM을 사용하여 Regression, Classification 두가지 task를 어떻게 수행하는지 직접 손으로 해보는 포스팅을 다음 포스팅으로 하겠다.

 

 

 

 

 

GBM도 Ada boost처럼 decision Tree를 기반으로 하지만, DT(decision Tree)의 기반이 Ada boost는 stump(깊이 1)인 반면,

GBM은 깊이가 3(default)인 DT를 기본으로 사용한다. 중요한건... GBM도 base는 DT라는것이다...(DT를 자세히 공부해야 하는 이유가 있다..)

 

 

 

///////////////////////////////////////////////////////////////// 정리할 내용 //////////////////////////////////////////////////////////////////////////////

이론상 균형트리를 만들어야 하지만, 막상 depth를 바꾸면 일반 decision tree처럼 불균형 트리가 생성되는 것 같음.

GBM은 트리의 max_depth를 default로 3으로 고정시켜 놓는다. > 어느정도 균형트리를 만들 수 있지 않을까?

 

split 시 기존 decision tree는 sequred error를 사용했지만, GBM은 프리드만 mse를 사용함. (프리드만 mse에 대해 생각해볼 것 모르겠음)

하지만, sequred error로 gini계수 구하는 거랑 똑같이나옴(아마 split할때 IG을 구하는 과정에서 프리드만 mse를 사용하는 것같음,

하지만 sequred error를 사용해도 똑같이 트리모양 생성 , 즉, sequred error로 수행한다고 일단 생각, 하지만 sklearn 에서는 프리드먼 mse를 사용한다는 것만 기억)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함