on
그라디언트 부스트 (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