한양과학기술고등학교

에듀테크 프로젝트 대시보드

그래디언트 부스팅 (Gradient Boosting)

그래디언트 부스팅 (Gradient Boosting)

랜덤 포레스트가 트리 여러 개를 독립적으로 만들어 평균 내는 것과 달리, 그래디언트 부스팅은 트리를 한 개씩 순서대로 만든다. 새 트리는 원본 정답이 아니라, 지금까지 모델이 못 맞힌 만큼(잔차, residual) 만 예측하도록 학습되고, 그 예측을 학습률 만큼만 살짝 더해 전체 예측을 조금씩 개선한다. 아래에서 얕은 트리(스텀프) 하나하나가 쌓이며 예측 곡선이 데이터에 맞춰지는 과정을 직접 조절해 보자.

1. 라운드를 늘려가며 지켜보기

점은 잡음이 섞인 1차원 데이터, 노란 계단선은 지금까지 쌓인 모델의 예측이다. 라운드 슬라이더를 올릴 때마다 잔차를 가장 잘 줄이는 스텀프(깊이 1 트리) 하나가 추가된다. 학습률이 작을수록 한 라운드의 영향은 작지만 더 부드럽게 수렴한다.

라운드 0 · 학습 MSE —
라운드 0은 그냥 전체 평균으로만 예측한 상태다. 라운드가 늘수록 계단선이 점점 점들을 따라가고, 학습률을 낮추면 같은 라운드에서도 더 완만하게 따라간다.

2. 알고리즘: 잔차를 다음 모델의 정답으로

초기 예측

가장 단순하게, 모든 데이터에 대해 y의 평균값 하나로 예측을 시작한다.

잔차 계산

지금 예측이 얼마나 틀렸는지를 잔차 = 실제값 − 현재 예측으로 구한다.

약한 모델 학습

원래 y가 아니라 잔차를 새로운 정답 삼아, 얕은 트리(스텀프) 하나를 학습시킨다.

조금만 반영

새 트리의 예측에 학습률(η)을 곱해 전체 예측에 더한다: 예측 += η × 새트리(x). 이 과정을 원하는 라운드 수만큼 반복한다.

매 라운드가 "이전 모델이 남긴 오차"만 겨냥하기 때문에 부스팅(boosting)이라 부른다. 학습률을 1에 가깝게 크게 잡으면 몇 라운드 만에 훈련 데이터에 딱 맞아버려(과적합) 새 데이터에는 약해지고, 작게 잡으면 라운드는 더 필요하지만 더 일반화가 잘 되는 모델이 된다.

3. 한 라운드의 핵심 (JavaScript)

// pts: [{x, y, resid, pred}] function boostRound(pts, lr) { // 잔차를 가장 잘 줄이는 임계값 하나(스텀프)를 찾는다 const stump = fitStump(pts.map(p => ({ x: p.x, y: p.resid }))); // 예측 갱신 + 잔차 다시 계산 for (const p of pts) { const h = p.x < stump.threshold ? stump.left : stump.right; p.pred += lr * h; p.resid = p.y - p.pred; } return stump; }

4. 실전에서는 이렇게 쓰인다

XGBoost · LightGBM · CatBoost

캐글 상위권을 휩쓸었던 라이브러리들. 스텀프 대신 조금 더 깊은 트리를 쓰고, 정규화·병렬화 등을 더해 실전 성능을 끌어올렸을 뿐 핵심 원리는 동일하다.

랜덤 포레스트와의 차이

포레스트는 트리들이 서로 독립(분산 감소), 부스팅은 트리들이 서로의 실수를 이어받는다(편향 감소).

조기 종료 (Early Stopping)

검증 데이터 오차가 더는 줄지 않으면 라운드를 멈춰서 과적합을 막는 기법도 함께 쓰인다.

핵심 정리

  • 그래디언트 부스팅 = 이전 모델의 잔차를 다음 약한 모델(주로 얕은 트리)이 순차적으로 보정
  • 학습률(shrinkage)로 한 라운드의 영향을 줄여 과적합을 억제
  • 랜덤 포레스트(병렬·독립) vs 그래디언트 부스팅(순차·의존) — 앙상블의 두 축
  • XGBoost·LightGBM 등은 이 아이디어를 정규화·속도 최적화와 함께 실전에 맞게 발전시킨 것