ML

XGBoost

성지우 2024. 2. 18. 20:15

XGBoost : A Scalable Tree Boodsting System을 읽고 참고하여 작성

XGBoost

eXtreme Gradient Boosting

gradient boosting은 이전 학습기의 결과를 이어받아 순차적으로 학습하기에 시간이 많이 걸리는 게 단점

속도와 정확도면에서 개선한 모델

기존 Gradient Tree Boosting 알고리즘에 과적합 방지를 위한 기법이 추가된 지도학습 알고리즘

기본학습기를 decision tree로 하며 gradient boosting과 같이 잔차를 이용하여 이전 모형의 약점을 보완하는 방식으로 학습

손실함수가 최대한 감소하도록 하는 분할점(split point)를 찾는 모델

Regression, Classification 모두 지원

트리부스팅 방식에 경사하강법을 통해 최적화

 

XGBoost Algorithm

Gradient Booting사용

 

2차 근사식이 좋은 이유는, t번 째 iteration에서 최종 손실함수가 의존하여 최적화할 수 있기 때문에, 손실함수의 종류와 관계없이 간단하게 계산할 수 있다는 점이다.

 

 

모든 가능한 트리를 나열하여 최적 트리를 찾는 것은 거의 불가능하기 때문에,  2차 근사식을 바탕으로 한 손실함수를 토대로 매 iteration마다 하나의 leaf로부터 가지를 늘려나가는 것이 효율적입니다. 가지를 늘렸을 때 (7)번 식으로 나타나는 손실 함수가 최대한 감소하도록 하는 split point를 찾는 것이 XGBoost의 목표입니다. 

 

 

L split = 가지를 늘렸을 때 손실함수의 감소량

가지를 나누기 전의 손실함수에서 가지를 나눈 후의 손실함수를 뺀 식 (왼쪽,오른쪽의 score더하고 부모노드점수뺌)

-> 트리를 학습하며 가지를 늘릴때마다 사용되는 식 

 

감마 : 무한히 분기하면 오버피팅됨, 그렇기에 가지를 만들지 말지에 대한 기준이 됨

information gain < 감마 , 가지는 제거

즉, 가지를 먼저 만들고 나서 (information gain - 감마) = 음수면 가지 제거, 양수면 가지 놔둠

 

람다 : regularization의 파라미터, 람다의 값이 크면 전체 score를 줄여준다는 뜻

람다가 클수록 (information gain - 감마) = 음수가 많아져 제거되는 가지가 많아짐 -> 오버피팅 방지

 

정규화된 목표외의 과적합 방지하는 2가지 기술

 

1. Shrinkage

직전 iteration까지 학습된 트리의 모든 leaf의 weight에 η을 곱해줌

itreration지날수록 생성되는 트리 영향력 줄여 이후 생성된 트리들이 모델 개선할 여지를 남기는 방식으로 오버피팅 방지

learning rate와 비슷한 개념, 가중치를 다르게 주는 것

 

2. Column Subsampling

Random Forest에서 사용

Subsampling한 일부  column들만 활용한 병렬학습통해 방지

각 단계에서 column을 subsampling

컬럼을 다 뽑지 않음으로써 다양성 부여하고 오버피팅 방지

 

최적의 Split Point찾는 알고리즘 4가지

 

트리 학습의 핵심 문제 중 하나는 최상의 분할을 하는 것

1. Basic Exact Greedy Algorithm

Exact Greedy Algorithm = 모든 feature에서 가능한 모든 분할을 열거하는 알고리즘

기존 tree model처럼 feature를 split하기 위해 모든 경우의 수를 파악

그러나 데이터가 한꺼번에 로딩되지 않으면 알고리즘 실행불가, 

한번에 처리해야해 분산환경에서 처리 될 수 없어 병렬처리 불가

 

 I = split하기 전의 모든 sample의 집합

1. score에 0 입력 (gain = score라 생각)

2. split이후 손실함수의 값의 감소량을 계산하기 위해  split이전의 gradient값을 G,H에 입력

3. m개의 feature에 대해 가능한 모든split point로  

 

 

2. Approximate Algorithm

Exact Greedy Algorithm의 데이터로딩문제와 분산환경에서의 처리문제를 극복하기 위한 대안

Exact Greedy는 모든split에 대해  계산했다면, Approximate는 버킷안에서의 split만 계

 

 

  1. data를 percentile로 나눔- 개만큼,
    percentile  = feature의 분포를 통해 나누는 방법,
    순서대로 정렬하려면 시간이 오래걸려 100개의 Quantile로 나누는 방법
    Quantile =  어떤 집단에서의 class
  2. 하이퍼파라미터 ϵ을 조정하여 얼마나 잘게 나눌지 결정
    일반적을 버킷은 1/ ϵ 만큼 만들어짐, 여기서는 개만큼의 버킷이 만들어짐
  3. 버킷별로 split - 각 버킷은 다른 스레드로 태워서 계산할 수 있어 병렬처리 가능
    각 버킷에서 split했을때 information gain이 가장 큰 버킷에서 split이뤄짐
  4. split 한 후 2가지 variant가 있음 - Global variant, Local variant

Global variant

전체 크리당 버켓팅을 한번 수행

https://github.com/pilsung-kang/Business-Analytics-IME654-/blob/master/04%20Ensemble%20Learning/04-7_Ensemble%20Learning_XGBoost.pdf

 

Global variant의 경우 부모노드는 best split point를 기준으로 두개의 자식노드로 분할

분할 후에도 상위 노드의 버킷 포인트를 유지

 

Local variant

split있을 때마다 버켓팅 수행

https://github.com/pilsung-kang/Business-Analytics-IME654-/blob/master/04%20Ensemble%20Learning/04-7_Ensemble%20Learning_XGBoost.pdf

 

Local variant의 경우 상위 노드에서 분할이 발생할때마다 버켓팅을 함

하위 노드에 왼쪽, 오른쪽 각각 다시 10개의 버킷이 있음

 

* 가장 좋은 버킷의 수는 무엇일까?

golbal의 경우 버킷을 유지함으로 가능한 많은 버킷을 확보하는 것이 좋다

local의 경우 split할때마다 버킷팅 발생함으로 더 큰 트리에 유리하다

eps =  ϵ 는 버킷 수를 정의하는 하이퍼 파라미터

 

3. Weighted Quantile Sketch (WQS)

Sketch Algorithm

대용량 데이터의 경우 전체 데이터 셋에 대해 계산을 수행하는 것은 비효율적이고 느림

소수 데이터 셋에 대해 병렬로 계산을 수행한 후 결과 결합하여 최종 출력 얻는 것이 유리

-> 모집단 분포를 가정하기 위해 표본분포를 사용하는 것과 같다

 

Quantile Sketch Algorithm

Sketch Algorithm에 Quantile을 추가한 알고리즘

approximate algorithm에서 quantile을 사용한 것처럼 quantile사용해 후보 분할점 찾는 것이 가능

 

큰 데이터 셋을 작은 데이터 셋으로 분할하고 병렬로 실행하여 데이터 셋의 대략적인 히스토그램을 찾는다

- 샘플 데이터 셋 -> 원본 데이터 셋에 근사 

quantile을 근사화하려면 근사 히스토그램을 사용

eps사용해 n개의 버킷으로 만듬

>> 대용량 데이터 셋을 다룰때 Sketch적용한다는 점만 제외하면 approximate algorithm과 비슷

 

Weighted Quantile Sketch

각 분위수(quentile)가 동일한 수의 샘플을 갖는 정규화된 분위수와 달리

가중치가 부여된 분위수는 동일한 수의 샘플을 갖지 않고 각 분위수가 동일/유사한 합산 가중치를 갖도록만듬

 

위의 식 4를 Taylor전개(테일러 다항식에서 오차항을 없애고 무한차원까지 계속 확장한 것) 후

재배열한 식, hi가 가중치로 사용

각 관측치에 weight를 구함, weight의 합이 각 quantile에서 같음

즉, weight의 합이 동일한 quantile로 구성한 것이 Weighted Quantile Sketch

 

회귀문제의 경우 각 분위수에 대한 가중치 = 1

분류문제의 경우 로그 손실 함수에 대한

Hessian 행렬(어떤 함수의 2계도함수들을 이용해 행렬을 만든 것) = 이전확률 * (1 - 이전확률)

따라서 이전 확률이 실제 값에 가까울때마다 데이터에 더 적은 가중치 부여되지만

이전에 예측한 확률과 실제 레이블 간 큰 차이가 있는 경우 더 큰 가중치 부여됨

결과적으로 예측이 확실하지 않으면 분위수는 더 큰 가중치 갖게되고

해당 분위수에 포함되는 데이터 포인트는 더 적어짐

 

4. Sparsity-Aware Split Finding Algorithm

실제 데이터셋은 희박하다 -> 희소한 데이터를 쉽게 처리할 수 있는 방법

희소한 데이터를 분할 시, default direction으로 분할됨 

 

희소성 발생이유

  • Missing values
  • 0 entries
  • Result of feature engineering (One-Hot Encoding)

 

  1. 다른 알고리즘과 같은 입력 I,d와 추가적인 입력 = Ik : 특성k에 대한 결측값이 있다
  2. 분할 결정에 필요하기에 G, H의 초기화는 동일
  3.  각 특성 k-> m에 대해 수행, 아래 예시 데이터셋이 있다 가정
  4. 모든 missing value들을 오른쪽으로 보낸다
    오른쪽으로 보낸 후 분할을 수행, 가장 좋은 분할 지점은 아래와 같이 발생
  5. 모든 missing value들을 왼쪽으로 보낸다

  6. 위 그림에서 보면 왼쪽으로 보냈을 때 두 클래스 (0과 1)사이에 명확한 분할이 있어
    전체 feature split에 대해 왼쪽방향으로 수행하는 것이 선택됨

 

default direction(기본 방향)은 모든 기능에 대해 수행되며 각 기능에는 고유한 방향이 있다

위 그림에선 age의 방향은 왼쪽, male의 방향은 오른쪽이다

 

첫번째 분할은 나이에 따라 발생

X1에 결측이 있다는 것을 알고 왼쪽노드로 이동(default direction으로)할 것이다

X2는 나이에 결측이 없고 20살 미만으로 왼쪽노드에서 끝난다

X3는 나이에 결측이 없고 20살 이상으로 오른쪽노드에서 끝난다

 

두번째 분할은 남자(성별)에 따라 발생

X1는 성별에 결측이 없고 남자임으로 왼쪽노드로

X2는 결측이 있어 왼쪽노드로 이동

 

 

장점

병렬처리로 인한 GBM(Gradient Boosting Machine) 대비 빠른 수행시간

과적합 규제기능이 있어 강한 내구성을 가짐

조기 종료 기능 있음

다양한 하이퍼 파라미터 제공 및 customizing 용이

 

단점

GBM 대비 성능은 우수하나 학습시간이 느림

제공하는 하이퍼파라미터가 많아 튜닝이 오래 걸림

작은 데이터 사용시 과적합 가능성있음 (좋은 성능위해선 많은 데이터 필요)

다른 앙상블 계열 알고리즘과 같이 해석이 어려움

 


참고 및 출처 : https://arxiv.org/pdf/1603.02754.pdf , https://kicarussays.tistory.com/25 , https://everyday-log.tistory.com/entry/XGBoost-A-scalable-Tree-Boosting-System , https://blog-ko.superb-ai.com/algorithm-in-3-minutes-xgboost/ , https://zephyrus1111.tistory.com/232 , https://exupery-1.tistory.com/183#google_vignette , https://medium.com/@wjj1019/in-depth-overview-of-xgboost-partii-45384b90d818