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
'Machine Learning > scikit-learn' 카테고리의 다른 글
[교차 검증] cross_val_score() (0) | 2023.09.26 |
---|---|
[앙상블] XGBoost 개념과 사이킷런 래퍼 예제 (0) | 2023.08.30 |
[앙상블] 파이썬 래퍼 XGBoost 개념과 예제 (0) | 2023.08.22 |
[앙상블] GBM(Gradient Boosting Machine) (0) | 2023.08.22 |
[앙상블] 랜덤 포레스트 (0) | 2023.08.22 |