- 이번 글에서는 이전 글에 이어서 LightGBM에 대해서 알아보고 실습하도록 하겠다.
2023.08.26 - [IT & 개발공부/파이썬(Python)] - 머신러닝 코드 실습 - 부스팅(GBM, XGBoost, LightGBM)
3. LightGBM
- XGBoost는 매우 뛰어나지만, GridSearchCV로 하이퍼 파라미터 튜닝을 수행하다 보면 여전히 학습 시간이 오래 걸리기 때문에 많은 파라미터를 튜닝하기에 어려움을 겪을 수밖에 없다. LightGBM 은 이미 이름에서부터 알 수 있다시피 XGBoost보다 학습에 걸리는 시간이 훨씬 적고 메모리 사용량도 상대적으로 적다. 물론 그로인해 성능이 떨어지는 것도 아니다. 그나마 단점이라고 알려진 것은 적은 데이터 세트에서 과적합 발생이 쉽다는 것이다. 여기서 적은 데이터 세트라는 기준은 애매하지만 일반적으로 1만 건 이하의 데이터 세트 정도라고 공식 문서에서 기술하고 있다. 이러한 장점들 뿐만아니라 카테고리형 피처의 자동 변환과 최적 분할(원 - 핫 인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행)도 장점이다.
- 앞으로 모델링 학습은 사이킷런 래퍼 클래스를 위주로 학습하고자 한다. 사이킷런 래퍼 클래스가 파이썬 래퍼 클래 역할을충분히 수용할 수 있고, 사이킷런 프레임워크와도 잘 통합되기 때문에 사이킷런에 익숙한 사람이라면 별도 파이썬 래퍼 클래스를 사용하지 않아도 되기 때문이다.
* LigthGBM 하이퍼 파라미터(주요 파라미터와 Learning Task 파라미터)
- n_estimators [default = 100] : 반복 수행하려는 트리의 개수를 지정. 크게 지정할수록 예측 성능이 높아질 수 있으나, 너무 크게 지정하면 오히려 과적합으로 성능이 저하될 수 있다.
- learning_rate [default = 0.1] : 0에서 1사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값이다. 일반적으로 n_estimators 를 크게 하고 learning_rate 를 작게 해서 예측 성능을 향상시킬 수 있으나, 마찬가지로 과적합 이슈와 학습 시간이 길어지는 부정적인 영향도 고려해야 한다.
- max_depth [default = 10] : 트리 기반 알고리즘의 max_depth와 같다 0보다 작은 값을 지정하면 깊이에 제한이 없다. Depth wise 방식의 트리와 다르게 LightGBM은 Leaf wise 기반이므로 깊이가 상대적으로 더 깊다
- min_child_samples [default = 20] : 결정 트리의 min_samples_leaf와 같은 파라미터. 최종 결정 클래스인 리프 노드가 되기 위해 최소한으로 필요한 레코드 수이며, 과적합을 제어하기 위한 파라미터
- num_leaves [default = 31] : 하나의 트리가 가질 수 있는 최대 리프의 개수
- boosting [default = gdbt] : 부스팅의 트리를 생성하는 알고리즘
gdbt 는 일반적인 그래디언트 부스팅 결정 트리, rf 는 랜덤 포레스트 - subsample [default = 1.0] : 트리가 커져석 ㅘ적합되는 것을 제어하기 위해 데이터를 샘플링하는 비율을 지정
- colsample_bytree [default = 1.0] : 개별 트리를 학습할 때마다 무작위로 선택하는 피처의 비율. 과적합을 막기 위해 사용된다.
- reg_lambda [default = 0] : L2 정규화 제어를 위한 값. 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.
- reg_alpha [default = 0] : L1 정규화 제어를 위한 값. 과적합 제어를 위한 파라미터.
Learning Task 파라미터
- objective : 최솟값을 가져야 할 손실함수를 정의하는 파라미터. 회귀, 다중 클래스 분류, 이진 분류인지에 따라 손실함수가 지정된다.
* 하이퍼 파라미터 튜닝 방안
- num_leaves 의 개수를 중심으로 min_child_samples, max_depth를 함께 조정하면서 모델의 복잡도를 줄이는 것이 기본 튜닝 방안이다.
- num_leaves 는 개별 트리가 가질 수 있는 최대 리프의 개수이며 LightGBM 모델의 복잡도를 제어하는 주요 파라미터이다. 일반적으로 num_leaves 의 개수를 높이면 정확도가 높아지지만, 반대로 트리의 깊이가 깊어지고 모델이 복잡도가 커져 과적합 영향도가 커진다.
- min_child_samples는 과적합을 개선하기 위한 중요한 파라미터이다. num_leaves와 학습 데이터의 크기에 따라 달라지지만, 보통 큰 값으로 설정하면 트리가 깊어지는 것을 방지한다.
- max_depth 는 명시적으로 깊이의 크기를 제한한다. 앞에 말한 두 파라미터와 결합하여 과적합을 개선하는 데 사용
- learning_tate 를 작게 하면서 n_estimators를 크게 하는 것은 부스팅 계열 튜닝에서 가장 기본적인 튜닝 방안이므로 이를 적용하는 것도 좋다. 물론 n_estimators를 너무 크게 하는 것은 과적합으로 오히려 성능이 저하될 수 있음을 유의해야 한다.
- 이 밖에 reg_lambda, reg_alpha와 같은 정규화를 적용하거나 학습 데이터에 사용할 피처의 개수나 데이터 샘플링 레코드 개수를 줄이기 위해 colsample_bytree 나 subsample 파라미터를 적용해볼 수도 있다.
★ 실습
- 이전 글에서 사용한 위스콘신 유방암 데이터 세트를 이용하여 이번에는 LightGBM으로 예측을 수행해보겠다. 이 실습에서 사용된 버전은 3.3.2이므로 이와 다른 버전을 사용할 경우 결과가 달라질 수 있음을 먼저 알린다.
이전 글과 반복인 부분들은 따로 언급하지 않고 빠르게 지나가도록 하겠다.
1. 라이브러리 불러오기 및 설정
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')
2. 데이터 불러오기 및 분리
# 종속변수와 독립변수로 분리
X_features = cancer_df.iloc[:, :-1] # 마지막컬럼 제외 후, 나머지 컬럼 가져오기
y_label = cancer_df.iloc[:, -1] # 3 마지막컬럼만 가져오기
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=1)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=1)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
X_train.shape, X_tr.shape, X_val.shape, X_test.shape
= > (455, 30), (409, 30), (46, 30), (114, 30)
3. 모델링 학습 실시
labm_wrapper = LGBMClassifier(n_estimators=400, learning_rate=0.05)
# 조기 중단 수행 가능
evals = [(X_tr, y_tr), (X_val, y_val)]
labm_wrapper.fit(X_tr, y_tr, early_stopping_rounds = 50,
eval_metric='logloss',
eval_set = evals, verbose=True)
(중략)
- 이번에도 마찬가지로 조기 중단 기능이 활성화되어 193번 까지만 수행하고 학습이 종료되었다.
4. 예측
preds = lgbm_wrapper.predict(X_test)
pred_proba = lgbm_wrapper.predict_proba(X_test)[:, 1]
5. 평가(이전 글에서 사용한 평가 함수)
get_clf_eval(y_test, preds, pred_proba)
6. 피처 중요도 시각화
- XGBoost와 동일하게 피처 중요도 시각화할 수 있는 내장 API가 있으며, 동일하게 plot_importance( )이다.
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)
이 글은 파이썬 머신러닝 완벽 가이드 개정 2판(권철민, 2022)을 일부 참고하여 작성하였습니다.
'IT & 개발공부 > 파이썬(Python)' 카테고리의 다른 글
머신러닝 코드 실습 - 부스팅(GBM, XGBoost, LightGBM) - 1 (0) | 2023.08.26 |
---|---|
머신러닝 코드 실습 - 앙상블 학습(보팅, 배깅) (0) | 2023.08.25 |
데이터를 함수를 이용하여 불러오기(결정 트리 실습까지) (0) | 2023.08.23 |
머신러닝 코드 실습 - 결정트리 & 과적합 (0) | 2023.08.22 |
머신러닝 알고리즘(선형회귀, 결정트리 등) 이해하기 (0) | 2023.08.21 |