본문 바로가기
Learning-driven Methodology/ML (Machine Learning)

[Machine Learning] LightGBM

by goatlab 2022. 10. 4.
728x90
반응형
SMALL

LightGBM

 

https://ek-koh.github.io/data%20analysis/lgbm/

 

LightGBM은 GBM 계열의 트리 분할 방법과 다르게 리프 중심 트리 분할 방식을 사용한다. 기존의 대부분 트리 기반 알고리즘은 트리의 깊이를 효과적으로 줄이기 위한 균형 트리 분할 방식을 사용한다. 리프 중심 트리 분할은 트리의 균형을 맞추지 않고, 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성 된다. 예측 오류 손실을 최소화 할 수 있다.

 

LightGBM의 특징

 

  • 더 빠른 학습과 예측 수행 시간
  • 더 작은 메모리 사용
  • 카테고리형 피처의 자동 변환과 최적 분할
  • 대용량 데이터에 대한 뛰어난 예측 성능 및 병렬 컴퓨팅 기능을 제공
  • 최근에는 GPU까지 지원
  • XGBoost보다 학습에 걸리는 시간이 훨씬 적으며, 메모리 사용량도 상대적으로 적음
  • XGBoost의 장점은 계승하고 단점은 보완하는 방식으로 개발됨

 

LightGBM 하이퍼 파라미터

 

LightGBM 하이퍼 파라미터는 XGBoost와 많은 부분이 유사하다.

 

하이퍼 파라미터 default 기능
Num_iterations 100 반복 수행하려는 트리의 개수를 지정
Learning_rate 0.1 0에서 1사이의 값을 지정 (학습률)
Max_depth 1 트리의 최대 깊이
Min_data_in_leaf 20 트리의 최소 깊이
Num_leaves 31 하나의 트리가 가질 수 있는 최대 리프 개수
boosting gbdt 부스팅의 트리를 생성하는 알고리즘 기술
Bagging_fraction 1.0 데이터 샘플링 비율
Feature_fraction 1.0 개별 트리를 학습할 때마다 무작위로 선택하는 피처 비율
Lambda_l2 0.0 L2 regulation 제어를 위한 값
Lambda_l1 0.0 L1 regulation 제어를 위한 값

 

LightGBM 설치

 

아나콘나 프롬프트를 관리자 권한으로 실행 후 다음 명령어 입력한다.

 

conda install –c conda-forge lightgbm
import lightgbm

print(lightgbm.__version__)

 

위스콘신 유방암 데이터

 

# 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
import warnings

warnings.filterwarnings('ignore')

dataset = load_breast_cancer()

cancer_df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
cancer_df['target']= dataset.target

cancer_df.head(3)

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]
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score
from sklearn.metrics import f1_score, roc_auc_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_proba)
    
    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)
오차 행렬
[[34  3]
 [ 2 75]]
정확도: 0.9561, 정밀도: 0.9615, 재현율: 0.9740,    F1: 0.9677, AUC:0.9877
# 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)
plt.show()

728x90
반응형
LIST