[오늘의 공부]
오늘은 Gradient Boosting 중 내가 가장 좋아하고 자주 사용했던 LGBM(Light Gradient Boosting Machine, 이하 lgbm)에 대해 공부해보고자 한다.
▶ LGBM(Light Gradient Boosting Machine)이란?
전통적인 gbm은 모든 피처, 객체들에 대해 스캔을 하고 그레디언트를 측정함. 그래서 시간이 오래 걸림.
xgboost는 전체를 버켓이라는 단위로 나눠 그 버켓 안에서 탐색을 최적의 대안을 찾음.
lgbm에서 모든 데이터 포인트를 스캔하지 않기 위해 Gradient-based One-Side Sampling(GOSS)을 통해 완화하며 모든 피처들을 효율적으로 사용하기 위해 Exclusive Feature Bundling(EFB)를 사용함.
1) GOSS(데이터 세트의 샘플 수를 줄임)
개별적인 객체들에 대해서 그레디언트를 기준으로 높은 값부터 낮은 값까지 정렬을 함. 높은 그레디언트는 보존하고 전부 사용함. 낮은 그레디언트는 랜덤하게 샘플링을 진행함.
2) EFB(데이터 세트의 피처 수를 줄임)
모든 변수들을 전부 탐색하는게 오래걸리니까 exclusive feature bundling이라는 방법을 제안함.
EFB는 2가지 절차에 의해 수행을 하게 됨.
1) greedy bundling: 현재 존재하는 피처 세트들에 대해서 어떠한 피처들을 하나의 번들로 묶을 것인지 결정함.
- 번들을 찾는 것은 변수들 간의 그래프를 그려 확인하며, 노드는 피처 / 엣지는 두 피처들 간의 conflict(상호배타적이지 않은)로 정의함. 여기서 conflict(상호배타적이지 않은)이 많은 경우 중복이 많아 번들로 묶으면 안됨.
- 아래 그림을 보면, 10개의 인스턴스, 5개의 변수가 있다고 가정함.
- 그래프를 그리기 위해 두 노드 사이에 엣지의 강도를 정함. 강도를 정할때에는 두 변수가 동시에 0이 아닌 객체의 수로 정의함.
- d의 경우 degree로 엣지의 강도를 더한 수치임.
- 그래프의 시작점은 degree의 내림차순부터 시작함.
- 예제에서 cut-off(하이퍼파라미터) = 0.2로 0.2* N(인스턴스수=10)을 하여 2 이상인 것들은 다 잘라야 하며 결과는 다음과 같음. 따라서 기존의 5개의 변수가 번들링 되어 3개로 바뀜.
- 이 결과를 표로 다시 표현함.
2) merge exclusive features: 실질적으로 번들링이 되어야 하는 변수들을 이용하여 하나의 변수로 값을 표현하는 과정임.
- offsets을 더한다고 하는데 이 뜻은 번들링을 하기 위한 대상이 되는 변수에 원래 기준이 되는 변수가 가질 수 있는 최대값을 더한다는 의미임.
- 위 그림을 보면 x1과 x4과 번들링 되어 있는데 x1을 기준이라고 설정하며, x1과 x4의 수를 봐서 x1의 수가 있고 x4의 수가 0이면 x1의 값을 그대로 진행하고 x4의 수가 있고 x1의 수가 0이면 x1의 가질 수 있는 최대값을 x4의 수에 더해 합산함.
- 기준변수가 수를 가지고 있는데 다른 수도 나와 있거나 동시에 0이면 conflict(상호배타적이지 않은)이 일어나 x1의 값을 그대로 가져옴.
- 번들링 내 변수가 3개면 1에 대한 offset + 2에 대한 offset + 실제값으로 진행함.
lgbm은 GOSS, EFB라는 새로운 알고리즘을 통해서 데이터셋의 크기를 줄이고, 수행 속도를 큰 폭으로 높임.
▶ LGBM(Light Gradient Boosting Machine)장점
lgbm의 leaf wise 트리 분할 방식은 트리의 균형을 고려하지 않고 최대 손실 값을 가지는 leaf node를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 트리가 생성됨.
이와같이 최대 손실값을 가지는 leaf node를 반복 분할하는 방식은 level wise tree분할 방식보다 예측 오류 손실을 최소화할 수 있음.
- 메모리를 적게 차지하고 속도가 빠르면서 정확도 또한 높음.
- 범주형 변수들을 학습시킬 때 원핫인코딩을 하지 않고 그대로 학습시켜 성능이 뛰어남.
- 큰 스케일의 데이터를 다루기 쉬움.
- GPU에서 학습이 가능함.
- 분산, 병렬 학습을 지원함.
▶ LGBM(Light Gradient Boosting Machine) 하이퍼파라미터
파라미터 | default | 설명 |
max_depth | 1 | Tree의 최대 깊이를 뜻하며, 이 파라미터는 모델 과적합을 다룰 때 사용함. |
min_data_in_leaf | 20 | - Leaf가 가지고 있는 최소한의 레코드 수를 뜻함. - 과적합을 해결할 때 사용되는 파라미터임. |
feature_fraction | 1.0 | 개별 트리 학습 시 무작위로 선택하는 feature의 비율을 뜻함. |
bagging_fraction | 1.0 | 데이터 샘플링 비율을 뜻하며, 오버피팅 제어하는데 도움을 줌. |
num_iterations | 100 | 반복 수행하려는 트리의 개수를 뜻함. |
early_stopping_round | 0 | - 이 파라미터는 분석 속도를 높이는데 도움됨. - 모델은 만약 어떤 validation 데이터 중 하나의 지표가 지난 early_stopping_round 라운드에서 향상되지 않았다면 학습을 중단함. |
lambda_l1 | 0.0 | - L1 regulation 제어 |
lambda_l2 | 0.0 | - L2 regulation 제어 |
max_cat_group | 64 | 카테고리 그룹을 max_cat_group 그룹으로 합치고 그룹 경계선에서 분기 포인트를 찾음. |
Task | train | 데이터에 대해서 수행하고자 하는 임무를 구체화함. • train(훈련) • predict(예측) |
application | regression | 모델의 어플리케이션을 정함. • regression(회귀분석) • binary(이진 분류) • multiclass(다중 분류) |
boosting | gdbt | 실행하고자 하는 알고리즘 타입을 정의함. • gdbt : Traditional Gradient Boosting Decision Tree • rf : Random Forest • dart : Dropouts meet Multiple Additive Regression Trees • goss : Gradient-based One-Side Sampling |
learning_rate | 0.1 | - 최종 결과에 대한 각각의 Tree에 영향을 미치는 변수를 뜻함. - 초기의 추정값에서 시작하여 각각의 Tree 결과를 사용하여 추정값을 업데이트하여 이러한 추정에서 발생하는 변화의 크기를 컨트롤 함. |
num_leaves | 31 | - 하나의 트리가 가질 수 있는 최대 리프 개수를 뜻함. |
metric | "" | 성능평가를 뜻함. • l1 : mean absolute error • l2 : mean squared error • rmse : root square loss • binary_logloss : loss for binary classification • multi_logloss : loss for multi classification |
objective | regression | 수치예측이면 regression, 이진분류이면 binary를 사용함. |
scale_pos_weight | 1 | - 이진분류와 다중클래스에서만 사용함. - 양성 레이블에 가중치를 부여함. |
▶ 이 글을 마치며...
LGBM의 경우, 분류 및 예측 문제 사용시 평균 이상의 좋은 성능을 내준다. AI 개발을 처음 접하면서, 이 모델을 사용했었는데 성능이 좋다보니 어떤 문제를 보거나, 모델을 개발하고자 할 때 LGBM을 우선적으로 생각하게 되는 문제가 생겼다. 물론 좋은 성능을 낼 수 있고, 테스트도 할 수 있지만, 내가 직면하고 있는 문제 혹은 개발하고자 하는 서비스/모델을 이해하고, 데이터에 특성에 맞게 모델을 설정하여 테스트하는 것이 가장 효율적이지 않을까 라는 생각을 해본다.
"익숙함에 속아 소중한 것을 잃지 말자"의 글귀처럼 익숙한 것에 속지 말고 항상 도전적으로 분석하고 특성에 맞는 모델을 사용하는 것이 좋은 것 같다.
▶ 참고자료
'개발 관련 공부 > 머신러닝' 카테고리의 다른 글
자연어 처리에 대하여 (1) | 2025.01.09 |
---|---|
CatBoost란? (0) | 2025.01.08 |
XGBoost(Extreme Gradient Boosting)란? (0) | 2025.01.06 |
Gradient Boosting Machine(gbm)란? (4) | 2025.01.04 |
Random Forest(랜덤포레스트)란? (0) | 2024.12.25 |