TIL/머신러닝

11.23일 수업 TIL Gradient Boosting Machine (XGBoost, lightGBM,CatBoost )

monawa 2022. 11. 26.
728x90

https://www.kaggle.com/c/mercedes-benz-greener-manufacturing

 

Mercedes-Benz Greener Manufacturing | Kaggle

 

www.kaggle.com

train = pd.read_csv(f'{base_path}/train.csv.zip', index_col="ID")
test = pd.read_csv(f'{base_path}/test.csv.zip', index_col="ID")
submission = pd.read_csv(f'{base_path}/sample_submission.csv.zip', index_col="ID")
벤츠 데이터셋을 불러옵니다 !

train.head()
test.head()

2.타입전환

cat_col = train.select_dtypes(include="object").columns
cat_col

lightGBM, CatBoost 에서는 범주형 피처를 인코딩 없이 사용할 수 있습니다.
따로 범주형 피처를 지정해서 사용할수 있습니다

 

3.Feature Engineering

3-1 원핫 인코딩

from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(handle_unknown="ignore")

train_ohe = ohe.fit_transform(train.drop(columns="y"))


test_ohe = ohe.transform(test)

여기서 (train.drop(columns="y"))을 해주는 이유는  최종적으로 예측해야할 y를 
인코딩하지 않기위해 제외해줍니다 (잊지말자!)

 

3-2 x,y값 나누기

# Hold-out-valiation을 위해 train 값으로 나누기

X = train_ohe
y = train["y"]

 

3-3 학습, 검증 세트 나누기

Hold-out-valiation을 위해 train, valid 세트로 나누기
train_test_split을 이용해 X, y 값을 X_train, X_valid, y_train, y_valid 으로 나눠줍니다.

X_train , X_valid, y_train, y_valid = train_test_split(
    X,y,test_size=0.1,random_state=42)

test_size=0.1 => 이름은 test지만 train으로 나눠주었기 때문에 valid 사이즈를 지정한 것입니다.

 


사이킷런 이외의 모델들

부스팅 3대장  

 xgboost, lightgbm, catboos

이는 

  • GBT에서 단점을 보완하고 개선한 모델
  • 결정트리, 그래디언트 부스팅 트리, 랜덤 포레스트에 비하면 비교적 최신 모델들
    최신 모델이라고 해서 앞에 소개한 모델들을 완전히 대체한다는 것은 아닙니다
  • 소개할 세 모델은 Kaggle이나 Dacon에서 높은 성적을 거두는 참가자들이 많이 사용해왔고 좋은 성과를 보여왔습니다.

1,

XGBoost 모델

  • xgboost는 GBT에서 병렬 학습을 지원하여 학습 속도가 빨라진 모델입니다.
  • GBT에서 병렬 학습을 지원하여 학습 속도가 빨라진 모델입니다.
  • 기본 GBT에 비해 더 효율적이고, 다양한 종류의 데이터에 대응할 수 있으며 이식성이 높습니다.

- 모든 가능한 트리를 나열하여 최적 트리를 찾는 것은 거의 불가능하기 때문에,  2차 근사식을 바탕으로 한 손실함수를 토대로 매 iteration마다 하나의 leaf로부터 가지를 늘려나가는 것이 효율적
- 손실 함수가 최대한 감소하도록 하는 split point(분할점)를 찾는 것이 XGBoost의 목

 

장점  단점
- GBM 대비 빠른 수행시간(병렬 처리)

- 과적합 규제(Regularization)

표준 GBM 경우 과적합 규제기능이 없으나,
XGBoost는 자체에 과적합 규제 기능으로 강한 내구성을 지님

- 분류와 회귀영역에서 뛰어난 예측 성능 발휘(광범위한 영역)

- Early Stopping(조기 종료) 기능이 있음

- 다양한 옵션(Hyper Parameter)을 제공하며 Customizing이 용이
- XGBoost는 GBM에 비해 좋은 성능을 보여주고 비교적 빠르지만 그래도 여전히 학습시간이 느림

- Hyper Parameter 수가 많아 Hyper Parameter 튜닝을 하게되면 시간이 더욱 오래 걸림

- 모델의 Overfitting

XGBoost Parameter

부스팅 파라미터 일반 파라미터 학습과정 파라미터
eval_metri
- 검증에 사용되는 함수정의
- 회귀 분석인 경우 'rmse'를, 클래스 분류 문제인 경우 'error'

  • Learning_rate[ 기본값 : 0.3]
    Learning rate가 높을수록 과적합되기 쉬움

  • n_estimators [기본값 : 100]
    생성할 weaker learner 수, learning_rate가 낮을 땐,
    n_estimators를 높여야 과적합이 방지됨,
    value가 너무 낮으면 underfitting이 되고 이는 낮은 정확성의 prediction이 되는반면
    value가 너무 높으면 overfitting이 되고 training data 에는 정확한 prediction을 보이지만 test data에서는 정확성이 낮은 prediction을 가짐
  • max_depth [ 기본값 : 6 ]
    트리의 maximum depth, 적절한 값이 제시되어야 하고 보통 3-10 사이 값이 적용됨, max_depth가 높을수록 모델의 복잡도가 커져 과적합되기 쉬움
  • min_child_weight [ 기본값 : 1 ]
    관측치에 대한 가중치 합의 최소를 말함, 값이 높을수록 과적합이 방지됨
  • gamma [ 기본값 : 0 ]
    리프노드의 추가분할을 결정할 최소손실 감소값, 해당값보다 손실이 크게 감소할 때 분리, 값이 높을수록 과적합이 방지됨
  • subsample [ 기본값 : 1 ]
    weak learner가 학습에 사용하는 데이터 샘플링 비율, 보통 0.5 ~ 1 사용됨, 값이 낮을수록 과적합이 방지됨
  • colsample_bytree [ 기본값 : 1 ]
    각 tree 별 사용된 feature의 퍼센테이지, 보통 0.5 ~ 1 사용됨, 값이 낮을수록 과적합이 방지됨
  • booster [기본값 = gbtree] 
    어떤 부스터 구조를 쓸지 결정,
    의사결정기반모형(gbtree), 선형모형(gblinear), dart

  • n_jobs 
    XGBoost를 실행하는 데 사용되는 병렬 스레드 수
     -1로 설정 하면 모든 코어사용이 가능합니다.
    Default값은 1 입니다.
  • verbosity [기본값 = 1]
    로그출력여부
    0 (무음), 1 (경고), 2 (정보), 3 (디버그)

  • early_stopping_rounds 
    손실함수 값이 n번정도 개선이 없으면 학습을 중단
  • mse 평균제곱오차
    오차의 제곱을 평균으로 나눈 것
     0에 가까울수록 확도가 높다고 할 수 있다.
    회귀에서 자주 사용하는 손실함수 

  • mae 평균 절대오차
    모든 절대 오차의 평균
    회귀지표로써 사용된다


  • logloss: negative log-likelihood
  • error: Binary classification error rate (0.5 threshold)
  • merror: Multiclass classification error rate
  • mlogloss: Multiclass logloss
  • auc: Area under the curve
  • map (mean average precision)

 

라이브러리 불러오기

# xgboost는 gradient boosting tree(GBT)의 병렬 학습을 구현한 라이브러리입니다.
import xgboost as xgb

model_xgb = xgb.XGBRegressor(random_state=42, n_jobs=1)
model_xgb

시각화

xgb.plot_importance(model_xgb)
# 부스팅 모델은 시각화 가 가능하다!

xgb.plot_tree(model_xgb, num_trees=1)
fig = plt.gcf()
fig.set_size_inches(30, 20)

이렇게 시각화가 가능한 것은 왜냐하면 부스팅 모델은 순차적으로 직렬 실행 되기 떄문이다 

 

예측하는법

y_pred_xgb = model_xgb.predict(X_test)

부스팅은 전처리를 따로 안해줘도 돌아간다!

 


lightgbm 모델

  • XGBoost에 비해 성능은 비슷하지만 학습 시간을 단축시킨 모델이다.
  • XGBoost에 비해 더 적은 시간, 더 적은 메모리를 사용한다.
장점 단점
- 더 빠른 훈련 속도와 더 높은 효율성
- 적은 메모리 사용량
- 더 나은 정확도
- 병렬, 분산 및 GPU 학습 지원
- 대규모 데이터를 처리
- LightGBM은 overfitting (과적합)에 민감하고 작은 데이터에 대해서 과적합되기 쉬움

특징
- GOSS (Gradient based One Side Sampling) 기울기 기반 단측 샘플링
- 데이터에서 큰 Gradient를 가진 모든 인스턴스를 사용해서 무작위로 Sampling을 수행함
- 많이  틀린 데이터 위주로 샘플링
=> 행을 줄입니다.
- 대규모 데이터 인스턴스를 다루기 위한 것

- EFB (Exclusive Feature Bundling) 배타적 특성 묶음
- 대규모 Features 수를 다루기 위한 것
=> 열을 줄입니다.

 

LightGBM Parameters

  • max_depth : 나무의 깊이. 단일 결정나무에서는 충분히 데이터를 고려하기 위해 depth를 적당한 깊이로 만들지만, 보정되기 때문에 부스팅에서는 깊이 하나짜리도 만드는 등, 깊이가 짧은것이 크리티컬하지 않음
  • min_data_in_leaf : 잎이 가질 수 있는 최소 레코드 수, 기본값은 20,
    과적합을 다루기 위해 사용

    feature_fraction : 부스팅 대상 모델이 랜덤포레스트일때, 랜덤포레스트는 feature의 일부만을 선택하여 훈련하는데, 이를 통제하기 위한 파라미터, 0.8이라면 LightGBM이 각 반복에서 80%의 파라미터를 무작위로 선택하여 트리를 생성
  • bagging_fraction : 데이터의 일부만을 사용하는 bagging의 비율
    예를들어 오버피팅을 방지하기 위해 데이터의 일부만을 가져와서 훈련시키는데, 이는 오버피팅을 방지하며 약한예측기를 모두 합칠경우는 오히려 예측성능이 좋아질 수 있음 훈련 속도를 높이고 과적합을 방지하는 데 사용
  • early_stopping_round : 더이상 validation데이터에서 정확도가 좋아지지 않으면 멈춰버림
    훈련데이터는 거의 에러율이 0에 가깝게 좋아지기 마련인데, validation데이터는 훈련에 사용되지 않기때문에 일정이상 좋아지지 않기 때문
  • lambda : 정규화에 사용되는 파라미터, 일반적인 값의 범위는 0 ~ 1
  • min_gain_to_split : 분기가 되는 최소 정보이득, 트리에서 유용한 분할 수를 제어하는 데 사용
  • max_cat_group : 범주형 변수가 많으면, 하나로 퉁쳐서 처리하게끔 만드는 최소단위
  • objective : lightgbm은 regression, binary, multiclass 모두 가능
  • boosting:
    gbdt(gradient boosting decision tree),
    rf(random forest),
    dart(dropouts meet multiple additive regression trees),
    goss(Gradient-based One-Side Sampling)
  • num_leaves: 결정나무에 있을 수 있는 최대 잎사귀 수. 기본값은 0.31
  • learning_rate : 각 예측기마다의 학습률 learning_rate은 아래의 num_boost_round와도 맞춰주어야 함
  • num_boost_round : boosting을 얼마나 돌릴지 지정한다.
    (보통 100정도면 너무 빠르게 끝나며, 시험용이 아니면 1000정도 설정하며, early_stopping_round가 지정되어있으면 더이상 진전이 없을 경우 알아서 멈춤)
  • device : gpu, cpu
  • metric: loss를 측정하기 위한 기준. mae (mean absolute error), mse (mean squared error), 등
  • max_bin : 최대 bin
  • categorical_feature : 범주형 변수 지정
  • ignore_column : 컬럼을 무시한다. 무시하지 않을경우 모두 training에 넣는데, 뭔가 남겨놓아야할 컬럼이 있으면 설정
  • save_binary: True 메모리 절약

    https://lightgbm.readthedocs.io/en/latest/Parameters.html

 

라이브러리 불러오기

import lightgbm as lgbm

# model_lgbm
model_lgbm = lgbm.LGBMRegressor(random_state=42)
model_lgbm

시각화 하기

lgbm.plot_importance(model_lgbm)

 

lgbm.plot_tree(model_lgbm, figsize=(20, 20), tree_index=0, 
               show_info=['split_gain', 'internal_value', 'internal_count', 'leaf_count'])


CatBoost 모델

  • 의사결정 트리 상의 그래디언트 부스팅(Gradient Boosting)용 알고리즘
  • catboost는 기존 GBT의 느린 학습 속도와 과대적합 문제를 개선한 모델입니다.
  • 과대적합이란 모델이 지나친 학습으로 인해 경향이 학습용 세트에 쏠려 있는 현상을 말합니다.
  • 학습용 세트에서는 예측을 잘 하지만(특수한 상황), 일반적인 상황에서 예측 능력이 떨어지는 것입니다.
  • 범주형 데이터를 따로 인코딩할 필요가 없지만 모델 훈련시 어떤 데이터가 범주형인지 알려주어야 합니다
  •  
 장점 단점
  • 범주형 기능에 대한 기본 처리
  • 빠른 GPU 훈련
  • 모델 및 기능 분석을 위한 시각화 및 도구
  • 과적합을 극복하기 위해 순서가 있는 부스팅을 사용
  •  CatBoost 는 희소 행렬을 지원 하지 않음
  • 데이터 세트에 수치형 타입이 많을 때 CatBoost는 LightGBM보다 훈련하는 데 상대적으로 많은 시간이 소요
특징 

  • 수평트리  (Level-wise Tree)
  • 정렬된 부스팅  (Orderd Boosting)
  • 임의 순열  (Random Permutation)
  • 정렬된 대상 인코딩  (Ordered Target Encoding)
  • 범주형 Feauture 조합  (Categorical Feauture Combinations)
  • 원핫 인코딩  (One-hot Encoding)
  • 최적화된 파라미터 튜닝  (Optimized Parameter tuning)

    중복되는 범주형 변수 처리
    • Class를 명확하게 구분할 수 있는 중복되는 변수가 2개 이상 존재한다고 할 때, 이를 하나의 변수로 통합해 처리
    • 이렇게 함으로써 Feature가 늘어나는 문제를 줄임으로써 연산 비용도 줄일 수 있게 됨

CatBoostParameters

  • cat_features : 범주형 변수 인덱스 값
  • loss_function : 손실 함수를 지정합니다.
  • eval_metric : 평가 메트릭을 지정합니다.
  • iterations : 머신러닝 중 만들어질 수 있는 트리의 최대 갯수를 지정합니다.
  • learning_rate : 부스팅 과정 중 학습률을 지정합니다.
  • subsample : 배깅을 위한 서브샘플 비율을 지정합니다.
  • max_leaves : 최종 트리의 최대 리프 개수를 지정합니다.

https://catboost.ai/en/docs/references/training-parameters/common

라이브러리 불러오기

import catboost

model_cat = catboost.CatBoostRegressor(eval_metric="R2", verbose=False)
model_cat

 

 

 

728x90

댓글