AI,머신러닝

Gradient Boosting (XGBoost, LightGBM, CatBoost 비교)

깨비아빠0 2023. 9. 19. 11:27
728x90
반응형

https://www.geeksforgeeks.org/ml-gradient-boosting/

 

Gradient Boosting in ML - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://zephyrus1111.tistory.com/224

 

20. Gradient Boosting 알고리즘에 대해서 알아보자 with Python

이번 포스팅에서는 Gradient Boosting의 개념과 알고리즘을 소개하며 이를 응용한 Gradient Tree Boosting의 개념과 알고리즘도 소개한다. 그리고 Gradient Tree Boosting 알고리즘을 파이썬으로 직접 구현하는

zephyrus1111.tistory.com

 

Gradient Boosting은 단순하고 약한 모델 세트의 추정치를 결합하여 대상 변수를 정확하게 예측하려 시도하는 알고리즘이다.
모델 결합 시 이전 모델의 손실 함수(loss function)를 경사 하강법(gradient descent)을 사용하여 최소화하기 때문에 gradient boosting이라고 부른다.

 

 

 

경사 하강법 (Gradient Descent)

https://box-world.tistory.com/7 [머신러닝] 경사 하강 알고리즘(Gradient Descent Algorithm)이란 시작하며 이번 포스팅에선 비용 함수(Cost Function)의 비용값을 최소화 하는 파라미터 θ를 찾는 경사 하강 알고리

freeislet.tistory.com

 

 

크로스 엔트로피 (Cross-Entropy)

https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a Understanding binary cross-entropy / log loss: a visual explanation Have you ever thought about what exactly does it mean to use this loss function

freeislet.tistory.com

 

 

정형 데이터(tabular data) 훈련 시 gradient boosting 알고리즘은 매우 높은 성능 발휘

 

  1. 정형 데이터에 트리 기반 알고리즘 유리
  2. 하나의 강력한 트리 모델보다 약한 트리를 결합한 ensemble 모델이 더 좋은 성과
  3. ensemble 모델 중에서도 random forest 같은 bagging 방식보다 boosting 방식, 특히 gradient boosting이 더 높은 성능을 보임

 

 

 

Gradient Boosting 알고리즘 비교

https://towardsdatascience.com/catboost-vs-lightgbm-vs-xgboost-c80f40662924

 

CatBoost vs. LightGBM vs. XGBoost

Which is the best algorithm?

towardsdatascience.com

https://www.kaggle.com/code/nholloway/catboost-v-xgboost-v-lightgbm

 

CatBoost v. XGBoost v. LightGBM

Explore and run machine learning code with Kaggle Notebooks | Using data from IBM HR Analytics Employee Attrition & Performance

www.kaggle.com

 

대표적인 gradient boosting 알고리즘으로는 XGBoost, LightGBM, CatBoost가 있다.

 

 

XGBoost (eXtreme Gradient Boosting)

https://xgboost.readthedocs.io/en/stable/tutorials/model.html

 

Introduction to Boosted Trees — xgboost 1.7.6 documentation

XGBoost stands for “Extreme Gradient Boosting”, where the term “Gradient Boosting” originates from the paper Greedy Function Approximation: A Gradient Boosting Machine, by Friedman. The gradient boosted trees has been around for a while, and there

xgboost.readthedocs.io

https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/xgboost_hyperparameters.html

 

XGBoost 하이퍼파라미터 - Amazon SageMaker

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

L1, L2 정규화(Regularization)

https://junklee.tistory.com/29 L1, L2 Norm, Loss, Regularization? 정규화 관련 용어로 자주 등장하는 L1, L2 정규화(Regularization)입니다. 이번에는 단순하게 이게 더 좋다 나쁘다보다도, L1, L2 그 자체가 어떤 의미

freeislet.tistory.com

 

주요 하이퍼파라미터

모델 성능을 향상시키기 위해서 다음과 같은 하이퍼파라미터 튜닝이 가능하다.

 

정확도, 속도, 과적합 방지를 위한 XGBoost, LightGBM, CatBoost 하이퍼파라미터 비교 (https://towardsdatascience.com/catboost-vs-lightgbm-vs-xgboost-c80f40662924#72c7)

 

  1. eta (default=0.3): 학습률(learning rate). 보통 0.01~0.3
  2. max_depth (default=6): 트리의 최대 깊이. 이 값을 늘리면 모형이 더 복잡해지고 과적합될 가능성이 높음. 0은 제한 없음을 의미.
  3. min_child_weight (default=1): 하위 노드 추가에 필요한 인스턴스 가중치(헤시안)의 최소 합. 트리 파티션 단계에서 리프 노드의 인스턴스 가중치 합이 min_child_weight보다 작은 경우 추가 파티셔닝을 포기한다. 선형 회귀 모델에서 이는 각 노드에 필요한 최소 인스턴스 수를 뜻한다. 값이 클수록 알고리즘이 보수적이 됨(과적합 방지).
    1. 헤시안(hessian): 손실 함수의 2차 미분계수를 의미
    2. 선형 회귀의 손실 함수 $ \frac{1}{2}(y_i-\hat{y_i})^2 $에서 각 $\hat{y_i}$의 2차 미분계수는 1이므로, 모든 관측 데이터(observation)의 헤시안 합은 인스턴스 개수가 됨 (https://stats.stackexchange.com/questions/317073/explanation-of-min-child-weight-in-xgboost-algorithm)
  4. gamma (default=0): 트리의 리프 노드에 추가 파티션을 생성하는 데 필요한 최소 손실 감소. 값이 클수록 알고리즘이 더욱 보수적.
  5. subsample (default=1): 훈련 인스턴스의 샘플 비율. 0.5로 설정한 경우 XGBoost가 데이터 인스턴스 절반을 무작위로 수집하여 트리를 확장함을 뜻한다. 과적합 방지 효과.
  6. lambda (default=1): 가중치의 L2 정규화 항. 손실 함수에 페널티를 추가하여 과적합을 방지하는 역할을 한다. 값이 클수록 더욱 보수적인 모델이 됨.
  7. alpha (defualt=0): 가중치의 L1 정규화 항. 손실 함수에 페널티를 추가하여 과적합을 방지하는 역할을 한다. 값이 클수록 더욱 보수적인 모델이 됨.

 

 

LightGBM (Light Gradient-Boosting Machine)

https://lightgbm.readthedocs.io/en/stable/Features.html

 

Features — LightGBM 4.0.0 documentation

This is a conceptual overview of how LightGBM works[1]. We assume familiarity with decision tree boosting algorithms to focus instead on aspects of LightGBM that may differ from other boosting packages. For detailed algorithms, please refer to the citation

lightgbm.readthedocs.io

https://aldente0630.github.io/data-science/2018/06/29/highly-efficient-gbdt.html

 

Stats Overflow

A Data Scientist's Tech Blog

aldente0630.github.io

https://kicarussays.tistory.com/38

 

[논문리뷰/설명] LightGBM: A Highly efficient Gradient Boosting Decision Tree

LightGBM은 예전에 한 프로젝트에서 정형 데이터 (Table 형태의 데이터) 에 여러 머신러닝 기법들을 적용해보던 중에 발견한 방법이었습니다. CPU만 사용하면서도 GPU를 쓰는 XGBoost보다 훨씬 더 빠르

kicarussays.tistory.com

 

  • 히스토그램 기반 알고리즘을 사용하여 훈련 속도 및 메모리 사용량 최적화
  • Gradient-Based One-Side Sampling(GOSS), Exclusive Feature Bundling(EFB) 기술 사용
  • 데이터 크기가 커질수록 XGBoost의 훈련 시간이 비례해서 늘어나는 반면, LightGBM은 최대 20배 이상 빠르면서도 거의 동일한 정확도를 보여줌

 

Gradient-Based One-Side Sampling (GOSS)

  • 데이터셋의 샘플 수를 줄이는 알고리즘
  • 기울기(gradient)가 작은 데이터 인스턴스는 이미 잘 훈련된 것으로 보고, 이 인스턴스들에 대해서는 무작위 표본 추출을 수행 (gradient가 큰 데이터 인스턴스는 모두 유지)
    • 이 때, 데이터 분포에 미치는 영향을 보정하기 위해서 정보 획득 계산 시 기울기가 작은 데이터 개체에 승수 상수를 적용한다.
    • 구체적으로, 우선 기울기 절댓값에 따라 데이터 개체를 정렬하고 상위 $a \times 100\%$ 개체를 선택한다. 그런 다음 나머지 데이터에서 $b \times 100\%$ 개체를 무작위 표본 추출한다. 그 후 정보 획득을 계산할 때 기울기가 작은 표본 데이터를 상수 $\frac{1-a}{b}$만큼 증폭시킨다.
    • 이렇게 함으로써 원래의 데이터 분포를 많이 변경하지 않고도 훈련이 덜 된 개체에 초점을 보다 잘 맞출 수 있다.
[알고리즘]
  1. 각 instance들의 gradient 계산 및 정렬
  2. gradient 상위 $a \times 100\%$ 만큼의 instance 선택
  3. 남은 instance들 중에서 $b \times 100\%$ 만큼을 무작위로 선택하고, 이 instance들에 상수 $\frac{1-a}{b}$을 곱함
    1. 이 instance들은 모델이 이미 충분히 학습한 데이터지만, 데이터셋의 분포를 유지하기 위해 일부분을 포함시킵니다
    2. $\frac{1-a}{b}$는 트리 Split 과정에서 information gain을 계산할 때 가중치를 곱해주는 역할을 합니다
    3. $b$의 값이 적을수록 큰 가중치를 곱해주게 됩니다
    4. 이를 통해 원래 데이터셋의 분포를 크게 변화시키지 않고 데이터셋의 크기를 줄일 수 있습니다
  4. 선택한 instance들로 GBDT 생성

 

Exclusive Feature Bundling (EFB)

  • 피쳐 수를 줄이는 알고리즘
  • 고차원 데이터는 보통 매우 희소한데, 이는 손실이 거의 없이 하나로 묶을 수 있는 가능성을 제기한다.
    • 희소 피쳐 공간(sparse feature space)에서는 많은 피쳐들이 상호 배타적으로, 0이 아닌 값을 동시에 갖지 않는다.
    • 이 배타적인 피쳐들을 하나의 피쳐로 안전하게 묶을 수 있으며, 이를 exclusive feature bundle이라 한다.

 

  • Greedy Bundling 단계에서 기존 피쳐들을 어떻게 새로운 EFB로 묶을지 결정 (알고리즘 3)
    • 먼저 변마다 가중치가 있는 그래프를 구성한다. 이 가중치는 변수 간 총 충돌 횟수에 해당한다.
    • 그 다음 그래프 내 꼭짓점 차수에 따라 내림차순으로 변수를 정렬한다.
    • 마지막으로 정렬시킨 목록의 각 변수를 확인하면서 작은 충돌이 있는 기존 묶음에 할당하거나 새로운 묶음을 만든다.

 

  • Merge Exclusive Features 단계에서 기존 피쳐 값들을 병합하여 새로운 데이터를 생성 (알고리즘 4)
    • 히스토그램 기반 알고리즘은 피쳐의 연속적인 값 대신 개별 구간을 저장하기 때문에 배타적 피쳐를 각기 다른 구간에 두어 피쳐 묶음을 구성할 수 있다.
    • 이는 피쳐의 원래 값에 오프셋을 더하여 수행할 수 있다. 예를 들어 피쳐 묶음에 피쳐 두 개가 속한다고 가정하자. 원래의 피쳐 A는 [0, 10] 값을 취하고 피쳐 B는 [0, 20] 값을 취한다. 그렇다면 피쳐 B 값에 오프셋 10을 더하여 가공한 피쳐가 [10, 30]에서 값을 취하게 한다.
    • 그 다음, 피쳐 A와 B를 병합하고 [0, 30] 범위의 피쳐 묶음을 사용하여 원래의 피쳐 A와 B를 안전하게 대체할 수 있다.
[알고리즘]


[알고리즘 예시 https://www.youtube.com/watch?v=4C8SUZJPlMY)]

(알고리즘 3 Greedy Bundling)

  • 아래 데이터셋(피쳐 $x_1 \sim x_5$ 5개, 샘플 10개)에서 $x_1, x_2$ 피쳐는 6개 데이터 인스턴스에서 충돌이 발생 (둘 다 0이 아닌 값을 동시에 가짐)
  • $x_2, x_3$은 $I_8$ 한 개의 인스턴스만 충돌이 발생
  • Greedy bundling 알고리즘을 cut-off=0.2로 적용하면 $[(x_5), (x_1, x_4), (x_2, x_3)]$ 3개의 번들로 묶이게 된다.


(알고리즘 4 Merge Exclusive Features)

  • $(x_1, x_4)$ 번들에서 $x_1$ 피쳐의 최대값은 3이므로, $x_1$ 값이 0인 $I_2$ 인스턴스의 $x_{14}$ 값은 3($x_1$ 최대값) + 1(원래 $x_2$ 값) = 4가 된다.

 

주요 하이퍼파라미터

정확도, 속도, 과적합 방지를 위한 XGBoost, LightGBM, CatBoost 하이퍼파라미터 비교 (https://towardsdatascience.com/catboost-vs-lightgbm-vs-xgboost-c80f40662924#72c7)

 

  1. num_leaves (default=31): 한 트리의 초대 리프 개수. 트리 복잡도를 제어하는 메인 파라미터로서, 2^(max_depth)보다 작아야 과적합을 막을 수 있다. 예를 들어, max_depth=7일 때 num_leaves=127 설정은 과적합을 유발하기 쉽고, 70~80 정도일 때 더 나은 정확도를 얻는다.
  2. max_depth (default=-1): 트리 최대 깊이. 데이터 양이 적을 때 과적합을 제어하는 데 사용된다. 0보다 작거나 같으면 깊이 제한 없음을 의미.
  3. min_data_in_leaf (default=20): 한 리프에 있는 최소 데이터 양. 과적합 제어에 사용된다.
  4. feature_fraction (default=1.0): 각 이터레이션(트리)에서 무작위로 선택되는 피쳐 비율. 훈련 속도 향상 및 과적합 방지에 도움을 준다.
  5. bagging_fraction (default=1.0): feature_fraction과 유사하게, 데이터 일부를 무작위로 선택하는 비율. 훈련 속도 향상 및 과적합 방지에 도움을 준다.
  6. lambda_l1 (default=0.0): L1 정규화 항.
  7. lambda_l2 (default=0.0): L2 정규화 항.
  8. min_gain_to_split (default=0.0): 노드 분할을 위한 최소 gain 값.

 

파라미터 튜닝 도움말: https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html

 

Parameters Tuning — LightGBM 4.1.0.99 documentation

num_leaves. This is the main parameter to control the complexity of the tree model. Theoretically, we can set num_leaves = 2^(max_depth) to obtain the same number of leaves as depth-wise tree. However, this simple conversion is not good in practice. The re

lightgbm.readthedocs.io

 

 

CatBoost (Category Boosting)

https://neptune.ai/blog/when-to-choose-catboost-over-xgboost-or-lightgbm

 

When to Choose CatBoost Over XGBoost or LightGBM [Practical Guide]

Compare CatBoost with XGBoost and LightGBM in performance and speed; a practical guide to gradient boosting selection.

neptune.ai

https://www.youtube.com/watch?v=2Yi_Jse_7JQ 

 

  • 예측 시간 및 훈련 시간 빠름, 정확도 우수
    데이터셋 크기가 작고, (GPU 대신) CPU 사용할 경우 XGBoost, LightGBM보다 느릴 수 있다.
  • Ordered Boosting, Ordered Target Statistics 알고리즘 사용
  • 모든 트리 단계에서 같은 criterion 사용해서 분할하여 대칭(symmetric) 트리 구성
  • 범주형, 테스트 데이터를 인코딩 없이 직접 사용 가능
  • 하이퍼파라미터 튜닝 없이 기본값으로도 높은 성능을 보임

 

Ordered Boosting

Gradient boosting은 이전 모델의 gradient를 연속해서 줄이는 방향으로 훈련이 이뤄지는데, 이렇게 만들어진 모델은 작고 noisy한 데이터에 대해 과적합이 발생하기 쉬운 단점이 있다. 훈련에 사용되었던 데이터와 테스트 및 실제 예측에 사용하는 데이터의 분포가 다르기 때문에 발생하는 이슈인데, CatBoost 논문에서는 이를 prediction shift라 칭한다.

Prediction shift를 해결하기 위해 CatBoost에서는 "랜덤하게 재배열한 데이터셋을 순차적으로, 서브셋만 사용하여 gradient를 계산"하는 방식을 사용한다.

(https://youtu.be/2Yi_Jse_7JQ?si=k9pdkDYGlzS8oHQf&t=2648)

 

Ordered Target Statistics

범주형 변수 인코딩에 Target Statistics(Target Encoding) 사용시 Target leakage 이슈가 발생하는데, 이를 해결하기 위한 기법

2023.09.18 - [AI,머신러닝/용어] - Target Encoding - 범주형 변수의 수치형 변환

 

Target Encoding - 범주형 변수의 수치형 변환

https://towardsdatascience.com/dealing-with-categorical-variables-by-using-target-encoder-a0f1733a4c69 Target-encoding Categorical Variables One nice alternative to One-hot encoding your categories towardsdatascience.com 대부분의 머신러닝 알고리

freeislet.tistory.com

 

CatBoost에서는 target leakage를 해결하기 위해 인코딩 값 계산에 해당 데이터의 타겟값은 사용하지 않도록 한다.

Leave-one-out 방식을 떠올릴 수 있지만, 이 방식으로는 target leakage를 방지할 수 없다.
Leave-one-out 방식으로 훈련하여 인코딩된 값이 타겟에 대한 변별력이 높은 것처럼 보이지만 실제로는 그렇지 않은 경우가 발생한다.

(https://youtu.be/2Yi_Jse_7JQ?si=xLcEhx_CfaOJmTer&t=1745)

 

Ordered TS에서는 훈련 데이터셋을 랜덤하게 재배열한 후 순차적으로 데이터 인스턴스의 인코딩 값을 계산하는데, 이 때, 현재 계산중인 데이터 이전의 타겟값만을 사용하여 계산한다.

(https://youtu.be/2Yi_Jse_7JQ?si=R3HY6xSub_NJpHSe&t=1914)

 

트리 분할 (Symmetric Tree)

https://catboost.ai/news/catboost-enables-fast-gradient-boosting-on-decision-trees-using-gpus

 

CatBoost Enables Fast Gradient Boosting on Decision Trees Using GPUs

Gradient boosting benefits from training on huge datasets. In addition, the technique is efficiently accelerated using GPUs. Read details in this post.

catboost.ai

 

CatBoost는 동일한 깊이 단계의 모든 노드에서 동일한 분할 조건을 사용하여 대칭 트리를 구성한다.

대칭 트리를 사용함으로써 다음과 같은 이점이 있다고 한다.

  • Simple fitting scheme
  • Efficient to implement on CPU
  • Ability to make very fast model appliers
  • This tree structure works as a regularization, so it can provide quality benefits for many tasks

 

주요 하이퍼파라미터

정확도, 속도, 과적합 방지를 위한 XGBoost, LightGBM, CatBoost 하이퍼파라미터 비교 (https://towardsdatascience.com/catboost-vs-lightgbm-vs-xgboost-c80f40662924#72c7)

 

  1. learning_rate (defualt=0.03): gradient 단계에서 모델 가중치가 업데이트 되는 비율. (0~1)
  2. iterations (default=1000): 만들 수 있는 최대 트리 수.
  3. l2_leaf_reg (defualt=3.0): L2 정규화 계수. 양수만 가능.
  4. depth (default=6): 트리 깊이. 16 이하의 정수.
  5. random_strength (default=1): 과적합을 피하기 위해 분할 시 적용할 랜덤 수치.
  6. bagging_temperature (default=1): Bayesian bootstrap 사용시 샘플링 가중치 설정. 1이면 exponential 분포에서 가중치를 샘플링하고, 0이면 모든 가중치는 1이 된다.

 

반응형