Take action every day.

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) 방식보다 예측 오류 손실을 최소화 할 수 있다.

성능 자체를 강화하는데 목적을 둔다.

  • 편차를 낮추기 위한 목적
  • 설명되지 않은 부분을 위주로 뽑아낸다.
  1. 약한 학습자(weak classifier)에게 적합하게 반복하여 앙상블 모델에 집계
  2. 다음 기본 모델을 피팅할 때 현재 앙상블 모델의 강점과 약점을 더 잘 교려하도록 훈련 데이터 세트를 업데이트

 

시퀀스 데이터에도 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 사용하기

 

참고자료

LightGBM Classifier in Python

[LightGBM] LGBM는 어떻게 사용할까? (설치,파라미터튜닝)

블로그의 정보

OMIN

오민

활동하기