그라디언트 부스트 (Gradient Boost)

그라디언트 부스트 (Gradient Boost)

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-15-Gradient-Boost?category=1057680

위 블로그를 필사하며 공부

* 모든 텍스트와 이미지의 출처는 위 블로그입니다.

앙상블 모델 -> 부스팅 & 배깅

- 배깅 -> 랜덤 포레스트

- 부스팅 -> AdaBoost, Gradient Boost 등

- Gradient Boost의 변형 모델로는 XGBoost, LightGBM, CatBoost

AdaBoost와 Gradient Boost의 차이

AdaBoost는 stump로 구성되어 있다. 하나의 stump에서 발생한 error가 다음 stump에 영향을 준다.

- 이런식으로 여러 stump가 순차적으로 연결되어 최종 결과를 도출함

반면 Gradient Boost는 stump나 tree가 아닌 하나의 leaf (single leaf)부터 시작한다.

- 이 leaf는 타겟 값에 대한 초기 추정 값을 나타낸다.

(보통은 초기 추정 값을 평균으로 정함)

- 그 다음은 AdaBoost와 동일하게 이전 tree의 error은 다음 tree에 영향을 줌

- but, AdaBoost와 다르게 stump가 아닌 tree로 구성되어 있다.

(보통은 leaf가 8개~32개가 되는 tree로 구성)

Gradient Boost 프로세스

출처: StatQuest

키, 좋아하는 색, 성별을 기반으로 몸무게를 예측하는 Gradient Boost 모델

Gradient Boost는 single leaf부터 시작해, 그 single leaf 모델이 예측하는 타겟 추정 값은 모든 타겟 갑스이 평균이다.

(88 + 76 + 56 + 73 + 77 + 57) / 6 = 71.2

따라서, single leaf로 몸무게를 예측한다면 모든 사람은 71.2kg라고 할 것이다.

출처: StatQuest

single leaf에서 예측한 값과 실제 값의 차이(error)를 반영한 새로운 트리를 만들어야 한다.

- 위 그림에서는 편의상 leaf가 4개인 트리를 그렸지만 실제로는 leaf가 8개~32개인 트리를 주로 씀

error을 구해보자.

- 첫 행의 실제 몸무게 값은 88kg인데 앞서 leaf는 71.2kg로 예측했다.

- 따라서 차이는 88 - 71.2 = 16.8kg 이다.

- 이를 Pseudo Residual이라고 한다.

모든 행의 Pseudo Residual은 다음과 같다.

출처: StatQuest

키, 좋아하는 색, 성별을 통해 Residual을 예측하는 트리를 만들어보자.

모델은 아래와 같이 만들었다.

- 맨 처음 노드에선 성별이 여자면 왼쪽, 남자면 오른쪽

- 두 번째 노드에선 키가 1.6m 미만이면 왼쪽, 이상이면 오른쪽,

좋아하는 색이 파란색이 아니면 왼쪽, 맞으면 오른쪽으로 간다.

출처: StatQuest

여기서 마지막 leaf 노드에 두 개의 residual 값이 있는 경우가 있다.

- 그럴 땐 두 값의 평균 으로 치환해 넣어주자.

출처: StatQuest

이제, 초기에 구한 트리(여기서는 single leaf)와 두 번째로 구한 트리를 조합해 몸무게를 예측해보자

출처: StatQuest

두 번째 트리에서 성별이 남자고, 좋아하는 색이 파란색이면 residual을 16.8로 예측했다.

출처: StatQuest

첫 번째 트리의 몸무게 예측 값인 71.2kg와 두 번째 트리의 residual 예측 값인 16.8kg을 더하면 88이 된다.

- 즉, 성별이 남자고, 좋아하는 색이 파란색이면 그 사람의 몸무게는 88kg라고 예측을 한 것

출처: StatQuest

우리가 만들어준 모델이 예측한 몸무게와 실제 몸무게가 88kg로 일치함

- but, 이는 훈련 데이터에 너무 fit한 모델 ( 과적합 )

과적합 문제를 해결하기 위해 학습률(Learning Rate)이라는 것을 활용한다.

- 학습률은 0~1 사이의 값을 가진다.

- Residual을 예측하는 모델에 학습률을 곱해줌으로써 과적합을 해결 가능하다.

출처: StatQuest

- 여기선 학습률을 0.1로 세팅

출처: StatQuest

학습률이 0.1인 경우 모델이 예측한 몸무게는 72.9kg

- 첫 single leaf 모델이 예측한 71.2kg보다는 실제 값(88kg)에 더 가까워짐

- Gradient Boost 모델은 이런식으로 실제 값에 조금씩 가까워지는 방향으로 학습을 함

* 올바른 방향으로 (즉, 실제 값과 가까워지는 방향으로) 조금씩 더 가까가는 식으로 학습된 모델은 테스트 데이터에서 좋은 성능을 보여준다.

지금까지 만든 모델을 기반으로 Pseudo Residual을 다시 구해보자.

출처: StatQuest

Pseudo Residual은 실제값 - 예측값 이다.

출처: StatQuest

첫 번째 데이터를 예로 들면, 실제 값은 88kg이고 새로운 모델의 예측값은 71.2 + 0.1 * 16.8 이다.

-> Pseudo Residual = 88 - (71.2 + 0.1 * 16.8) = 15.1kg

출처: StatQuest

맨 처음 구한 Residual과 결합된 모델로 구한 Residual을 비교해보자.

출처: StatQuest

- 왼쪽이 처음 구한 Residual (평균값인 71.2만 활용해 구한 값)

- 오른쪽이 결합된 모델로 구한 Residual

- 새로운 Residual은 초기 Residual보다 모두 작은 값.

- Residual이 작아졌다는 뜻은 다른 말로 하면 실제 값과 예측 값의 차이가 작아졌다는 뜻

- 즉, 조금씩 실제 값으로 다가가고 있다 는 뜻 !

새로 구한 Residual로 트리도 새로 만들기

출처: StatQuest

본 예제에서는 leaf가 4개인 트리를 계속 사용하지만 실제는 매 iteration마다 트리의 모양이 바뀔 수 있다.

(마찬가지로 두 값이 들어있는 leaf는 평균 값으로 대체하자)

이제, 지금까지 구한 트리에 학습률을 곱한 뒤 합해주자.

출처: StatQuest

'초기 leaf 트리 + (학습률 * 첫 번째 residual 예측 트리) + (학습률 * 두 번째 residual 예측 트리)' 가 지금까지 구한 모델

출처: StatQuest

지금까지 구한 모델을 통해 키 1.6m에 남자이고, 좋아하는 색이 파란색인 사람의 몸무게를 예측해보자.

StatQuest

74.4kg로 예측

- 초기에는 평균값인 71.2kg로 예측했고,

- 그 다음 스텝에선 71.2 + 0.1 * 16.8 = 72.9kg로 예측했고,

- 현재 모델에선 71.2 + 0.1 * 16.8 + 0.1 * 15.1 = 74.4kg로 예측했다.

-> 실제 값은 88kg인데 실제 값과 조금씩 가까워진다!

Residual 구해보기

출처: StatQuest

Residual도 점점 감소하고 있다.

- iteration을 할 수록 Residual이 감소한다.

- 즉, 예측 정확도가 더 높아진다.

출처: StatQuest

사전에 하이퍼 파라미터로 정해 놓은 iteration 횟수에 도달하거나, 더 이상 residual이 작아지지 않을 때까지 반복

- 모든 반복이 완료되면 최종적으로 Gradient Boost 모델이 구축된 것

-> 이제 새로운 데이터가 주어지면 본 모델로 몸무게를 예측 가능하다.

출처: StatQuest

초기 평균 값인 71.2에 모든 트리의 학습률 * residual 을 더해주면 몸무게를 예측할 수 있다.

- 키가 1.7m이고 좋아하는 색이 초록색이고 여자라면 몸무게는 70kg라는 결과를 얻을 수 있다.

from http://yeon22.tistory.com/129 by ccl(A) rewrite - 2021-11-07 20:00:59