XGBoost는 GBM을 기반하고 있지만, GBM의 느린 수행 시간 및 과적합 규제 부재 등의 문제를 보완한 알고리즘이다. 트리 기반의 앙상블 학습에서 많이 사용되고 있다.
분류와 회귀에서의 뛰어난 예측 성능
GBM 대비 빠른 수행 시간
과적합 규제
Tree pruning
자체 내장된 교차 검증
결손값 자체 처리
GBM과 유사한 하이퍼 파라미터를 가지고 있으며, 추가적으로 early stopping과 과적합 규제를 위한 하이퍼 파라미터가 존재한다.
booster
그 외에도 silent, nthread가 있음
트리 최적화, 부스팅, 규제 등과 관련된 파라미터를 지칭한다.
learning_rate
n_estimators
subsample
reg_lambda
reg_alpha
scale_pos_weight
그 외에도 min_split_loss, max_depth 등의 하이퍼 파라미터가 존재함
학습 수행 시 객체 함수, 평가를 위한 지표 등을 설정하는 파라미터를 지칭한다.
objective
eval_metric
위스콘신 유방암 데이터셋을 이용하여 악성 종양인지 양성 종양인지 분류하는 문제. 종양의 크기, 모양 등의 다양한 feature 존재. 이진 분류 문제임.
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
## 유방암 데이터셋 로드
dataset = load_breast_cancer()
features = dataset.data
labels = dataset.target
## 데이터를 Pandas DataFrame으로 로드
cancer_df = pd.DataFrame(data=features, columns=dataset.feature_names)
cancer_df['target'] = labels
cancer_df
## 클래스 별 데이터 수 확인
print(dataset.target_names)
print(cancer_df['target'].value_counts())
## 학습 및 검증 데이터셋으로 데이터 분리
X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]
## 학습, 검증용 데이터셋 비율 8 : 2
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156)
## X_train, y_train을 다시 9 : 1 비율로 분리
## => XGBoost가 제공하는 교차 검증 성능 평가 및 조기 중단을 수행하기 위함
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=156)
## 모델 성능 평가 함수 선언
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, 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_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))
from xgboost import XGBClassifier
## 모델 선언
xgb_clf = XGBClassifier(n_estimators=1000, learning_rate=0.05, max_depth=3, eval_metric='logloss')
## 학습용 데이터, 검증용 데이터
evals = [(X_tr, y_tr), (X_val, y_val)]
## early stopping 적용
xgb_clf.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric='logloss', eval_set=evals, verbose=True)
w_preds = xgb_clf.predict(X_test)
w_preds_proba = xgb_clf.predict_proba(X_test)[:, 1]
get_clf_eval(y_test, w_preds, w_preds_proba)
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
ftr_importances_values = xgb_clf.feature_importances_
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns)
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]
plt.figure(figsize=(8, 6))
plt.title('Feature importances Top 20')
sns.barplot(x=ftr_top20, y=ftr_top20.index)
plt.show()
XGBoost는 GBM을 기반으로 하는 부스팅 알고리즘으로, GBM에 비해 상대적으로 속도가 빠르고 성능이 좋아 많이 쓰이는 알고리즘이다. train / test 데이터셋 분리 후, train 을 train / val 로 다시 분리하여 early stopping 적용이 가능하다.
전부
파이썬 머신러닝 완벽 가이드
책에 나와있는 내용인가요?