LGBM: Light Gradient Boosting Machine
by 오민- LGBM의 주요 특징은 무엇인가요?
- 다른 Boosting 모델과 비교했을 때, LGBM의 장점이 무엇인가요?
- 어떤 상황에 LGBM을 사용하는 것이 좋을까요?
Microsoft에서 제안한, 병렬 처리 없이도 빠르게 Gradient Boosting을 학습할 수 있도록 하는 모델
- GOSS: Gradient-based One-Side Sampling
- 데이터 샘플의 수를 줄여 학습시간을 단축
- Top N개 데이터 인스턴스와 랜덤 샘플링 데이터 인스턴스만 활용
- 전제 ⇒ 학습이 덜 된 샘플
데이터 인스턴스가 가지고 있는 gradient가 클수록 모델에 큰 변화를 줄 수 있다.
- 따라서, gradient 값이 큰 상위 a%의 샘플은 무조건 선택하고 나머지에서는 무작위로 선택하여 가중치 부여
- 데이터 샘플의 수를 줄여 학습시간을 단축
- EFB: Exclusive Feature Bundling
- 학습에 사용할 feature 수를 줄여서 학습시간을 단축한다.
- 전제 — 현실 데이터에는 상당히 많은 수의 feature가 sparse한 공간을 이루기 때문에, 사실상 feature들끼리 상호배제(mutually exclusive)적인 관계를 이루고 있다.
- 상호배제적인 feature들을 묶어 최적(최소)의 bundle을 구성하고, 이를 하나의 변수로 변환한다.
$$ \tt O(data \times feature)→ O(data\_GOSS \times Bundles) $$
기존의 Tree 기반 알고리즘과는 다르게 동작한다.
- XGBoost — 균형 트리 분할(Level Wise) 방식
- LightGBM — 리프 중심 트리 분할(Leaf Wise) 방식
- Leaf Wise
트리의 균형을 맞추지 않고 **최대 손실 값(Max data loss)**를 가지는 leaf 노드를 지속적으로 분할
⇒ Tree의 깊이(depth)가 깊어지고 비대칭적인 트리가 생성된다.- 데이터의 크기가 작은 경우, 과적합되기 쉽다.
- 데이터의 개수가 10,000개 이상인 경우 좋다.(경험적)
- 하지만, 최대 손실값을 가지는 leaf node를 반복할수록 균형 트리 분할(Lever wise) 방식보다 예측 오류 손실을 최소화 할 수 있다.
성능 자체를 강화하는데 목적을 둔다.
- 편차를 낮추기 위한 목적
- 설명되지 않은 부분을 위주로 뽑아낸다.
- 약한 학습자(weak classifier)에게 적합하게 반복하여 앙상블 모델에 집계
- 다음 기본 모델을 피팅할 때 현재 앙상블 모델의 강점과 약점을 더 잘 교려하도록 훈련 데이터 세트를 업데이트
시퀀스 데이터에도 LGBM을 사용할 수 있다.
다만, 시퀀스 정보를 feature에 녹여낸 후 사용해야 한다.
Hyper-parameter
주요 파라미터
object
options: regression, binary, multiclass...
metric
options: mae, rmse, mape, binary_logloss, auc, cross_entropy, kullbac_leibler...
1. learning_rate
일반적으로 0.01 ~ 0.1 정도로 맞추고 다른 파라미터를 튜닝한다.
나중에 성능을 더 높일 때 learning rate를 더 줄인다.
2. num_iterations
기본값이 100인데 1000정도는 해주는게 좋다.
너무 크게하면 과적합이 발생할 수 있다.
같은 뜻으로 사용되는 옵션
num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, num_boost_round, n_estimators
3. max_depth
1로 설정하면 제한없이 분기한다.
feature가 많다면 크게 설정한다.
파라미터 설정 시 우선적으로 설정한다.
4. boosting
부스팅 방법 default = gbdt
정확도가 중요할때는 딥러닝의 드랍아웃과 같은 dart를 사용한다.
샘플링을 이용하는 goss도 있다.
default = gbdt, options: gbdt, rf, dart, goss
- gbdt : traditional Gradient Boosting Decision Tree, aliases: gbrt
- rf : Random Forest, aliases: random_forest
- dart : Dropouts meet Multiple Additive Regression Trees
- goss : Gradient-based One-Side Sampling
5. bagging_fraction
배깅을 하기위해서 데이터를 랜덤 샘플링하여 학습에 사용한다.
비율은 0 < fraction <= 1 이며 0이 되지 않게 해야한다.
6. feature_fraction
feature_fraction이 1보다 작다면 LGBM은 매 iteration(tree)마다 다른 feature를 랜덤하게 추출하여 학습하게된다.
만약, 0.8로 값을 설정하면 매 tree를 구성할 때, feature의 80%만 랜덤하게 선택한다.
과적합을 방지하기 위해 사용할 수 있으며 학습 속도가 향상된다.
7. scale_pos_weight
클래스 불균형의 데이터 셋에서 weight를 주는 방식으로 positive를 증가시킨다.
기본값은 1이며 불균형의 정도에 따라 조절한다.
8. early_stopping_round
Validation 셋에서 평가지표가 더 이상 향상되지 않으면 학습을 정지한다.
평가지표의 향상이 n round 이상 지속되면 학습을 정지한다.
9. lambda_l1, lambda_l2
정규화를 통해 과적합을 방지할 수 있지만, 정확도를 저하시킬수도 있기 때문에 일반적으로 default 값인 0으로 둔다.
- 더 빠른 속도
- bagging_fraction
- max_bin은 작게
- save_binary를 쓰면 데이터 로딩속도가 빨라짐
- parallel learning 사용
- 더 높은 정확도
- max_bin을 크게
- num_iterations 는 크게하고 learning_rate는 작게
- num_leaves를 크게(과적합의 원인이 될 수 있음)
- boosting 알고리즘 'dart' 사용
- 과적합을 줄이기
- max_bin을 작게
- num_leaves를 작게
- min_data_in_leaf와 min_sum_hessian_in_leaf 사용하기
참고자료
블로그의 정보
OMIN
오민