본문 바로가기
python

[데이터 분석] 머신러닝 lightgbm로 예측하기

by 포 키 2023. 8. 23.
728x90

 

 

오늘의 포스팅은 lightgbm를 이용해서 회귀에 대해 배워본 것을 정리한다.

사실 어제 내용이지만, 어제는 빅분기 공부로 생각이 많아서 오늘 올린다..! ㅋㅋㅋㅋㅋ

이 부분 역시 교재를 참고했으며, 해당 교재는 파이썬 머신러닝 완벽 가이드(권철민 저) 이다.

책 제목처럼 정말 완벽한 가이드 북이라 구입해서 보는 것을 권장한다!

 

나는 lightgbm이 무엇인지를 몰라서 gpt를 활용해서 물어봤다.

나처럼 lightgbm과 같이 사용하는 프레임 워크나, 라이브러리를 모르겠다면 꼭 찾아보는 것을 추천한다.

가장 좋은 것은 공식 문서를 찾아서 읽어보는 것인데 나는 사용하는 코드부분말고 lightgbm 자체가 무엇인지를 알고싶었기에 gpt를 활용했다.

 

LightGBM(Light Gradient Boosting Machine)은 기계 학습에서 사용되는 오픈 소스 그래디언트 부스팅 프레임워크 중 하나입니다. 그래디언트 부스팅은 앙상블 학습 기법으로, 여러 개의 약한 학습기(weak learner)를 결합하여 강력한 예측 모델을 구축하는 방법입니다.
LightGBM은 Microsoft에서 개발한 프레임워크로, 다른 그래디언트 부스팅 라이브러리들과 비교해 빠른 학습 속도와 높은 성능을 제공하는 특징이 있습니다. 이를 가능하게 하는 몇 가지 기술적인 특징들은 다음과 같습니다:

1. 리프 중심 트리 분할 (Leaf-wise Splitting): LightGBM은 트리를 분할할 때 리프 중심으로 분할을 진행하여 데이터의 분산을 더욱 빠르게 줄일 수 있습니다.
2. 히스토그램 기반 학습 (Histogram-based Learning): 데이터의 히스토그램을 구성하여 구간별로 데이터를 묶고 이를 이용하여 효율적으로 분할을 수행합니다. 이로써 메모리 사용량과 연산량을 줄이면서 학습 속도를 높일 수 있습니다.
3. 리프 중심 학습 (Leaf-wise Learning): 학습을 할 때 리프 노드부터 예측 오차를 줄이도록 진행하여, 좀 더 빠른 학습 속도와 더 작은 메모리 사용량을 달성할 수 있습니다.
4. 카테고리 특성 처리 (Categorical Feature Handling): LightGBM은 카테고리형 특성을 효율적으로 처리할 수 있는 기능을 제공하여, 미리 정수로 변환하지 않고도 카테고리 데이터를 직접 사용할 수 있습니다.

LightGBM은 텍스트 분류, 이미지 분류, 회귀 등 다양한 문제에 대해 높은 예측 성능을 제공하며, 파라미터 튜닝을 통해 다양한 시나리오에 적용할 수 있습니다.

한마디로 표현하자면, 여러개의 학습을 결합해 더 좋은 예측 모델을 가진 프레임워크이다.

 


이제 머신러닝 코드로 들어가서 살펴보자

현재 lightgbm의 최신버전은 4.0.0이다.

그러나 이 버전은 stable 한 버전이 아니고, 책의 예제를 참고하기 때문에 안정화된 3.3.2 버전을 사용할 것이다.

항상 우리가 사용할 라이브러리 같은 것은 주기적으로 업데이트 되고, 많은 것이 내포되어 있기 때문에 공식문서를 꼭 보자

https://lightgbm.readthedocs.io/en/stable/

 

Welcome to LightGBM’s documentation! — LightGBM 4.0.0 documentation

© Copyright 2023, Microsoft Corporation. Revision d73c6b53.

lightgbm.readthedocs.io

 

0. 초기 세팅

내가 사용할 버전에 맞도록 설치해준다.

!pip install lightgbm==3.3.2

 

그리고 가장 중요한 것!!! 주피터 환경이라면 런타임을 꼭 재실행 해줘야 한다.

그렇기에 나는 하나의 코드를 더 추가했다. 왜냐하면 이 코드도 런타임 재실행이 필요하다!

바로 시각화할 그래프에 한글을 적용시키는 코드이다.

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

 

마지막으로 런타임 재실행 후, 버전에 맞게 설치된건지 확인해주자

import lightgbm
lightgbm.__version__

 

한글도 잘 표현되는지 알아봐주자

import matplotlib.pyplot as plt
plt.rc("font", family="NanumGothic") # 라이브러리 불러오기와 함께 한번만 실행

plt.plot([1, 2, 3])
plt.title("한글")
plt.show()

 

그리고 나는 코랩에서 진행해서 구글 드라이브와 연동시켜줬다!

참고로 굳이 코드 안치고 옆의 메뉴바에서 아이콘만 눌러도 된다. 귀찮게 코드 안쳐도 된다는 말!! ㅋㅋㅋㅋㅋ

from google.colab import drive
drive.mount('/content/drive')

 

1. 라이브러리 불러오기 & 환경설정

라이브러리들을 import 해주자

# 232 페이지
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')

뒤에 warning이 뜨는 구간이 있는데 오류는 아니라서 굳이 띄우지 말라는 코드도 작성해준다.

 

2. 데이터 셋 불러오기

우리가 쓸 데이터셋을 가져와준다.

dataset = load_breast_cancer()
X_features = dataset.data # 독립변수
y_label = dataset.target # 종속변수

# 지도학습, 종속변수 존재 (분류) > 초급, 입문자
# 비지도학습, 종속변수 존재하지 않음 (분류 : 클러스터링) > 중급이상

cancer_df = pd.DataFrame(data = X_features, columns=dataset.feature_names)  # 독립변수
cancer_df['target'] = y_label # 종속변수
cancer_df.head()

 

3. 데이터 분리

# 종속변수와 독립변수로 분리
X_features = cancer_df.iloc[:,:-1] # 마지막 컬럼 제외 후, 나머지 컬럼 가져오기
y_label = cancer_df.iloc[:,-1] # 마지막 컬럼만 가져오기

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

 

4. 모델링

  • 사이킷런 래퍼 형태로 진행한다.
# 251 페이지
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)

 

5. 예측

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

 

6. 평가

오차행렬의 결과를 보여준다.

# 237 페이지
get_clf_eval(y_test, preds, pred_probs)

from lightgbm import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline

fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(labm_wrapper, ax=ax)
정확도: 0.9474, 정밀도: 0.9342, 재현율: 0.9861, F1: 0.9595, AUC:0.9818

결과를 보면 재현율이 매우 높은 것을 알 수 있다. 재현율이 높을수록 좋은 예측이다!

 

728x90