트리 기반의 앙상블 학습에서 가장 각광받고 있는 알고리즘 중 하나
뛰어난 예측 성능
GBM 대비 빠른 수행 시간: 병렬 학습 가능
과적합 규제 (Regularization): 과적합 규제 기능 제공
나무 가지치기 (Tree pruning): 더 이상 긍정 이득이 없는 분할 가지치기
자체 내장된 교차 검증: 조기 중단 가능
결측값 자체 처리
(1) 일반 파라미터
booster
: gbtree 또는 gblinear 선택
silent
: 출력 메시지 표시 (default=0)
nthread
: CPU의 실행 스레드 개수
(2) 부스터 파라미터
eta
: 0~1 사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값으로 보통 0.01~0.2 사이의 값을 선호 (default=0.3)
num_boost_round
: GBM의 n_estimators와 같은 파라미터
min_child_weight
: 트리에서 추가적으로 가지를 나눌지를 결정하기 위해 필요한 데이터들의 weight 총합으로, 값이 클수록 분할을 자제한다.
gamma
: 트리의 리프 노드를 추가적으로 나눌지를 결정할 최소 손실 감소 값으로, 해당 값보다 큰 손실(loss)이 감소된 경우에 리프 노드를 분리한다. 값이 클수록 과적합 감소 효과가 있다.
max_depth
: 트리 기반 알고리즘의 max_depth와 같다. 0을 지정하면 깊이에 제한이 없으며, 보통은 3~10 사이의 값을 적용한다.
sub_sample
: GBM의 subsample과 동일하며 데이터를 샘플링하는 비율을 지정한다. 일반적으로 0.5 ~ 1 사이의 값을 사용한다.
colsample_bytree
: GBM의 max_features와 유사하며 트리 생성에 필요한 피처를 임의로 샘플링하는 데 사용된다.
lambda
: L2 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.
alpha
: L1 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.
scale_pos_weight
: 특정 값으로 치우친 비대칭한 클래스로 구성된 데이터 세트의 균형을 유지하기 위한 파라미터
(3) 학습 태스크 파라미터
objective
: 최솟값을 가져야할 손실 함수 정의
binary:logistic
: 이진 분류
multi:softmax
: 다중 분류, 레이블 클래스의 개수인 num_class 파라미터 지정 필요
multi:softprob
: 다중 분류, 개별 label 클래스에 해당되는 예측 확률 반환
eval_metric
: 검증에 사용되는 함수 정의
rmse
: Root Mean Square Error
mae
: Mean Absolute Error
logloss
: Negative log-likelihood
error
: Binary classification error rate (0.5 threshold)
merror
: Multiclass classification error rate
mloglose
: Multiclass logloss
auc
: Area under the curve
(4) 과적합 제어
eta
값을 낮춘다 (0.01 ~ 0.1)
(단, eta 값을 낮출 경우 num_round(또는 n_estimator)는 반대로 높여준다.)
max_depth
값을 낮춘다.
min_child_weight
값을 높인다.
gamma
값을 높인다.
subsample
과 colsample_bytree
를 조정하는 것도 트리가 너무 복잡하게 생성되는 것을 막아 과적합 문제에 도움이 될 수 있다.
(5) 실습
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() X_features= dataset.data y_label = dataset.target cancer_df = pd.DataFrame(data=X_features, columns=dataset.feature_names) cancer_df['target'] = y_label # 전체 데이터 중 80%는 학습용 데이터, 20%는 테스트용 데이터로 추출 X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156 ) # 학습용과 테스트용 데이터 세트를 위해 별도의 객체인 DMatrix 생성 필요 # DMatrix: 주로 넘파이 입력 파라미터를 받아서 만들어지는 XGBoost만의 전용 데이터 세트 dtrain = xgb.DMatrix(data=X_train, label=y_train) dtest = xgb.DMatrix(data=X_test, label=y_test) # 하이퍼 파라미터 설정 params = {'max_depth':3, 'eta': 0.1, 'objective':'binary:logistic', 'eval_metric':'logloss'} num_rounds = 400 # 학습용 데이터 세트: ‘train’, 테스트용 데이터 세트: ‘eval’ wlist = [(dtrain, 'train'),(dtest,' eval')] # 하이퍼 파라미터와 early stopping 파라미터를 train() 함수의 파라미터로 전달 xgb_model = xgb.train(params=params, dtrain=dtrain, num_boost_round=num_rounds, early_stopping_rounds=100, evals=wlist) # predict(): 예측 결과를 추정할 수 있는 확률 값을 반환 pred_probs = xgb_model.predict(dtest) # 예측 확률이 0.5보다 크면 1, 그렇지 않으면 0으로 결정 preds = [1 if x > 0.5 else 0 for x in pred_probs] # 평가 함수 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) 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) # 시각화 기능 내장 import matplotlib.pyplot as plt %matplotlib inline fig, ax = plt.subplots(figsize=(10, 12)) plot_importance(xgb_model, ax=ax) # 피처 순서별로 f0, f1 ···
- 조기 중단 기능 내장
early_stopping_rounds
: 수행 성능을 개선하기 위해서 더 이상 지표 개선이 없을 경우에 num_boost_round 횟수를 모두 채우지 않고 중간에 반복을 빠져 나올 수 있도록 한다.
단, 조기 중단을 수행하기 위해서는 반드시eval_set
(평가용 데이터 세트,evals
에서 설정),eval_metric
(성능 평가 방법)이 함께 설정되어야 한다.
- 시각화 기능 내장
plot_importance()
: 기본 평가 지표로 f1 스코어를 기반으로 해 각 피터의 중요도를 시각화
(6) cv()
xgboost.cv()
: 데이터 세트에 대한 교차 검증 수행 후 최적 파라미터를 구할 수 있는 방법 제공 (GridSearchCV와 유사)
params
: 부스터 파라미터 (dict)
dtrain
: 학습 데이터 (DMatrix)
num_boost_round
: 부스팅 반복 횟수
nfold
: CV 폴드 갯수
stratified
: CV 수행 시 층화 표본 추출 수행 여부
metrics
: CV 수행 시 모니터링할 성능 평가 지표
early_stopping_rounds
: 조기 중단 활성화, 반복 횟수 지정
(1) 하이퍼 파라미터
n_estimators
: GBM의 n_estimators와 같은 파라미터 (=num_boost_round
)
learning_rate
: 0~1 사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값으로 보통 0.01~0.2 사이의 값을 선호 (=eta
)
subsample
: GBM의 subsample과 동일하며 데이터를 샘플링하는 비율을 지정한다. 일반적으로 0.5 ~ 1 사이의 값을 사용한다. (=sub_sample
)
reg_lambda
: L2 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다. (=lambda
)
reg_alpha
: L1 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다. (=alpha
)
(2) 실습
from xgboost import XGBClassifier xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3) # 평가에 테스트 데이터를 사용하면 학습 시에 미리 참고가 되어 과적합이 발생 가능 # 예제 코드에서는 데이터 세트의 크기가 작아 평가용으로도 사용할 것일 뿐 주의 evals = [(X_test, y_test)] xgb_wrapper.fit(X_train, y_train, early_stopping_rounds=100, eval_metric="logloss", eval_set=evals, verbose=True) ws100_preds = xgb_wrapper.predict(X_test) ws100_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
조기 중단 관련 파라미터는
fit()
에 입력하여 사용한다.
early_stopping_rounds
: 평가 지표가 향상될 수 있는 반복 횟수 정의
eval_metric
: 조기 중단을 위한 평가 지표
eval_set
: 성능 평가를 수행할 데이터 세트
- 성능 평가를 수행할 데이터 세트는 학습 데이터가 아니라 별도의 데이터 세트를 사용해야 한다.
from xgboost import plot_importance import matplotlib.pyplot as plt %matplotlib inline fig, ax = plt.subplots(figsize=(10, 12)) # 사이킷런 래퍼 클래스를 입력해도 무방 plot_importance(xgb_wrapper, ax=ax)
- 피처의 중요도를 시각화하는 모듈인
plot_importance()
에 사이킷런 래퍼 클래스를 입력해도 동일한 시각화 결과를 제공한다.