[머신러닝 완벽 가이드] 4장_분류 - LightGBM

이경민·2023년 1월 9일
0

📌 LightGBM

✅ 개요

  • XGBoost와 함께 부스팅 계열 알고리즘에서 가장 각광을 받고 있다.

(1) 트리 분할 방식

  • 일반 GBM 계열: 균형 트리 분할 (Level Wise)

    • 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화될 수 있다.

    • 균형 잡힌 트리를 생성하는 이유는 오버피팅에 보다 더 강한 구조를 가질 수 있다고 알려져 있기 때문이다.

    • 균형을 맞추기 위한 시간이 필요하다는 상대적인 단점이 있다.

  • LightGBM: 리프 중심 트리 분할 (Leaf Wise)

    • 트리의 균형을 맞추지 않고, 최대 손실값(max delta loss)을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성된다.

    • 하지만 이렇게 생성된 규칙 트리는 학습을 반복할수록 결국은 균형 트리 분할 방식보다 예측 오류 손실을 최소화 할 수 있다는 것이 구현 사상이다.

(2) LightGBM의 XGBoost 대비 장점

  • 더 빠른 학습과 예측 수행 시간

  • 더 작은 메모리 사용량

  • 카테고리형 피처의 자동 변환과 최적 분할 (원-핫 인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행)

(3) 단점

  • 적은 데이터 세트에 적용할 경우 과적합이 발생하기 쉽다.
    (일반적으로 10,000건 이하의 데이터 세트)

✅ 하이퍼 파라미터

  • 사이킷런 래퍼 LightGBM 클래스와 XGBoost 클래스는 많은 하이퍼 파라미터가 똑같다.

(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 ···

profile
열정 가득한 공간

0개의 댓글