본 글은 여기를 참조하였다. 참조한 블로그의 설명은 최초 유튜브 동영상 강좌인 여기를 베이스로 하여 작성되었다.
그러나 참고 자료는 데이터만 차용했을 뿐 본 글 내용의 대부분은 Gradient Boost를 직접 구현하여 그 중간 과정의 결과들을 취합하여 설명을 붙인 것으로 구성이 되어있다. Gradient Boost 구현은 How to Build a Gradient Boosting Machine from Scratch를 참고로 하여 구현하였다.

1. Gradient Boost 과정

1.1 Example Data

아래 표을 예제로 키, 좋아하는 색깔, 성별을 기반으로 몸무게를 예측하는 Gradient Boost 모델을 만들어보겠다.

1.2 과정(Procedure)

< 1st Tree >

1) 최초 weight에 대한 예측값(초기 추정값)을 구하고 예측값과 실제값과의 차이인 residual을 구한다.

  • 최초 예측값(초기 추정값)은 target값들의 평균으로 구한다. 평균값은 71.17이고 이 때 실제값과의 차이인 residual(pesudo residual 이라고 한다)의 차이를 구하여 정리하면 다음과 같다.

2) residual을 target으로 하는 tree를 만든다.


설정에서 leaf node의 갯수를 4개로 제한했기 때문에 2번째, 3번째 leaf node의 값은 1.83, 5.83의 평균값과 -15.17, -14.17의 평균값이다. (실제로는 leaf node의 갯수가 8개 ~ 32개인 tree를 주로 쓴다.)

< 2nd Tree >

3) 2)에서 구한 residual에 learning rate를 곱하여 새로운 weight의 예측값을 구하여 업데이트하고 실제값과의 차이인 residual도 다시 구해서 업데이트한다.


이전 residual 값에 learning rate를 곱하는 이유는 곱하지 않고 residual을 그대로 썼을 경우 학습 데이터만 잘 맞는 과적합(overfitting) 문제가 발생하기 때문에 이를 줄이기 위해서 학습 데이터에 지나치게 편중되는 결과를 막기 위해서 learning rate를 곱해준다.
예를 들어 첫번째 데이터에서 predicted weight값 72.85는 71.17 + (0.1(learning rate) * 16.83) = 72.85로 계산이 되고, residual 값 15.15는 실제값에서 predicted값을 뺀 88 - 72.85 = 15.15가 된다.

4) 업데이트된 residual을 target으로 하는 tree를 만든다.

< 3rd Tree >

5) 4)에서 구한 residual에 learning rate를 곱하여 새로운 weight의 예측값을 구하여 업데이트하고 실제값과의 차이인 residual도 다시 구해서 업데이트한다.


학습이 진행되면서 Tree를 많이 만들어 나갈 수록 예측값은 실제값에 점점 가까와지고 resudual은 점점 작아지는 것을 볼 수 있다. 이것이 바로 Gradient Boost 방법이다.

6) 업데이트된 residual을 target으로 하는 tree를 만든다.

계속해서 tree를 더 많이 만들어 잔차(resudual)를 줄이고 예측값의 정확도를 더 높일 수 있지만 본 예제에서는 3개까지만 만들고 더 이상 진행은 생략하기로 한다.
실제로는 사전에 하이퍼 파라미터로 정해 놓은 iteration 횟수에 도달하거나 더 이상 residual이 작아지지 않을 때까지 반복을 한다. 모든 반복이 완료되었다면 최종적으로 Gradient Boost 모델이 구축된 것이다.

2 최종 예측값 계산

Gradient Boost로 학습을 완료하면 최종 예측값은 각 tree에서 생성된 잔차의 합에다 learning rate를 곱한다음 여기에 최초 예측값(target값의 평균값)을 더해주면 된다.

예를 들어 첫번째 데이터의 경우 최종 예측값은,
71.17+0.1(16.83+15.15+13.63)=75.7371.17+0.1*(16.83+15.15+13.63)=75.73이 된다.

키가 1.7m이고 좋아하는 색깔이 초록색이고 성별이 여성인 데이터의 경우 예측값을 계산하면, 71.17+0.1(4.83+4.35+3.91)=72.4871.17+0.1*(4.83+4.35+3.91)=72.48 이 된다.

profile
바쁘게 부지런하게 논리적으로 살자!!!

0개의 댓글