머신러닝

[파이썬 머신러닝 완벽 가이드] - 4.7~4.12장

주니빙 2024. 11. 9. 23:45

4장 분류

 

4.7  LightGBM

LightGBM : 부스팅 계열 알고리즘

XGBoost보다 학습에 걸리는 시간이 훨씬 적으며 메모리 사용량도 적음

 

XGBoost의 장점은 계승하고 단점은 보완하는 방식으로 개발

한 가지 단점은, 적은 데이터 세트에 적용할 경우 과적합이 발생

 

일반 GBM 계열의 트리 분할 방법과 다르게 리프 중심 트리 분할 방식을 사용 ⇒

학습을 반복할수록 균형 트리 분할 방식보다 예측 오류 손실을 최소화 할 수 있다.

 

LightGBM 설치 ⇒ 터미널 열고 해당 코드 입력

pip install lightgbm==3.3.2

 

pip install lightgbm #버전 안적으면 오류 해결

 

LightGBM 하이퍼 파라미터

  • num_iterations [ default = 100]: 반복 수행하려는 트리의 개수를 지정
  • learning_rate [ default = 0.1 ]: 0에서 1 사이의 값을 지정하며 부스팅 스템을 반복적으로 수행할 때 업데이트되는 학습률 값
  • max_depth [default=-1]: 트리 기반 알고리즘의 max_depth와 동일
  • min_data_in_leaf [ default = 20]: 결정 트리의 min_samples_leaf와 같은 파라미터
  • num_leaves [ default = 31 ]: 하나의 트리가 가질 수 있는 최대 리프 개수
  • boosting [default = gbdt ]: 부스팅의 트리를 생성하는 알고리즘을 기술
  • bagging_fraction [ default = 1.0 ]: 트리가 커져서 과적합되는 것을 제어하기 위해서 데이터를 샘플링하는 비율을 지정
  • feature_fraction [ default = 1.0 ]: 개별 트리를 학습할 때마다 무작위로 선택하는 피처의 비율
  • lambda_12 [default = 0.0 ]: L2 regulation 제어를 위한 값
  • lambda_11 [ default = 0.0 ]: L1 regulation 제어를 위한 값

 

Learning Task 파라미터

  • objective : 최솟값을 가져야 할 손실함수를 정의

 

LightGBM 적용 - 위스콘신 유방암 예측

⚠️ 책의 예제에 사용된 LightGBM의 버전은 3.3.2로, 이와 다른 버전을 사용할 경우 책 예제 결과와 조금 다른 결과가 출력 될 수 있음

 

 

4.8  베이지안 최적화 기반의 HyperOpt를 이용한 하이퍼 파라미터 튜닝

지금까지는 하이퍼 파라미터 튜닝을 위해서 사이킷런에서 제공하는 Grid Search 방식을 적용 ⇒

한가지 단점 : 튜닝해야 할 하이퍼 파라미터 개수가 많을 경우 최적화 수행 시간이 오래 걸림

 

XGBoost나 LightGBM은 성능이 매우 뛰어난 알고리즘이지만, 하이퍼 파라미터 개수가 다른 알고리 즘에 비해서 많다 ⇒

때문에 실무의 대용량 학습 데이터에 Grid Search 방식으로 최적 하이퍼파라미터를 찾으려면 많은 시간이 소모

 

베이지안 최적화

목적 함수 식을 제대로 알 수 없는 블랙 박스 형태의 함수에서 최대 또는 최소 함 수 반환 값을 만드는 최적 입력값을 기능한 적은 시도를 통해 빠르고 효과적으로 찾아주는 방식

 

베이지안 최적화를 구성하는 두 가지 중요 요소 : 대체 모델, 획득 함수

대체 모델 : 획득 함수로부터 최적 함수를 예측할 수 있는 입력값을 추천받은 뒤 이를 기반으로 최적 함수 모델을 개선

획득 함수 : 개선된 대체 모델을 기반으로 최적 입력값을 계산

 

베이지안 최적화 단계

  1. 최초에는 랜덤하게 하이퍼 파라미터들을 샘플링하고 성능 결과를 관측
  2. 관측된 값을 기반으로 대체 모델은 최적 함수를 추정
  3. 추정된 최적 함수를 기반으로 획득 함수{Acquisition Function)는 다음으로 관측할 하이퍼 파라미터 값을 계산
  4. 획득 함수로부터 전달된 하이퍼 파라미터를 수행하여 관측된 값을 기반으로 대체 모델은 갱신되어 다시 최적 함수를 예측 추정

이런 방식으로 Step 3와 Step 4를 특정 횟수만큼 반복하게 되면 대체모델의 불확실성이 개선되고 점차 정확한 최적 함수 추정이 가능

 

대체 모델은 최적 함수를 추정할 때 다양한 알고리즘을 사용

⇒ 가우시안 프로세스 & 트리 파르젠 Estimator

 

베이지안 최적화를 머신러닝 모델의 하이퍼 파라미터 튜닝에 적용할 수 있게 제공되는 여러 파이씬 패키지 :

대표적으로는 HyperOpt, Bayesian Optimization, Optuna

 

HyperOpt 사용법 소개  pip를 이용해서 HyperOpt를 설치

pip install hyperopt

 

 

HyperOpt 활용하는 주요 로직

  1. 입력 변수명과 입력값의 검색 공간(Search Space) 설정
  2. 목적 함수{Objective Function)의 실정
  3. 목적 함수의 반환 최솟값을 가지는 최적 입력값을 유추

 

HyperOpt를 사용할 때 유의할 점❗️

다른 패키지와 다르게 목적 함수 반환 값의 최댓값이 아닌 최솟값을 가지는 최적 입력값을 유추한다는 것

 

HyperOpt의 hp 모듈을 이용하여 입력 변수명 입력값의 검색 공간 설정 가능

입력 값의 검색 공간을 제공하는 대표적인 함수들(q는 간격)

  • hp.quniform(label,low,high,q) : label로 지정된 입력값 변수 검색 공간을 최솟값 low에서 최댓값 high까지 q의 간격을 가지고 설정
  • hp.uniform(label,low,high): 초|솟값 low어|서 최댓값 high까지 정규 분포 형태의 검색 공간 설정
  • hp.randint(label,upper): 0부터 최뱃값 upper까지 random한 정숫값으로 검색 공간 설정
  • hp.loguniform(label, low, high): exp(uniform(low, high)값을 반환하며, 반환 값의 log 변환 된 값은 정규 분포 형태를 가지는 검색 공간 설정
  • hp.choice(label,options): 검색값이 문자열 또는 문자열과 슷자값이 섞여 있을 경우 설정. Options는 리스트나 튜플 형태로 제공되며 hp.choice(’tree_criterion' , [’gini’, ’entropy'])과 같이 설정하면 입력 변수 tree_criterion의 값을 ‘gini’ 와 ‘entropy’로 설정하여 입력

 

4.9  분류 실습 - 캐글 산탄데르 고객 만족 예측

산탄데르 고객 만족 예측 데이터 출처:

https://www.kaggle.com/competitions/santander-customer-satisfaction/data

 

Santander Customer Satisfaction

Which customers are happy customers?

www.kaggle.com

❗️early_stopping_rounds 오류 논의하기

산탄데르_고객만족예측.ipynb
0.07MB

 

 

4.10  분류 실습 - 캐글 신용카드 사기 검출

신용카드 사기 검출 데이터 출처:

https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud

 

Credit Card Fraud Detection

Anonymized credit card transactions labeled as fraudulent or genuine

www.kaggle.com

신용카드_사기검출.ipynb
0.33MB

 

 

4.11  스태킹 앙상블

스태킹 : 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 ML 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행

 

[배깅과 및 부스팅과 공통점] 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출

[차이점] 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행

 

스태킹 모델 개념의 다이어그램

 

기본 스태킹 모델을 위스콘신 암 데이터 세트에 적용

import numpy as np

from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

cancer_data = load_breast_cancer()

X_data = cancer_data.data
y_label = cancer_data.target

X_train , X_test , y_train , y_test = train_test_split(X_data , y_label , test_size=0.2 , random_state=0)
# 개별 ML 모델을 위한 Classifier 생성.
knn_clf  = KNeighborsClassifier(n_neighbors=4)
rf_clf = RandomForestClassifier(n_estimators=100, random_state=0)
dt_clf = DecisionTreeClassifier()
ada_clf = AdaBoostClassifier(n_estimators=100)

# 최종 Stacking 모델을 위한 Classifier생성. 
lr_final = LogisticRegression(C=10)

이 경고는 scikit-learn의 AdaBoostClassifier에서 기본 알고리즘으로 사용되는 SAMME.R 알고리즘이 더 이상 권장되지 않으며, 버전 1.6에서 제거될 예정이라는 내용 이를 피하려면 AdaBoostClassifier를 생성할 때 algorithm='SAMME'로 지정해주기

 

# 개별 ML 모델을 위한 Classifier 생성.
knn_clf  = KNeighborsClassifier(n_neighbors=4)
rf_clf = RandomForestClassifier(n_estimators=100, random_state=0)
dt_clf = DecisionTreeClassifier()
# 기본 알고리즘을 SAMME로 설정 (코드 변경)
ada_clf = AdaBoostClassifier(algorithm='SAMME')

# 최종 Stacking 모델을 위한 Classifier생성. 
lr_final = LogisticRegression(C=10)

# 개별 모델들을 학습. 
knn_clf.fit(X_train, y_train)
rf_clf.fit(X_train , y_train)
dt_clf.fit(X_train , y_train)
ada_clf.fit(X_train, y_train)
# 학습된 개별 모델들이 각자 반환하는 예측 데이터 셋을 생성하고 개별 모델의 정확도 측정.
knn_pred = knn_clf.predict(X_test)
rf_pred = rf_clf.predict(X_test)
dt_pred = dt_clf.predict(X_test)
ada_pred = ada_clf.predict(X_test)

print('KNN 정확도: {0:.4f}'.format(accuracy_score(y_test, knn_pred)))
print('랜덤 포레스트 정확도: {0:.4f}'.format(accuracy_score(y_test, rf_pred)))
print('결정 트리 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))
print('에이다부스트 정확도: {0:.4f} :'.format(accuracy_score(y_test, ada_pred)))

 

pred = np.array([knn_pred, rf_pred, dt_pred, ada_pred])
print(pred.shape)

# transpose를 이용해 행과 열의 위치 교환. 컬럼 레벨로 각 알고리즘의 예측 결과를 피처로 만듦.
pred = np.transpose(pred)
print(pred.shape)

 

lr_final.fit(pred, y_test)
final = lr_final.predict(pred)

print('최종 메타 모델의 예측 정확도: {0:.4f}'.format(accuracy_score(y_test , final)))

결론적으로 개별 모델의 예측 데이터를 스태킹으로 재구성해 최종 메타 모델에서 학습하고 예측한 결과, 정확도가 개별 모델 정확도보다 향상됨.

 

4.12  정리

  • 앙상블 기법  : 결정 트리 기반의 다수의 약한 학습기(Weak Learner)를 결합해 변동성을 줄여 예측 오류를 줄이고 성능을 개선, 배깅과 부스팅으로 구분 가능
  • 결정 트리 알고리즘 : 정보의 균일도에 기반한 규칙 트리를 만들어서 예측을 수행
  • 결정 트리 : 다른 알고리즘에 비해 비교적 직관적이어서 어떻 게 예측 결과가 도출되었는지 그 과정을 쉽게 알 수 있다. (단점으로는 균일한 최종 예 측 결과를 도출하기 위해 결정 트리가 갚어지고 복잡해지면서 과적합이 쉽게 발생하는 것)
  • 대표적인 배깅 방식인 랜덤 포레스트 : 수행시간이 빠르고 비교적 안정적인 예측 성능을 제공하는 훌륭한 머신러닝
  • 부스팅 : 학습기들이 순차적으로 학습을 진행하면서 예측이 틀린 데이터에 대해서는 기중치를 부여해 다음번 학습기가 학습할 때에는 이전에 예측이 틀린 데이터에 대해서는 보다 높은 정확도로 예측
  • XGBoost와 LightGBM : 현재 가장 각광을 받고 있는 부스팅 기반머신러닝 패키지
  • 스태킹 : 여러 개의 개별 모델들이 생성한 예측 데이터를 기반으로 최종 메타 모델이 학습할 별도의 학습 데이터 세트와 예측할 태스트 데이터 세트를 재생성히는 기법