본문 바로가기
ML/ML-Kaggle, 데이콘

XGB(Extreme Gradient Boosting)

by lucian 2021. 12. 30.

먼저 XGB를 알기전에 GBM부터 알아야한다. https://lucian-blog.tistory.com/51?category=1002577 

 

XGB는 GBM의 속도와 성능을 향상시킨 업그레이드 버전이라고 보면 된다.

앙상블 기법 중 Boosting 기법은 틀린 답 즉 오류(또는 오답)에 가중치를 부여하여, 순차적으로 다음 학습모델에 반영하여 강한 예측모형을 만드는 기법이다.

 

그 중 GBM은 이 가중치에 경사하강법을 도입하여 만든 모델이다.

그런데 이 부스팅 모델은 모델들을 순차적으로 학습하기 때문에 속도가 매우 느리다... 데이터가 많아질수록 더 많이 느려진다. 이를 업그레이드 한 것이 XGB이다.

 

XGB는 GBM의 학습하는 모델을 병렬처리하여 학습하게 만든다.

즉 순차적으로 진행이 아닌 동시에 각각의 모델이 돌아간다.

 

 

XGB의 장점

  •  XGB가 GBM보다 속도가 더 빠르다.
  •  과적합 규제(Reguarization)을 지원한다.
  •  분류, 회귀에 높은 성능을 보인다.
  •  조기 종료(Early stopping)이라는 기능을 제공하여 학습에 개선이 없을 때 종료시켜준다.
  •  다양한 옵션을 제공(Customizing)
  •  결측치를 내부적으로 처리한다.

 

접은글은 데이터를 가져오는 코드이다.

더보기
# 데이터 다운로드 링크로 데이터를 코랩에 불러옵니다.

!wget 'https://bit.ly/3i4n1QB'

import zipfile
with zipfile.ZipFile('3i4n1QB', 'r') as existing_zip:
    existing_zip.extractall('data')

 

 

# 라이브러리 및 데이터 불러오기
import pandas as pd

train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')

train.drop('index',axis = 1 ,inplace =True)
test.drop('index',axis = 1 ,inplace =True)

train.head()

 type이란 컬럼이 명목변수이기에 원핫인코딩으로 모델이 학습할 수 있게 바꿔준다.

# 원핫 인코딩 (pd.get_dummies())
train_one=pd.get_dummies(train)
test_one=pd.get_dummies(test)

train_one

 

 

모델을 import하고 인스턴스화해준다.

from xgboost import XGBClassifier

xgb_model=XGBClassifier()

 

모델을 학습해보자.

# 모델 학습

# X 는 train에서 quality 를 제외한 모든 변수
X=train_one.drop(columns='quality',axis=1)
# y 는 train의 qulity 변수
y=train_one['quality']


# fit 메소드를 이용해 모델 학습
xgb_model.fit(X,y)

 

학습한 모델을 예측한다.

# predict 메소드와 test_one 데이터를 이용해 품질 예측
pred=xgb_model.predict(test_one)

pred

 

 

 


XGB 하이퍼 파라미터 튜닝

pip install bayesian-optimization

# Bayesian Optimization 불러오기
from bayes_opt import BayesianOptimization

 

# XGBoost의 하이퍼 파라미터의 범위를 dictionary 형태로 지정해주세요
## Key는 XGBoost hyperparameter이름이고, value는 탐색할 범위 입니다.
XGB_params={
    'gamma':(0,10),
    'max_depth':(1,3),
    'subsample':(0.5,1),
}

 

# 함수를 만들어주겠습니다.
# 함수의 구성은 다음과 같습니다.
# 1. 함수에 들어가는 인자 = 위에서 만든 함수의 key값들
# 2. 함수 속 인자를 통해 받아와 새롭게 하이퍼파라미터 딕셔너리 생성
# 3. 그 딕셔너리를 바탕으로 모델 생성
# 4. train_test_split을 통해 데이터 train-valid 나누기
# 5 .모델 학습
# 6. 모델 성능 측정
# 7. 모델의 점수 반환
from xgboost import XGBClassifier 
from sklearn.model_selection import KFold, train_test_split
from sklearn.metrics import accuracy_score

def xgb_bo(gamma, max_depth, subsample):
  params={
      'gamma':int(round(gamma)),
      'max_depth':int(round(max_depth)),
      'subsample':int(round(subsample)),
  }

  xgb_model=XGBClassifier(**params)
  
  X_train,X_valid,y_train,y_valid=train_test_split(X,y,test_size=0.2)
  xgb_model.fit(X_train,y_train)

  score=accuracy_score(y_valid, xgb_model.predict(X_valid))

  return score

 

# "BO_xgb"라는 변수에 Bayesian Optmization을 저장해보세요

BO_xgb=BayesianOptimization(f=xgb_bo,pbounds=XGB_params,random_state=0,verbose=2)

 

# Bayesian Optimization을 실행해보세요
BO_xgb.maximize(init_points=5,n_iter=5)

max_params=BO_xgb.max['params']
max_params['max_depth']=int(max_params['max_depth'])
max_params

 

이제 최적의 하이퍼파라미터를 모델에 넣어보자.

# predict 메소드와 test_one 데이터를 이용해 품질 예측
xgb_tuned=XGBClassifier(**max_params)
xgb_tuned.fit(X,y)

pred=xgb_tuned.predict(test.drop(columns=['index'],axis=1))

 

제출~

sub=pd.read_csv('data/sample_submission.csv')
sub['quality']=pred
sub.to_csv('tuned_xgb.csv',index=False)

'ML > ML-Kaggle, 데이콘' 카테고리의 다른 글

Voting Classifier  (0) 2021.12.30
LGBM(Light Gradient Boosting Model)  (0) 2021.12.30
차원 축소  (0) 2021.12.29
다중공산성 해결 방법  (0) 2021.12.29
다중공산성  (0) 2021.12.17

댓글