먼저 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 |
댓글