본문 바로가기
멋쟁이사자처럼 AIS7/오늘코드

[1123] 부스팅 3대장과 분류의 평가지표

by YeonGun M 2022. 11. 23.

면접 질문 !

  • Cross Validation은 무엇이고 어떻게 해야하나요?
  • 회귀 / 분류시 알맞은 metric은 무엇일까요?
  • 알고 있는 metric에 대해 설명해주세요(ex. RMSE, MAE, recall, precision …)
  • 정규화를 왜 해야할까요? 정규화의 방법은 무엇이 있나요?
  • Local Minima와 Global Minima에 대해 설명해주세요.
  • 차원의 저주에 대해 설명해주세요
  • dimension reduction기법으로 보통 어떤 것들이 있나요?

부스팅 알고리즘에서의 learning_rate와 n_estimators의 trade-off

learning_rate를 줄인다면 가중치 갱신의 변동폭이 감소해서, 여러 학습기들의 결정 경계(decision boundary) 차이가 줄어들게 됩니다.
n_estimators 를 늘린다면 생성하는 약한 모델(weak learner)가 늘어나게 되고, 약한 모델이 많아진만큼 결정 경계(decision boundary)가 많아지면서 모델이 복잡해지게 됩니다.

즉, 부스팅알고리즘에서 n_estimators와 learning_rate는 trade-off 관계입니다.
n_estimators(또는 learning_rate)를 늘리고, learning_rate(또는 n_estimators)을 줄인다면 서로 효과가 상쇄됩니다.

n_estimator => 순차적으로 생성되기 때문에 학습횟수를 의미합니다.

부스팅 모델은 왜 오버피팅에 민감할까요?
=> 이전 트리(이전 학습)가 다음 트리(다음 학습)에 영향을 주기 때문에

Boosting Top.3

XGBoost

XGBoost란?

  • 현존 머신러닝 모델중 가장 우월한 Gradient Boosting 알고리즘으로 Extreme Gradient Boosting의 약자이다.
    • 극한 변화도(경사도) 부스팅
  • GBM을 분산 환경에서도 실행할 수 있도록 구현되어져 있고, 병렬 학습이 지원이 장점
  • Regression, Classification 문제를 모두 지원함
  • 성능과 자원 효율이 좋아서, 인기 있게 사용되는 알고리즘

XGBoost의 장점

  • GBM 대비 빠른 수행시간 ➡️ 병렬 처리
  • 과적합 규제(Regularization)
    ➡️ 표준 GBM 경우 과적합 규제기능이 없으나, XGBoost는 자체에 과적합 규제 기능으로 강한 내구성을 가짐
  • CART(Classification and regression tree) 앙상블 모델을 사용하여 분류와 회귀 영역에서 뛰어난 예측 성능 발휘
  • 여러개의 의사결정나무들을 조합해서 사용하는 앙상블 알고리즘이다.
  • Early Stopping(조기 종료) 기능이 있음
  • 다양한 옵션을 제공 ➡️ Customizing이 용이하다.
  • Missing Values : 결측치를 내부적으로 처리해준다. 실제로 kaggle에 적용해보는 과정에서 편리함

XGBoost의 단점

  • GBM에 비해 좋은 성능을 보이지만 여전히 느린 학습 시간
  • Hyper Parameter 튜닝을 하게되면 더 오래 걸림
  • 모델의 Overfitting

특징

  • 모든 가능한 트리를 나열하여 최적 트리를 찾는 것은 거의 불가능
  • 2차 근사식을 바탕으로 손실함수를 토대로 하나의 leaf로부터 가지를 늘려나가는 것이 효율적
  • 손실 함수가 최대한 감소하도록 하는 split point(분할점)을 찾는 것이 XGBoost의 목표
  • Hyper Parameter의 종류가 많음

lightgbm

LightGBM 이란?

  • XGBoost에 비해 훈련 시간이 짧고 성능도 좋아 부스팅 알고리즘에서 가장 많은 주목을 받고 있다.
  • GradientBoosting을 발전시킨 것이 XGBoost, 여기서 속도를 더 높인 것이 LightGBM이다.
  • 트리 기준 분할이 아닌 리프 기준 (leaf wise tree) 분할 방식을 사용한다.
    • tree의 균형을 고려하지 않고 최대 손실 값(max data loss)를 가지는 leaf node를 지속적으로 분할하면서 tree의 깊이가 깊어지며 비대칭적인 tree을 생성한다.
    • 최대 손실값을 가지는 leaf node를 반복적으로 분할하는 방식으로 트리 기준 분할 방식보다 예측 오류 손실을 최소화할 수 있다.
  • 학습에 소요되는 시간이 짧고 메모리 사용량도 절약할 수 있어 대용량 데이터 처리가 가능하다.
    • 적은 데이터셋에서 과적합 발생 우려가 있다.

특징

  • 트리 기반 학습 알고리즘을 사용하는 그래디언트 부스팅 프레임워크

  • GBT, GBDT, GBRT, GBM, MART 및 RF를 포함한 다양한 알고리즘을 지원

    • GBDT는 Feature의 차원이 높고 데이터의 크기가 클 경우, 많은 시간을 소비
    • 가능한 모든 분할 지점의 Information Gain을 추정하기 위해 모든 데이터 인스턴스를 탐색
  • GOSS (Gradient based One Side Sampling) 기울기 기반 단측 샘플링

    • 많이 틀린 데이터 위주로 샘플링
    • 행을 줄이는 것
    • 데이터에서 큰 Gradient를 가진 모든 인스턴스를 유지
    • 작은 Gradient를 가진 인스턴스를 무작위로 Sampling을 수행함
    • Gradient가 크다는 것은 잔차값이 크다는 의미
    • 대규모 데이터 인스턴스를 다루기 위한 것
  • EFB (Exclusive Feature Bundling) 배타적 특성 묶음

    • 열을 줄이는 것

    • 대규모 Features 수를 다루기 위한 것

    • 열을 합쳐주면서 다른 의미를 가진 숫자 부여

      feature1 feature2 feature_bundle
      0 2 5
      0 1 6
      3 0 3
      4 0 4

장점

  • 더 빠른 훈련 속도와 더 높은 효율성
  • 적은 메모리 사용량
  • 더 나은 정확도
  • 병렬, 분산 및 GPU 학습 지원
  • 대규모 데이터를 처리

단점

  • 과적합에 민감
  • 작은 데이터에 대해서 과적합 되기 쉬움

CatBoost

Catboost란 ?

  • 2017년 Yandex 에서 개발한 오픈 소스 소프트웨어 라이브러리로
  • GBM의 가장 치명적인 한계점이었던 과적합 문제를 해결함
  • 기존 GBM 계열 XGBoost, LightGBM 알고리즘의 학습 속도 저하 문제를 개선
  • 기존 GBM모델의 Hyper-parameter에 따라 성능이 달라지는 민감한 문제도 함께 개선

CatBoost의 장점

  • GBM의 한계점을 극복
  • XGBoost보다 예측 속도가 8배 빠름
  • 시계열 데이터를 효율적으로 처리한다.
  • 비대칭 데이터도 class_weight 파라미터 조정을 통해 예측력을 높일 수 있음
  • 하이퍼 파라미터 튜닝을 알고리즘 내부에서 처리하기 때문에 사용자가 지정해주지 않아도 모델이 잘 작동
  • 범주형 기능에 대한 기본 처리
  • 빠른 GPU
  • 모델 및 기능 분석을 위한 시각화 및 도구
  • 빠른 실행을 위해 무시 트리 또는 대칭 트리 사용
  • 과적합을 극복하기 위해 순서가 있는 부스팅 사용

CatBoost의 단점

  • Sparse Matrix의 처리
    • 결측치가 매우 많은 데이터셋에는 부적합​
  • 수치형 변수가 매우 많은 데이터일 경우 LightGBM 보다 학습 속도가 오래 걸림

실습

데이터 타입 변환
LightGBM, CatBoost에서는 범주형 피처를 인코딩 없이 사용할 수 있음

train[cat_col] = train[cat_col].astype("category")
test[cat_col] = test[cat_col].astype("category")

원핫인코더

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(handle_unknown="ignore")
# train 에서 ohe 을 할 때는 y값은 제외하고 인코딩 해주세요!
train_ohe = ohe.fit_transform(train.drop(columns="y"))
test_ohe = ohe.transform(test)
train_ohe.shape, test_ohe.shape
# Hold-out-valiation을 위해 train 값으로 나누기
# X, y
X = train_ohe
y = train["y"]
X.shape, y.shape




Q. 다수의 피처가 0, 1로만 구성되어 있는게 인코딩을 하는 이유가 있나요?
A. OneHotEncoder 에서 전부 인코딩을 해준 것인데 성능을 비교해 보니 이렇게 인코딩하는것이 범주형 데이터만 인코딩했을 때보다 나아서 인코딩했습니다.

Q. 배깅 모델은 시각화가 어려워 3rd party 도구를 따로 설치해야 시각화 가능합니다. 그것도 개별 트리를 시각화 하는 것은 어렵습니다. 그런데 부스팅 모델은 왜 시각화가 가능할까요?
Untitled
A. 배깅 모델은 병렬적으로 트리를 여러 개 생성하지만, 부스팅 모델은 순차적으로 생성하기 때문입니다.


Category 타입 데이터를 전처리하지 않고도, lightGBM, CatBoost 에서 인코딩없이 사용할 수 있다

cat_col = train.select_dtypes(include="object").columns
train[cat_col] = train[cat_col].astype("category")
test[cat_col] = test[cat_col].astype("category")



투표를 많이 받은 노트북 따라해보세요!

분류의 평가지표

지난 TIL 복습

  • accuracy, precision, recall, f1-score(조화평균) 등
  • 정확도(Accuracy), 정밀도(Preicision), 재현율(Recall), F1 Score 모두 0~1 사이의 값을 가지며, 1에 가까워질수록 성능이 좋음

정확도(Accuracy, 정분류율)

  • 전체 데이터(Total=TP+TN+FN+FP) 중에서 모델이 모두 정확하게 맞춘(TP+TN) 비율
  • 단점 : 불균형한 데이터(imbalanced data)의 경우에는 정확도는 적합한 지표가 아님

정밀도(Precision)

  • 모델의 예측된 양성 결과(TP + FP)에서 실제 양성 값(TP)의 비율
  • 정밀도(Precision)는 양성(Positive) 예측 성능을 더욱 정밀하게 측정하기 위한 평가 지표
    => FP 를 낮추는 데 초점

재현율(Recall) = 민감도(Sensitivity)

  • 모델(분석모형)의 실제 양성 값(TP + FN)에서 예측 양성 값(TP)의 비율
  • 실제 양성인 데이터를 음성으로 잘못 판단하게 되면 업무상 큰 영향이 있는 경우에 중요한 지표
  • 재현율(Recall)을 높이기 위한 방법
    1. 실제 양성 값들 중, 맞게 예측하는 예측 양성 값을 증가(TP 값 증가)
    2. 실제 양성 값들 중, 잘못 예측하는 예측 음성 값을 감소(FN 값 감소)

Precision vs. Recall

  • 공통점: TP(True Positive) 값을 높이는 것
  • 차이점: 바라보는 관점과 그에 해당하는 음성 값(FP/FN)
  • Trade-off(트레이드-오프 관계) : 차이점으로 상호 보완적이지만 한쪽이 증가하면 다른 한쪽이 떨어지기 쉬운 관계

F1 Score

  • 정밀도(Preicision)와 재현율(Recall)을 결합하여 만든 지표
  • 둘이 어느 한쪽으로 치우치지 않는 수치를 나타낼 때, F1 Score 는 높은 값을 가짐

Confusion Matrix

그 무엇보다 닉값을 잘합니다.

참고 링크
Untitled
TN(True Negative, Negative Negative)

  • 실제는 임신이 아니고(0), 임신이 아닌 것(0)으로 잘 예측함.
  • FP(False Positive, Negative Positive)*
  • 실제는 임신이 아닌데(0), 임신(1)로 예측함.
  • FN(False Negative, Positive Negative)*
  • 실제는 임신인데(1), 임신이 아닌 것(0)으로 예측함.
  • TP(True Positive, Positive Positive)*
  • 실제는 임신인데(1), 임신(1)으로 잘 예측함.

Untitled
틀린걸 맞다고 하면 1종오류, 맞은걸 틀리다 하면 2종오류

  • 모르는걸 아는거로 거짓말 했다 : 1단계 정도로 혼남
  • 아는데 모르는거로 거짓말 했다 : 2단계 호되게 혼남



Q. 혼돈행렬이 왜 필요할까?
혼동행렬이 필요한 이유는 불균형 데이터에서 accuracy 지표가 가지는 맹점 때문에 Precision과 Recall 지표가 필요하기 때문입니다. 만약에 내가 만든 모델이 특정 질병을 탐지하는 모델이라고 할때 실제로 만들어진 모델이 전부 병에 걸렸다고 판단하는 멍청한 모델이 만들어졌다해도, 실제 샘플 데이터가 100만개가 질병이 걸린 사람의 샘플이고 10개만 질병이 걸리지 않은 사람의 샘플이라면 99.99프로로 내가 만든 모델이 정확하게 작동하는 것 처럼 보일 수도 있습니다. 따라서 이런 Accuracy의 맹점을 보완하기위해 Precision과 Recall 같은 지표가 필요하게 됩니다!



Precision & Recall

Untitled
예프리, 실리콜
예측값이 1인 것을 기준으로 하는 계산 => Precision
실제값이 1인것을 기준으로 하는 계산 => Recall

댓글