TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 머신러닝>

[머신러닝] 분류 - 앙상블 5 : LightGBM

by 기록자_Recordian 2024. 7. 4.
728x90
반응형
시작에 앞서
해당 내용은 '<파이썬 머신러닝 완벽 가이드> 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

앙상블 학습(Ensemble Learning)
 

[파이썬] 분류: 앙상블 학습(Ensemble Learning) - 1

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.앙상블 학습(Ensemble Learning) 

puppy-foot-it.tistory.com

 

 

[파이썬] 분류 > 앙상블 - 3 : GBM

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.앙상블 학습(Ensemble Learning) [

puppy-foot-it.tistory.com

 

 

[파이썬] 분류 > 앙상블 - 4 : XG Boost (1)

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.앙상블 학습(Ensemble Learning) [

puppy-foot-it.tistory.com

▶ XGBoost는 매우 뛰어난 알고리즘이지만, XGBoost에서 GridSearchCV로 하이퍼 파라미터 튜닝을 수행하다보면 수행 시간이 너무 오래 걸려 파라미터를 튜닝하는 데 어려움을 겪는다.

물론 GBM 보다는 빠르지만, 대용량 데이터의 경우 좋은 성능의 CPU 코어를 가진 시스템에서 진행해야 만족할 만한 학습 성능을 기대할 수 있다.


LightGBM

 

LightGBM의 가장 큰 장점은 XGBoost 보다 학습에 걸리는 시간이 훨씬 적고 메모리 사용량도 상대적으로 적다는 점이다.

또한, LightGBM이 XGBoost 보다 2년 후에 만들어지다보니 기능상의 다양성도 많다.

 

[주요 장점 (XGBoost 대비)]

  • 더 빠른 학습과 예측 수행 시간
  • 더 작은 메모리 사용량
  • 카테고리형 피처의 자동 변환과 최적 분할 (원-핫 인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행)

단, 적은 데이터 세트(약 10,000건 이하) 에 적용할 경우 과적합이 발생하기 쉽다.

 

◆ LightGBM은 일반 GBM 계열의 트리 분할 방법과 다르게 리프 중심 트리 분할 방식을 사용한다.

균형 트리 분할(Level Wise): 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화될 수 있다. 또한, 과적합에 보다 더 강한 구조를 가질 수 있으나 균형을 맞추기 위한 시간이 필요하다는 단점이 있다.

리프 중심 트리 분할(Leaf Wise): 트리의 균형을 맞추지 않고, 최대 손길 값(Max delta loss)을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성된다. 그러나 학습을 반복할수록 결국은 균형 트리 분할 방식보다 에측 오류 손싱르 최소화할 수 있다.

 

◆ LightGBM의 파이썬 패키지명은 'lightgbm' 이며, 초기에는 파이썬 래퍼용만 개발되었으나, 사이킷런과의 호환성을 지원하기 위해 파이썬 래퍼 LightGBM이 추가로 개발됐으며, lightgbm 패키지 내에 이 두 개의 래퍼 모듈을 모두 가지고 있다.

 

사이킷런 래퍼 LightGBM 클래스 ▶ 분류: LightGBMClassifier / 회귀: LightGBMRegressor

이 클래스는 사이킷런 기반 Estimator를 상속 받아 작성됐기 때문에 fit(), predict() 기반의 학습 및 예측과 사이킷런이 제공하는 다양한 유틸리티의 활용이 가능하다.


LightGBM 설치

 

LightGBM은 아나콘다를 통해 쉽게 설치할 수 있다.

(단, 윈도우에 설치할 경우 Visual Studio Build Tool 2015 이상이 먼저 설치돼 있어야 한다.)

 

Visual Studio가 설치됐으면 아나콘다 프롬프트를 관리자 모드에서 실행한 후 conda 명령어를 수행한다.

conda install -c conda-forge lightgbm

Proceed ([y]/n)? 이 나오면 y를 누른 후 엔터

 


LightGBM 하이퍼 파라미터

 

LightGBM 하이퍼 파라미터는 XGBoost 와 많은 부분이 유사하나, LightGBM은 XGBoost와 다르게 리프 노드가 계속 분할되면서 트리의 깊이가 깊어지므로 이러한 트리 특성에 맞는 하이퍼 파라미터 설정이 필요하다. (예. max_depth를 매우 크게 가짐)

 

[파이썬 래퍼 LightGBM과 사이킷런 래퍼 XGBoost, LightGBM 하이퍼 파라미터 비교]

유형 파이썬 래퍼 LightGBM 사이킷런 래퍼 LightGBM 사이킷런 래퍼 XGBoost
파라미터 명 num_iterations n_estimators n_estimators
learning_rate learning_rate learning_rate
max_depth max_depth max_depth
min_data_in_leaf min_child_samples N/A
bagging_fraction subsample subsample
feature_fraction colsampe_bytree colsample_bytree
lambda_l2 reg_lambda reg_lambda
lambda_l1 reg_alpha reg_alpha
early_stopping_round ealry_stopping_rounds early_stopping_rounds
num_leaves num_leaves N/A
min_sum_hessian_in_leaf min_child_weight min_child_weight

위스콘신 유방암 예측 (LightGBM 활용)

 

LightGBM 파이썬 패키지인 lightgbm에서 LGBMClassifier를 임포트해 위스콘신 유방암 데이터를 예측한다.

LightGBM 에서도 조기 중단(early stopping)이 가능하다.

(n_estimators는 400, early_stopping_rounds는 50으로 설정하고 학습)

 

# 위스콘신 유방암 예측 (LightGBM 활용)
# lightGBM 파이썬 패키지 lightgbm 에서 LGBMClassifier 임포트
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

dataset = load_breast_cancer()

cancer_df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
cancer_df['target']=dataset.target
X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]

# 전체 데이터 중 80% 학습 데이터, 20% 테스트 데이터
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156)

# 위에서 만든 X_train, y_train을 다시 쪼개 90% 학습, 10% 검증용 데이터 분리
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=156)

# n_estimators 는 400
lgbm_wrapper = LGBMClassifier(n_estimators=400, learning_rate=0.05)

# lightGBM도 XGBoost와 동일하게 조기 중단 수행 가능
evals = [(X_tr, y_tr), (X_val, y_val)]
lgbm_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric='logloss',
                eval_set=evals, verbose=True)
preds = lgbm_wrapper.predict(X_test)
pred_proba = lgbm_wrapper.predict_proba(X_test)[:, 1]

 

※ lightgbm 조기중단 오류

그러나, LGBMClassifier에서 'eary_stopping_rounds' 파라미터를 사용할 수 없다는 에러가 나왔는데,

TypeError: LGBMClassifier.fit() got an unexpected keyword argument 'early_stopping_rounds'


찾아보니, , LightGBM이 4.X로 업그레이드 하면서 API가 많이 바뀌었기 때문이라고 한다.

이럴때는 3.3.2 버전으로 downgrade 하거나, 다운그레이드가 싫다면 다른 방법을 찾아야 한다.

pip install lightgbm==3.3.2

 

 

나는 다수가 추천하는 다운그레이드가 아닌, 4.x 버전에서 새로운 방식으로 분석을 수행하였다.

# 위스콘신 유방암 예측 (LightGBM 활용)
import lightgbm as lgb
# lightGBM 파이썬 패키지 lightgbm 에서 LGBMClassifier 임포트
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

# lightgbm 업데이트로 인한 조기 중단 import
from lightgbm import early_stopping, log_evaluation

dataset = load_breast_cancer()

cancer_df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
cancer_df['target']=dataset.target
X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]

# 전체 데이터 중 80% 학습 데이터, 20% 테스트 데이터
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156)

# 위에서 만든 X_train, y_train을 다시 쪼개 90% 학습, 10% 검증용 데이터 분리
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=156)

# n_estimators 는 400
lgbm_wrapper = LGBMClassifier(n_estimators=400, learning_rate=0.05)

# lightGBM도 XGBoost와 동일하게 조기 중단 수행 가능 (4.0.0 버전)
lgbm_wrapper = lgb.LGBMClassifier()
lgbm_wrapper.fit(
    X_tr, y_tr,
    eval_set=[(X_tr, y_tr), (X_val, y_val)],
    eval_metric='logloss',
    callbacks=[early_stopping(stopping_rounds=50), log_evaluation(period=1)]
)

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

조기 중단으로 78번 반복까지만 수행하고 학습을 종료했다. 새로운 버전에서 또 다른 점은 어떤 것이 가장 최적의 결과를 가져오는지도 알려준다. (해당 분석에서는 28번)

 

LightGBM 4.0.0 버전에서는 조기 중단 기능을 사용하기 위해 콜백(callback)을 활용해야 한다.

이 코드는 early_stopping과 log_evaluation 콜백을 사용하여 조기 중단을 구현한다.

eval_set 파라미터를 사용하여 평가 데이터셋을 지정하고, eval_metric을 통해 평가 지표를 설정한다.

callbacks 파라미터에 조기 중단과 로그 평가 콜백을 추가하여 설정한다.

 

[출처]

 

코드를 실행했는데 오류가 발생합니다 - 인프런

LightGBM 코드를 실행했는데 fit() got an unexpected keyword argument 'verbose' 라는 오류가 발생합니다. 이유가 무엇인지 알 수 있을까요? - 질문 & 답변 | 인프런

www.inflearn.com

https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.early_stopping.html

챗GPT


학습된 LightGBM 예측 성능 평가

 

get_clf_eval() 함수를 이용하여, 예측 성능을 평가

from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix
from sklearn.metrics import f1_score

def get_clf_eval(y_test, pred=None, pred_proba=None):
    confusion = confusion_matrix(y_test, pred)
    accuracy = accuracy_score(y_test, pred)
    precision = precision_score(y_test, pred)
    recall = recall_score(y_test, pred)
    f1 = f1_score(y_test, pred)
    # ROC-AUC 추가
    roc_auc = roc_auc_score(y_test, pred)
    print('오차 행렬')
    print(confusion)
    # ROC-AUC print 추가
    print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f},\
        F1: {3:.4f}, AUC: {4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))

 

get_clf_eval(y_test, preds, pred_proba)


피처 중요도 시각화

 

lightgbm 패키지 역시 피처 중요도를 시각화할 수 있는 내장 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)

 

728x90
반응형