(1) 트리 분할 방식
일반 GBM 계열: 균형 트리 분할 (Level Wise)
최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화될 수 있다.
균형 잡힌 트리를 생성하는 이유는 오버피팅에 보다 더 강한 구조를 가질 수 있다고 알려져 있기 때문이다.
균형을 맞추기 위한 시간이 필요하다는 상대적인 단점이 있다.
LightGBM: 리프 중심 트리 분할 (Leaf Wise)
트리의 균형을 맞추지 않고, 최대 손실값(max delta loss)을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성된다.
하지만 이렇게 생성된 규칙 트리는 학습을 반복할수록 결국은 균형 트리 분할 방식보다 예측 오류 손실을 최소화 할 수 있다는 것이 구현 사상이다.
(2) LightGBM의 XGBoost 대비 장점
더 빠른 학습과 예측 수행 시간
더 작은 메모리 사용량
카테고리형 피처의 자동 변환과 최적 분할 (원-핫 인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행)
(3) 단점
(1) 주요 파라미터
n_estimators
: 반복 수행하려는 트리의 개수 지정
learning_rate
: 0에서 1사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값, 일반적으로 n_estimators를 크게 하고 learning_rate를 작게 해서 예측 성능을 시킬 수 있지만 과적합 이슈와 학습 시간이 길어지는 부정적인 영향도 고려해야 한다.
max_depth
: 0보다 작은 값을 지정하면 깊이 제한이 없다. LightGBM은 Leaf Wise 기반이므로 깊이가 상대적으로 더 깊다.
min_child_samples
: 최종 결정 클래스인 리프 노드가 되기 위해서 최소한으로 필요한 레코드 수이며, 과적합을 제어하기 위한 파라미터
num_leaves
: 하나의 트리가 가질 수 있는 최대 리프 개수
boosting
: 부스팅의 트리를 생성하는 알고리즘 지정
gbdt
: 일반적인 그래디언트 부스팅 결정 트리
rf
: 랜덤 포레스트
subsample
: 트리가 커져서 과적합되는 것을 제어하기 위해서 데이터를 샘플링하는 비율을 지정
colsample_bytree
: 개별 트리를 학습할 때마다 무작위로 선택하는 피처의 비율, 과적합을 막기 위해 사용
reg_lambda
: L2 regulation 제어를 위한 값, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.
reg_alpha
: L1 regulation 제어를 위한 값, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.
(2) Learning Task 파라미터
objective
: 최솟값을 가져야할 손실함수를 정의(3) 튜닝 방안
num_leaves
: 모델의 복잡도를 제어하는 주요 파라미터이다. 일반적으로 개수를 높이면 정확도가 높아지지만, 반대로 트리의 깊이가 깊어지고 모델의 복잡도가 커져 과적합 영향도가 커진다.
min_child_samples
: 과적합을 개선하기 위한 중요한 파라미터이다. 보통 큰 값으로 설정하면 트리가 깊어지는 것을 방지한다.
max_depth
: 과적합을 개선하는 데 사용한다.
learning rate
를 작게 하면서 n_estimators
를 크게 한다.
(단, n_estimators를 너무 크게 하는 것을 과적합으로 오히려 성능이 저하될 수 있다.)
reg_lambda
, reg_alpha
: regularization 적용
colsample_bytree
, subsample
: 학습 데이터에 사용할 피처의 개수나 데이터 샘플링 레코드 개수를 줄이기 위해 적용
import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from lightgbm import LGBMClassifier dataset = load_breast_cancer() ftr = dataset.data target = dataset.target # 전체 데이터 중 80%는 학습용 데이터, 20%는 테스트용 데이터 X_train, X_test, y_train, y_test=train_test_split(ftr, target, test_size=0.2, random_state=156) lgbm_wrapper = LGBMClassifier(n_estimators=400) # LightGBM도 XGBoost와 동일하게 조기 중단 수행 가능 evals = [(X_test, y_test)] lgbm_wrapper.fit(X_train, y_train, early_stopping_rounds=100, eval_metric="logloss", eval_set=evals, verbose=True) preds = lgbm_wrapper.predict(X_test) pred_proba = lgbm_wrapper.predict_proba(X_test)[:, 1] # plot_importance( )를 이용하여 feature 중요도 시각화 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) # 피처 순서별로 Column_0, Column_1 ···