본문 바로가기

Machine learning/Supervised Learning

[부스팅 모델] XGBoost

이 글은 Joshua StarmerXGBoost Part 1 (of 4): Regression 를 정리한 것임을 밝힙니다.

 

XGBoost는 빠른 시간에 부스팅 모델로 데이터를 학습할 수 있다는 이점이 있어 현업에서도 자주 쓰인다. 캐글에서도 상위 랭크를 차지하고 있는 모델에서 XGB를 심심치 않게 볼 수 있다.

 

오늘은 XGBoost의 알고리즘이 어떤 식으로 구현되는지 단계 별로 알아보려고 한다.

예시는 신약투여량(Drug Dosage)에 따른 약의 효능(Drug Effectiveness)의 수치를 예측하는 문제이며 Regression 문제이다.

1. initial prediction

임의의 값으로 initial prediction(예시에서는 0.5)로 정한 뒤, initial prediction과 데이터 사이의 residual(오차)를 구한다.

2. Tree for residuals 

각각의 데이터 사이에 파티션을 나누어 보고 Similarity score를 구하는 과정

XGB는 residual을 학습하는 트리를 만든다. 

XGB에서는 simliarity score 라는 지표를 사용하는데(첫 번째 그림 참고), 쉽게 말해 '가지를 뻗었을 때 같은 방향에 있는 데이터가 얼마나 많은지'를 알려주는 척도이다. 

각 residual를 먼저 합하고 합한 값을 제곱하고 residual에 수로 나눠준다. 만약, 예측값을 기준으로 residual의 방향이 다르다면 합할 때 상쇄되어 유사도 값이 확 낮아지게 된다. 

여기서 λ는 정규화 term인데 λ가 커질수록 모델의 variance가 낮아진다. (나중에 자세히 설명하겠음)

 

위처럼, 4개의 포인트가 있어서 파티션은 총 3개의 후보(?)가 나오게 되어, 각 3번마다 나눠진 데이터의 residue를 구하여 simliarity score를 구하게 된다. 그리고 가장 Gain값(previous node 와 child nodes의 similarity score 차이)이 높아지는 파티션으로 가지를 뻗게 된다. 위의 경우에는 첫번째 파티션이 Gain이 가장 컸으므로 처음 분할은 첫번째 파티션인  Dosage<15 를 기준으로 나눠지게 된다.

 

2번째 분할 과정

빨간색 파티션 기준으로 왼쪽은 데이터가 한 개이므로 더이상 분할이 안되고, 오른쪽 부분 데이터 3개를 (2)과정을 반복해서 Gain이 큰 쪽으로 파티션을 결정해준다. max_depth(트리의 깊이)를 2라고 제한했을 때(원래 default 값은 6) 아래와 같이 최종 residue 트리가 만들어지게 된다.

3. 예측값 계산하기

각 노드의 output value는 leaf node에 있는 residual의 합을 residual 개수+ λ 로 나눈 것이 되며, 첫번째 트리에 대한 예측값은 아래와 같이 계산된다.

 

기존 예측 값(0.5) + learning rate (ETA) * output value

*learning rate default: 0.3 

4. 부스팅 과정 반복하기

Residual에 대한 트리가 하나 만들어졌다면 업데이트 된 예측값으로 얻어진 residual로 또 새롭게 트리를 학습시킨다. (이 과정이 부스팅!)

XGB는 부스팅 모델이기 때문에 이 과정을 n번 반복하면서 점점 예측값이 아래 그림처럼 학습 데이터에 조금씩 가까워지며 잔차가 줄어들게 된다.

이후, 새로운 (줄어든) residue에 대한 트리를 앞서 과정을 반복하여 만듦으로써 오차를 줄이는 트리를 계속 만들게 된다. 이것이 XGB의 핵심 알고리즘이다.

 

Classification in XGB

XGB는 분류 모델로도 쓰일 수 있는데, 분류 문제일 때는 prediction의 개념이 '확률'로 바뀐다.

예를 들어, 위의 예시에서 Dosage에 따른 Effectiveness를 0 또는 1이라고 예측한다고 했을 때, 0.4로 예측한다고 하면 약효가 있을 확률이 40%라는 뜻이다.

  1. 처음 initial prediction을 0.5로 정하고 각 데이터마다 잔차를 구한다. (주의할 점은 잔차를 더해줄 때는 logit으로 계산해야 한다는 점이다. 잔차가 logit으로 미분되었기 때문에! → 따라서, log(odds) = 0 이 된다.)
  2. Similarity score 와 residual tree의 output value는 아래와 같다. (이 점이 회귀 문제와 다르다!)
  3. new predicted value = previous predicted value + learning rate * output value 
  4. 로짓으로 계산된 (3)의 new predicted value를 다시 확률값으로 변환하여 (1)의 과정으로 돌아가 업데이트된 잔차를 구해준다.

분류일 때의 Similarity score
분류일 때의 잔차 트리의 output value

XGB 정규화 파라미터

XGB정규화 파라미터에는 크게 두 가지가 있다. 

  • γ(gamma): 만약, Gain이 γ보다 낮다면, prunning (가지를 버림) 는 과정을 통해 모델의 오버피팅을 방지한다. 주의할 점은, XGBoost의 Prunning은 Tree가 다 만들어지고 하위 노드에서부터 gain과 γ를 비교한다는 점이다. 만약, 하위 노드의 gain이 γ보다 크다면, 그 상위노드의 gain과 γ는 비교하지 않는다.(설령, 상위 노드의 gain이 γ보다 작을지라도 이미 하위 노드에 큰 gain 값이 있으므로 의미있는 과정이라고 보는 것!)
  • λ(lambda): similarity score를 작게하는 과정을 통해 gain값이 줄어들게 한다. 이는 모델이 gain값에 덜 민감하게 반응하게 하고 γ에 의해 잘 prunning 될 수 있게 한다. Similarity score와 Output value에서 λ는 분모에 더해지므로 샘플의 수가 작을수록 그 영향이 크므로 적은 샘플에 대한 영향력을 줄인다. 

'Machine learning > Supervised Learning' 카테고리의 다른 글

의사결정나무(Decision Tree)  (0) 2024.02.08
[정규화] Elastic Net  (0) 2024.01.19
[정규화] 라쏘(LASSO) 회귀  (0) 2024.01.19
[정규화] 릿지(Ridge) 회귀  (0) 2024.01.19