본문 바로가기
Machine Learning/scikit-learn

[앙상블 학습] LightBGM

by ISLA! 2023. 8. 22.

 

LightBGM

  • LightBGM의 가장 큰 장점은 XGBoost보다 학습에 걸리는 시간이 적다는 점
  • 메모리 사용량도 상대적으로 적음
  • XGBoost과 예측 성능에 별 차이가 없으며, 오히려 기능상 다양성이 약간 더 많음
  • 단점 한 가지는, 적은 데이터 세트(일반적으로 10,000건 이하)에 적용할 경우 과적합이 발생하기 쉽다는 점
  • 균형 트리 분할이 아닌, 리프 중심 트리 분할 방식 ➡ 예측 오류 손실 최소화

 

  • 카테고리형 피처의 자동변환과 최적 분할 ➡ 원-핫 인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행
  • 실제로 레이블 인코딩 / 원-핫 인코딩 각각을 쓰는 경우, 드라마틱한 차이는 없으므로 크게 신경쓰지 않아도 됨.
  • Null 값도 자동적으로 처리하므로 간편! (XGBoost, LightGBM)
  • 대용량 데이터에 대한 뛰어난 예측 성능 및 병렬 컴퓨팅 기능

 

 

LightBGM 종류

 

  • 분류를 위한 LGBMClassifier
  • 회귀를 위한 LGBMRegressor

 

LightBGM 하이퍼 파라미터 튜닝 방안

 

  • 리프 노드가 계속 분할되면서 트리의 깊이가 깊어지므로 이러한 트리 특성에 맞는 하이퍼 파라미터 설정이 필요함
  • 아래는 주요 파라미터이며 사이킷런 래퍼 방식에서 쓰이는 것을 기록
n_estimators 트리 개수
learning_rate 학습률; 0~1 사이
max_depth 디폴트 : -1 로, 깊이에 제한 없음을 의미
min_child_samples 결정 트리의 min_samples_leaf와 같음
num_leaves 하나의 트리가 가질 수 있는 최대 리프 수
boosting * 부스팅 트리 생성 알고리즘
- gbdt : 일반적인 그래디언트 부스팅 결정 트리
- rf : 랜덤 포레스트가 있음
bagging_fraction(= subsample ; 사이킷런 래퍼) * 데이터를 샘플링하는 비율
* 사이킷런 GBM, XGBMClassifier의 subsample 파라미터와 동일
colsample_bytree * 개별 트리를 학습할 때마다 무작위로 선택하는 피처 비율
* 과적합을 막기 위해 사용됨
reg_lambda * L2 regulation 제어를 위한 값
* 피처 개수가 많을 경우 적용을 검토하며, 값이 클수록 과적합 감지 효과가 있음
reg_alpha * L1 regulation 제어를 위한 값
* L2 와 마찬가지로 과적합 제어를 위한 것
objective * 최솟값을 가져야 할 손실함수 정의
- XGBoost의 objective 파라미터와 동일

 

🧐 num_leaves 개수를 중심으로 min_child_samples(min_data_in_leaf), max_depth를 함께 조정하면서 모델 복잡도를 줄이는 것이 기본 튜닝 방안

 

  • num_leaves : 개별 트리가 가질 수 있는 최대 리프 수, 개수를 높이면 정확도가 높아지지만 모델 복잡도도 상승
  • min_data_in_leaf : 보통 큰 값으로 설정하면 트리가 깊어지는 것을 방지
  • max_depth : 명시적으로 깊이의 크기를 제한

🧐 또는 learning_rate를 작게 하면서 n_estimators를 크게 하는 것이 부스팅 튜닝에서 가장 기본적인 튜닝 방안이므로 이를 적용하는 것도 좋음

 

 

예제 : 위스콘신 유방암 예측

환경 설정

import xgboost as xgb
from xgboost import plot_importance

# 이번 예제의 핵심!
from lightgbm import LGBMClassifier

import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

 

데이터셋 불러오기

dataset = load_breast_cancer()
features = dataset.data # 독립변수
labels = dataset.target # 종속변수

cancer_df = pd.DataFrame(data=features, columns=dataset.feature_names)
cancer_df['target'] = y_label

 

데이터 분리

  • 전체 데이터 중, 80%를 학습용 데이터로 20%를 테스트용 데이터로 추출
  • 위의 학습용 데이터를 다시 쪼개, 90%는 학습용, 10%는 검증용으로 분리
X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]

X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size = 0.1, random_state = 156)
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size = 0.1, random_state = 156)

 

모델링(사이킷런 래퍼)

lgbm_wrapper = LGBMClassifier(n_estimator = 400, learning_rate =0.05)

# 조기 중단 수행 가능
evals = [(X_tr, y_tr), (X_val, y_val)]
lbgm_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric='logloss', eval_set = evals,
                 verbose = True)

preds = lbgm_wrapper.predict(X_test)
pred_proba = lbgm_wrapper.predict_proba(X_test)[:, 1]

결과

 

  • 조기 중단으로, 108번 반복까지만 수행하고 학습 종료 확인

 

피처 중요도 시각화

from lightgbm import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline

fig, ax = plt.subplots(figsize = (10, 12))
plot_importance(lgbm_wrapper, ax = ax)

(결과는 생략)

728x90