XGBoost의 하이퍼 파라미터
import xgboost
model = xgboost.XGBRegressor(objective='reg:squarederror', n_estimators = 3000, eval_metric = 'rmse', early_stopping_rounds=10, random_state=42)
- objective : 목적함수
- reg:squarederror : 회귀문제에 사용. 오차 제곱합을 의미(오차 제곱합을 최소화하는 방향으로 학습 수행)
- binary:logistic : 이진분류에 사용
- multi:softmax : 소프트맥스 함수를 사용하는 다중분류
- mulfi:softprob : 확률값을 구하는 다중분류
- n_estimators : 트리 수
- eval_metric : 조기 종료를 위한 평가 지표
- rmse, mae, mape 등 다양한 값 설정 가능
- early_stopping_rounds : 조기 종료 조건, 평가 지표가 향상될 수 있는 반복 횟수
- 예를 들어 10이라면, 10회 반복될 동안 성능이 향상되지 않을 경우 조기 종료 됨
* GBM은 n_estimators에 지정된 횟수만큼 학습을 끝까지 수행
* XGB의 경우, 오류가 더 이상 개선되지 않으면 수행 중지 ▶︎ 불필요한 학습 시간 단축!
* 하지만 이 조기 중단 값을 급격하게 줄이면 모델 성능이 향상될 여지가 있어도 학습이 조기 중단 될 수도 있음
XGBoost 예제
- 위스콘신 유방암 예측 데이터를 활용
- 파이썬 래퍼 XGBoost API 활용
XGBoost 임포트 및 버전 확인
import xgboost
print(xgboost.__version__)
라이브러리 불러오기 및 환경설정
import xgboost as xgb
#피처 중요도 시각화 모듈
from xgboost import plot_importance
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
데이터셋 불러오기
dataset = load_breast_cancer()
features = dataset.data # 독립변수
labels = dataset.target # 종속변수
cancer_df = pd.DataFrame(data=features, columns=dataset.feature_names)
cancer_df['target'] = labels
cancer_df.head(3)
훈련 데이터와 테스트 데이터 분리
X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]
# 80:20으로 학습 / 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size = 0.2, random_state = 156)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
# 학습데이터를 9 : 1로 구분하여 검증용 데이터 분리
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size = 0.1, random_state = 156)
print(X_train.shape, X_test.shape)
print(X_tr.shape, X_val.shape)
파이썬 래퍼 XGBoost 적용 - 위스콘신 유방암 예측 모델 학습
- C 언어 기반의 XGBoost인 파이썬 래퍼 XGBoost를 사용하는 법은 기존의 사이킷런의 fit(), predict()과 조금 다르다
- 데이터프레임을 XGBoost 객체로 변환하는 과정을 거쳐, 아래 예제와 같이 조금 다른 방식으로 코드를 작성해주어야 한다
- xgb.DMatrix 파라미터로 data 와 label 지정
- 하이퍼파라미터는 주로 딕셔너리 형태로 입력
- 조기 중단 수행을 위한 early_stopping_rounds 파라미터 설정을 하려면, 반드시 평가용 세트 지정 필요
- eval_list에 튜플을 담은 리스트 형태로 저장 : [(dtr, 'train'), (dval, 'eval')] 또는 [(dval, 'eval')] 만 명기
- evals = eval_list 처리
# XGBoost 객체로 데이터 변환
dtr = xgb.DMatrix(data=X_tr, label=y_tr)
dval = xgb.DMatrix(data=X_val, label=y_val)
dtest = xgb.DMatrix(data=X_test, label=y_test)
# 파라미터 설정
params = {
'max_depth': 3, # 트리의 최대 깊이
'eta':0.05, # 사이킷런 래퍼모듈에서는 learning_rate
'objective':'binary:logistic', # 이진분류의 목적함수 지정
'eval_metric':'logloss' # 오류 함수의 평가 성능 지표
}
# 부스팅 반복 횟수
num_rounds = 300
# 훈련 / 검증 데이터셋 지정
eval_list = [(dtr, 'train'), (dval, 'eval')]
# 조기 중단 횟수 여기서 설정
xgb_model = xgb.train(params=params, dtrain=dtr, num_boost_round=num_rounds,
early_stopping_rounds=50, evals=eval_list)
- 위 결과와 같이 train()으로 학습을 수행하면서 반복시마다, 오류(eval-logloss) 값이 감소하고 있음
- 단, 초기 설정한 num_round 값이 300인데, 176번째 반복에서 완료했음
👉 early_stopping_round 였던 50번 동안(126~ 176회 수행) 126번째 수행의 오류값이 개선되지 않았기 때문
예측 수행
- 파이썬 래퍼 xgboost의 predict()는 예측 결괏값이 아닌, 예측 결과를 추정할 수 있는 확률값을 반환
- 따라서, 이진 분류의 경우 예측 확률이 0.5보다 크면 1, 그렇지 않으면 0으로 예측 값을 결정하는 로직을 추가하면 됨
pred_probs = xgb_model.predict(dtest)
print('predict( ) 수행 결과값을 10개만 표시, 예측 확률 값으로 표시됨')
print(np.round(pred_probs[:10],3))
# 예측 확률이 0.5 보다 크면 1 , 그렇지 않으면 0 으로 예측값 결정하여 List 객체인 preds에 저장
preds = [ 1 if x > 0.5 else 0 for x in pred_probs ]
print('예측값 10개만 표시:',preds[:10])
예측 모델 성능 평가
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score
from sklearn.metrics import f1_score, roc_auc_score
def get_clf_eval(y_test, pred=None, pred_proba=None):
confusion = confusion_matrix( y_test, pred)
accuracy = accuracy_score(y_test , pred)
precision = precision_score(y_test , pred)
recall = recall_score(y_test , pred)
f1 = f1_score(y_test,pred)
# ROC-AUC 추가
roc_auc = roc_auc_score(y_test, pred_proba)
print('오차 행렬')
print(confusion)
# ROC-AUC print 추가
print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f},\
F1: {3:.4f}, AUC:{4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))
get_clf_eval(y_test, preds, pred_probs)
[참고] 공식 사이트
XGBoost Documentation — xgboost 1.7.6 documentation
© Copyright 2022, xgboost developers. Revision 36eb41c9.
xgboost.readthedocs.io
728x90
'Machine Learning > scikit-learn' 카테고리의 다른 글
[앙상블] XGBoost 개념과 사이킷런 래퍼 예제 (0) | 2023.08.30 |
---|---|
[앙상블 학습] LightBGM (0) | 2023.08.22 |
[앙상블] GBM(Gradient Boosting Machine) (0) | 2023.08.22 |
[앙상블] 랜덤 포레스트 (0) | 2023.08.22 |
[앙상블] 앙상블의 개념과 보팅(하드보팅 vs. 소프트 보팅) (0) | 2023.08.22 |