호기심 많은 분석가

[Machine Learning] LightGBM, LGBM에 대해 알아보자 본문

Coding/Machine Learning & Python

[Machine Learning] LightGBM, LGBM에 대해 알아보자

DA Hun 2021. 5. 18. 03:25

포스팅 개요

 데이콘(DACON)의 신용카드 사용자 연체 예측 AI 경진대회를 수행하면서 Classify를 위해 LighBGM 기법을 사용하였다.

LightBGM을 쓰기 위해 공부한 내용들을 기록한 포스팅이다.


포스팅 본문

1. Light GBM이란?

 Light GBM(Light Gradient Boosting Machine)은 트리 기반의 학습 알고리즘인 gradient boosting 방식의 프레임워크이다. 

 

2. 다른 트리 기반의 알고리즘과의 차이점은?

 Light GBM은 다른 알고리즘이 트리를 수평으로 확장하는 것에 반해 트리를 수직으로 확장한다. 즉, 기존의 알고리즘은 수평으로 확장하여 포화 트리를 만들고(Level-wise tree growth), left-wise tree growth인 LGBM은 최대 delta loss가 증가하도록 잎의 개수를 정한다. 그렇기에 leaf-wise 알고리즘은 다른 level-wise 알고리즘보다 낮은 loss를 달성하는 경향이 있다. 데이터의 크기가 작은 경우 leaf-wise는 과적합(overfitting)이 되기 쉬우므로 max_depth를 줄여줘야 한다.

Leaf-wise tree growth와 level-wise tree growth 비교 이미지

3. LGBM의 특징이 무엇인가?

 Light GBM의 'Light'에 걸맞게 속도가 빠른 것이 굉장히 큰 장점이다. 또한, 메모리를 적게 차지하고 속도가 빠르다는 장점 외에도, LGBM은 결과의 정확도가 높다는 장점이 있고 GPU를 활용할 수 있기 때문에 널리 사용되고 있다.

 

 하지만, 위에서 언급했듯이 overfitting에 민감하기에 데이터의 크기가 작을 경우 기존의 머신러닝 알고리즘이 더 좋을 수 있다. 데이터의 개수가 10,000개 이상일 때 좋다고 한다.

 

 또 하나의 특징으로는 우리는 모델을 학습시킬 때 범주형 변수들을(Object, Category) 숫자형 변수로 바꾸어서 학습시킨다. 그 방법으로 가장 널리 쓰이는 것이 원핫인코딩인데, 트리 모델에서 high cardinality categorical features(범주의 개수가 많은 변수)를 원핫인코딩하여 넣게 되면 트리가 언밸런스 해지고, 좋은 성능을 내기 위해 더 깊어진다고 한다. 즉, 훈련시키는 데 시간이 더 소요되고 과적합할 위험이 높다.

 이것을 대비하여 LGBM에서는 Category type의 변수도 그대로 학습이 된다. 실제로도 원핫인코딩보다 성능이 뛰어나다고 하니 알아두면 좋을 듯하다.

4. Sample Code
params={'bagging_freq': 1, 'verbosity': -1, 'seed': 42, 'num_threads': -1, 'feature_pre_filter': False,\
        'num_class': 3, 'objective': 'multiclass', 'metric': 'multi_logloss', 'boosting': 'gbdt',\
        'bagging_fraction': 0.7000000000000001, 'feature_fraction': 0.5, 'lambda_l1': 3,\
        'lambda_l2': 5, 'learning_rate': 0.01061132118105835, 'max_depth': -1,\
        'min_child_samples': 10, 'num_leaves': 200}


train_data = lgb.Dataset(X.iloc[i_trn], label=y[i_trn])
clf = lgb.train(params, train_data, n_best, verbose_eval=100)

y_pred = clf.predict(X_test)

 multi class의 변수를 logloss metric으로 결과내는 코드이다. 

5. 하이퍼파라미터

1. learning_rate

 일반적으로 0.01 ~ 0.1 정도로 맞추고 다른 파라미터를 튜닝한다. 나중에 성능을 더 높일 때 learning rate를 더 줄인다.

2. num_iterations

 default는 100인데 1000정도는 해주는게 좋다고 한다. 너무 크게하면 과적합이 발생할 수 있다.

같은 뜻으로 사용되는 옵션 : num_iteration, n_iter, num_tree, num_round, num_rounds, num_boost_round, n_estimators

3. max_depth

 -1로 설정하면 제한없이 분기한다. feature가 많다면 크게 설정한다. 파라미터 설정 시 우선적으로 설정한다.

4. boosting

 부스팅 방법 : 기본값은 gbdt이며 정확도가 중요할 때는 딥러닝의 드랍아웃과 같은 dart를 사용한다. 샘플링을 이용하는 goss도 있다.

gbdt : traditional Gradient Boosting Decision Tree, aliases : gbrt
rf : Random Forest, aliaes : random_forest
dart : Dropouts meet Multiple Additiva Regression Trees
goss : Gradient-based One-Side Sampling

5. bagging_fraction

 배깅을 하기 위해서 데이터를 랜덤 샘플링하여 학습에 사용한다. 비율은 0<fration<=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_12

 정규화를 통해 과적합을 방지할 수 있지만, 정확도를 저하시킬수도 있기 때문에 일반적으로 default 값인 0으로 둔다.

 

  • 더 높은 정확도
    • max_bin을 크게
    • num_iterations는 크게하고 learning_rate는 작게
    • num_leaves를 크게 ( 과적합의 원인이 될 수 있음 )
    • boosting 알고리즘 'dart' 사용
  • 과적합을 줄이기
    • max_bin을 작게
    • num_leaves를 작게
    • min_data_in_leaf와 min_sum_hessian_in_leaf 사용하기