728x90
XGBoost
eXtra Gradient Boost
- 뛰어난 예측 성능
- GBM대비 빠른 수행 시간 (CPU 병렬 처리, GPU 지원)
- 다양한 성능 향상 기능 (규제 기능 탑재, Tree Pruning)
- Regularization : linear나 tree based model에서 과적합을 피하는 방식 중 하나
- Tree Pruning(가지치기) : 일반적인 gradient boosting에서는 tree pruning 과정이 negative loss가 발생하면 멈추게 된다. 하지만 xgboost는 max_depth까지 진행한 뒤 loss function 에서의 개선이 일정 threshold에 못미칠 경우까지 역방향으로 pruning과정을 진행
- Early Stoppinig : n_estimator를 수행하다가 더이상 오류 감소하는 것이 보이지 않는다면 학습 중단(너무 반복 횟수를 단축할 경우, 예측 성능 최적화가 안된 상태에서 학습이 종료될 수 있으므로 유의 필요)
- 자체 내장된 교차 검증
- 결손값 자체 처리
XGBoost 하이퍼 파라미터
- learning_rate: 0에서 1 사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값
- n_estimators: 약한 학습기의 개수 (반복 수행 횟수)
- min_chiild_weight: 결정트리의 min_child_leaf와 유사, 과적합 조절용
- 등등..
XGBoost 실습
사이킷런 Wrapper XGBoost 사용
1. XGBoost 로 학습 및 예측
from xgboost import XGBClassifier
xgb_wrapper = XGBClassifier (n_estimator=400, learning_rate=0.05, max_depth=3, eval_metric='logloss')
xgb_wrapper.fit(X_train, y_train, verbose=True)
w_preds = xgb_wrapper.predict(X_test)
w_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
get_clf_eval()을 통해 예측 평가
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 , w_preds, w_pred_proba)
📌early stopping 설정하여 성능 향상시켜보기
2. early stopping을 50으로 설정하고 재학습/예측/평가
- early_stopping_rounds 파라미터를 설정해 조기 중단을 수행하기 위해서는 반드시 eval_set와 eval_metric이 함께 설정되어야 함
- XGBoost는 반복마다 eval_set로 지정된 데이터 세트에서 eval_metrics의 지정된 평가 지표로 예측 오류를 측정
- eval_set: 성능 평가를 수행할 평가용 이터 데이터를 설정
- eval_metric: 평가 세트에 적용할 성능 평가 방법, 분류일 경우 주로 'error', 'logloss'를 적용
from xgboost import XGBClassifier
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3)
evals = [(X_tr, y_tr), (X_val, y_val)]
xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric="logloss",
eval_set=evals, verbose=True)
ws50_preds = xgb_wrapper.predict(X_test)
ws50_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
logloss가 201번에서 가장 좋음
get_clf_eval(y_test , ws50_preds, ws50_pred_proba)
📌 보통 early stopping 쓰면 오버피팅이 안되기 때문에 성능이 더 좋아지는데, 데이터가 작다보니 전보다 성능 안좋아짐
2-1. early stopping을 10으로 설정하고 재학습/예측/평가
# early_stopping_rounds를 10으로 설정하고 재 학습.
xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=10,
eval_metric="logloss", eval_set=evals,verbose=True)
ws10_preds = xgb_wrapper.predict(X_test)
ws10_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
get_clf_eval(y_test , ws10_preds, ws10_pred_proba)
3. 피쳐중요도 그리기
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)
728x90
'머신러닝' 카테고리의 다른 글
[분류] 신용카드 사기 검출 (1) | 2024.03.06 |
---|---|
하이퍼파라미터 튜닝 방법 - Bayesian Optimization (0) | 2024.03.04 |
[분류] 앙상블 학습 - 보팅, 배깅, 부스팅 (0) | 2024.03.03 |
[분류] 랜덤포레스트 RandomForest (0) | 2024.03.03 |
[분류] DecisionTree GridSearchCV로 하이퍼파라미터 튜닝 해보기 (0) | 2024.03.03 |