220925

AIVILLAIN·2022년 9월 25일
0

오공완

목록 보기
13/25

실습 코드

XGBoost 자체적으로 교차 검증, 성능 평가, 피처 중요도 등의 시각화 기능을 가지고 있음
기본 GBM에서 부족한 다른 여러 가지 성능 향상 기능이 있음
수행 속도를 향상시키기 위한 대표적인 기능으로 조기 중단(Early Stopping) 기능이 있음
기본 GBM의 경우 n_estimators(num_boost_rounds)에 지정된 횟수만큼 반복적으로 학습 오류를 감소시키며 학습을 진행하면서 중간에 반복을 멈출 수 없고 n_estimators에 지정된 횟수를 모두 완료해야 함
XGBoost, LightGBM은 모두 조기 중단 기능이 있어서 n_estimators에 지정한 부스팅 반복 횟수에 도달하지 않더라도 예측 오류가 더 이상 개선되지 않으면 반복을 끝까지 수행하지 않고 중지하여 수행 시간을 개선할 수 있음

파이썬 래퍼 XGBoost는 사이킷런과 차이가 여러 가지 있지만 눈에 띄는 차이는 학습용과 테스트용 데이터 세트를 위해 별도의 객체인 DMatrix를 생성함
DMatrix는 주로 넘파이 입력 파라미터를 받아서 만들어지는 XGBoost만의 전용 데이터 세트
주 입력 파라미터는 data와 label
data는 피처 데이터 세트, label은 분류의 경우 레이블 데이터 세트, 회귀의 경우 숫자형인 종속값 데이터 세트

DMatrix는 넘파이 외에 libsvm txt 포맷 파일, xgboost 이진 버퍼 파일을 파라미터로 입력받아 변환할 수 있음
판다스 DataFrame으로 데이터 인터페이스를 하기 위해서는 DataFrame.values를 이용해 넘파이로 일차 변환 뒤 이를 이용해 DMatrix 변환을 적용

파이썬 래퍼 XGBoost 모듈인 xgboost를 이용해 학습을 수행하기 전에 먼저 XGBoost의 하이퍼파라미터 설정
주로 딕셔너리 형태로 입력
파이썬 래퍼 XGBoost는 하이퍼 파라미터를 xgboost 모듈의 train() 함수에 파라미터로 전달
조기 중단은 XGBoost가 수행 성능을 개선하기 위해 더 이상 지표 개선이 없을 경우 num_boost_round 횟수를 모두 채우지 않고 중간에 반복을 빠져 나올 수 있도록 하는 것
early_stopping_rounds 파라미터를 설정하여 조기 중단을 수행하기 위해서는 반드시 eval_set과 eval_metric이 함께 설정되어야 함
Xgboost는 반복마다 eval_set으로 지정된 데이터 세트에서 eval_metric의 지정된 평가 지표로 예측 오류 측정
evasl 파라미터에 학습 데이터 세트와 eval 데이터 세트를 명기해주면 평가를 eval 데이터 세트에 수행하면서 조기 중단 적용 가능

xgboost의 plotimportance() API는 피처의 중요도를 막대그래프 형식으로 나타냄
기본 평가 지표로 f1 스코어를 기반으로 각 피처의 중요도를 나타냄
Estimator 객체의 feature_importances
속성을 이용해 직접 시각화 코드를 작성해야 하나 xgboost 패키지는 plot_importance()를 이용해 바로 피처 중요도를 시각화할 수 있음

GridSearchCV와 유사하게 데이터 세트에 대한 교차 검증 수행 후 최적 파라미터를 구할 수 있는 방법을 cv() API로 제공

사이킷런 래퍼 XGBoost 적용

사이킷런의 기본 Estimator를 그대로 상속하여 만들었기 때문에 다른 Estimator와 동일하게 fit()과 predict() 만으로 학습 예측이 가능하고 GridSearchCV, Pipeline 등 사이킷런의 다른 유틸리티를 그대로 사용할 수 있어 기존 다른 머신러닝 알고리즘으로 만들어놓은 프로그램이 있더라도 알고리즘 클래스만 XGBoost 래퍼 클래스로 바꾸면 기존 프로그램 그대로 사용 가능

하이퍼파라미터 차이

  • eta → learning_rate
  • sub_sample → subsample
  • lambda → reg_lambda
  • alpha → reg_alpha

n_estimators와 num_boost_round 하이퍼파라미터는 서로 동일
조기 중단 관련 파라미터는 fit()에 입력
early_stopping_rounds, eval_metric, eval_set

LightGBM

실습 코드

XGBoost는 매우 뛰어난 부스팅 알고리즘이지만 여전히 학습 시간이 오래 걸림
XGBoost에서 GridSearchCV로 하이퍼파라미터 튜닝을 수행하다 보면 수행 시간이 너무 오래 걸려서 많은 파라미터를 튜닝하기에 어려움을 겪을 수밖에 없음
물론 GBM보다는 빠르지만 대용량 데이터의 경우 만족할 만한 학습 성능을 기대하려면 많은 CPU 코어를 가진 시스템에서 높은 병렬도로 학습해야 함

LightGBM의 가장 큰 장점은 XGBoost보다 학습에 걸리는 시간이 훨씬 적다는 점
LightGBM과 XGBoost의 예측 성능은 별다른 차이가 없음
기능상의 다양성은 LightGBM이 약간 더 많음
한 가지 단점으로 알려진 것은 적은 데이터 세트에 적용할 경우 과적합이 발생하기 쉬움
적은 데이터의 기준은 모호하나 일반적으로 10,000건 이하의 데이터 세트 정도라고 공식 문서에 기술하고 있음
일반 GBM 계열의 트리 분할 방법과 다르게 리프 중심 트리 분할 방식을 사용
대부분의 트리 기반 알고리즘은 트리의 깊이를 효과적으로 줄이기 위한 균형 트리 분할 방식 사용
최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 값이 최소화될 수 있음
균형 잡힌 트리를 생성하는 이유는 오버피팅에 보다 더 강한 구조를 가질 수 있다고 알려져 있기 때문
반대로 균형을 맞추기 위한 시간이 필요하다는 단점이 있음
LightGBM의 리프 중심 트리 분할 방식은 트리의 균형을 맞추지 않고 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성됨
최대 손실값을 가지는 리프 노드를 지속적으로 분할해 생성된 규칙 트리는 학습을 반복할수록 균형 트리 분할 방식보다 예측 오류 손실을 최소화할 수 있다는 것이 LightGBM의 구현 사상
XGBoost 대비 더 빠른 학습, 예측 수행시간, 더 적은 메모리 사용량, 카테고리형 피처의 자동 변환과 최적 분할(카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행)
대용량 데이터에 대한 뛰어난 예측 성능 및 병렬 컴퓨팅 기능 제공
GPU까지 지원하고 있음
XGBoost와 마찬가지로 초기에는 파이썬 래퍼용 LightGBM만 개발되었으나 사이킷런과의 호환성 지원을 위해 사이킷런 래퍼 LightGBM이 추가로 개발되었으며 lightgbm 패키지 내에 이 두개의 래퍼 모듈 모두 가지고 있음

설치

conda install -c conda-forge lightgbm

주요 파라미터

  • num_iterations
    default=100
    반복 수행하려는 트리의 개수
    크게 지정할 수록 예측 성능이 높아질 수 있으나 과적합
    n_estimators와 같은 파라미터
    사이킷런 호환 클래스에서는 n_estimators
  • learning_rate
    default=0.1
    GBM, XGBoost의 learning rate와 같은 파라미터
  • max_depth
    default=-1
    트리 기반 알고리즘의 max_depth와 같음
    leaf wise 기반이므로 깊이가 상대적으로 더 깊음
  • min_data_in_leaf
    default=20
    min_sample_leaf와 같은 파라미터
    사이킷런 래퍼 클래스에서는 min_child_samples
  • num_leaves
    하나의 트리가 가질 수 있는 최대의 리프 개수
  • boosting
    default=gbdt
    gbdt : 일반적인 그래디언트 부스팅 결정 트리
    rf : 랜덤 포레스트
  • bagging_fraction
    default=1.0
    개별 트리 학습 시 무작위로 선택하는 피처의 비율
    과적합 방지
    GBM의 max_features와 유사
    XGBClassifier의 colsample_bytree와 같음
  • lambda_l2
    default=0
    L2 regulation 제어
  • lambda_l1
    default=0
    L1 regulation 제어

Learning Task 파라미터

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

하이퍼파라미터 튜닝 방안

num_leaves의 개수 중심으로 min_child_samples, max_depth를 함께 조정하며 모델의 복잡도를 줄이는 것이 기본 튜닝 방안
learning_rate를 작게 하면서 n_estimators를 크게 하는 것은 부스팅 계열 튜닝에서 가장 기본적인 튜닝 방안이므로 이를 적용하는 것도 좋음

Santander Customer Satisfaction

실습 코드

캐글 산탄데르 고객 만족 데이터 세트에 대해 고객 만족 여부를 XGBoost와 LightGBM 활용하여 예측
target이 1일 경우 불만을 가진 고객, 0인 경우 만족한 고객
ROC-AUC 평가
대부분이 만족이고 불만족 데이터는 일부일 것이기에 ROC-AUC 적합

데이터 다운로드

kaggle competitions download -c santander-customer-satisfaction

성능 평가 기준이 ROC-AUC이므로 eval_metric을 auc로 설정

Credit Card Fraud

실습 코드

캐글의 신용카드 데이터 세트를 이용한 신용카드 사기 검출 분류
데이터 세트의 레이블인 Class 속성은 매우 불균형한 분포를 가짐
0과 1로 분류되는데 0이 정상적인 신용카드 트랜잭션 데이터, 1은 사기 트랜잭션을 의미
전체 데이터의 약 0.172% 레이블만이 1
사기 검출이나 이상 검출과 같은 데이터 세트는 이처럼 레이블 값이 극도로 불균형한 분포를 가짐

언더 샘플링과 오버 샘플링

이상 레이블을 가지는 데이터 건수가 정상 레이블에 비해 너무 적기 때문에 예측 성능 문제 발생 가능
정상 레이블로 치우친 학습을 수행해 제대로 된 이상 데이터 검출이 어려워지기 쉬움
극도로 불균형한 레이블 값 분포로 인한 문제점 해결을 위해 적절한 학습 데이터 확보 방안 필요
오버 샘플링 방식이 성능 상 더 유리한 경우가 많음

언더 샘플링

많은 데이터 세트를 적은 데이터 세트 수준으로 감소시킴
과도하게 정상 레이블로 학습/예측하는 부작용을 개선할 수 있으나 너무 많은 정상 데이터를 감소시키기 때문에 정상 레이블의 경우 오히려 제대로 된 학습을 수행할 수 없다는 단점이 있음

오버 샘플링

이상 데이터와 같이 적은 데이터 세트를 증식하여 학습을 위해 충분한 데이터를 확보하는 방법
동일 데이터를 단순히 증식하는 방법은 과적합이 되기 때문에 의미가 없고 원본 데이터의 피처 값들을 아주 약간만 변경하여 증식
대표적으로 SMOTE(Synthetic Minority Over-sampling Technique) 방법이 있음
적은 데이터 세트에 있는 개별 데이터들의 K 최근접 이웃을 찾아서 이 데이터와 K개 이웃들의 차이를 일정 값으로 만들어 기존 데이터와 약간 차이가 나는 새로운 데이터를 생성
SMOTE를 구현한 대표 파이썬 패키지는 imbalanced-learn
아나콘다를 이용해 설치 가능
conda install -c conda-forge imbalanced-learn

이상치 제거

전체 데이터의 패턴에서 벗어난 이상 값을 가진 데이터
IQR은 사분위 값의 편차를 이용하는 기법
박스 플롯 방식으로 시각화할 수 있음
사분위는 전체 데이터를 값이 높은 순으로 정렬하고 이를 1/4씩으로 구간을 분할하는 것을 지칭
Q1(25%), Q2(50%), Q3(75%), Q4(100%)
이들 중 Q1 ~ Q3 범위를 IQR이라 함
IQR을 이용해 이상치 데이터를 검출하는 방식은 IQR에 1.5를 곱해서 생성된 범위를 이용해 최댓값과 최솟값을 결정한 뒤 최대값을 초과하거나 최솟값에 미달하는 데이터를 이상치로 간주

Q3에 IQR 1.5를 더해서 일반 데이터의 최댓값, Q1에 IQR 1.5를 빼서 일반 데이터의 최솟값 범위 가정
1.5가 아닌 다른 값도 적용할 수 있으나 보통 1.5 적용
이 구간 외의 값을 이상치로 간주

스태킹 앙상블

실습 코드

스태킹은 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출한다는 점에서 배깅 및 부스팅과 공통점을 가짐
가장 큰 차이는 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행
개별 알고리즘의 예측 결과와 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 ML 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 최종 예측을 수행
(데이터 → 여러 모델 학습 → 여러 모델의 예측 출력 데이터 → 별도의 모델 학습 → 예측)
개별 모델의 예측된 데이터 세트를 기반으로 학습하고 예측하는 방식을 메타 모델이라고 함

두 종류의 모델이 필요
개별적인 기반 모델, 개별 기반 모델 예측 데이터를 학습 데이터로 만들어서 학습하는 메타 모델
여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합하여 최종 메타 모델의 학습용 피처 데이터 세트와 테스트용 피처 데이터 세트를 만드는 것이 핵심

현실 모델에 적용하는 경우는 그리 많지 않으나 대회 등에서 높은 순위를 차지하기 위해 조금이라도 성능 수치를 높여야 할 경우 자주 사용됨
스태킹 적용 시 많은 개별 모델 필요

CV 세트 기반 스태킹

과적합 개선을 위해 최종 메타 모델을 위한 데이터 세트를 만들 때 교차 검증 기반으로 예측된 결과 데이터 세트 사용
메타 모델에서 최종 학습 시 레이블 데이터 세트로 학습 데이터가 아닌 테스트용 레이블 데이터 세트를 사용하면 과적합 문제가 발생할 수 있음
개별 모델들이 각각 교차 검증으로 메타 모델을 위한 학습용 스태킹 데이터 생성과 예측을 위한 테스트용 스태킹 데이터를 생성한 뒤 이를 기반으로 메타 모델이 학습과 예측 수행

스태킹 모델의 파라미터 튜닝은 일반적으로 개별 알고리즘 모델의 파라미터를 최적으로 튜닝하는 것을 의미

profile
소신있는 오픈마인드

0개의 댓글