728x90
이 포스팅은 < 파이썬 머신러닝 완벽 가이드(개정 2판) >을 학습하면서 정리한 내용이다.(https://www.yes24.com/Product/Goods/69752484)
파이썬 래퍼 XGBoost(eXtra Gradient Boost) API
https://xgboost.readthedocs.io/en/stable/
XGBoost는 트리 기반의 앙상블 학습에서 각광받고 있는 알고리즘이다.
분류에 있어서, 뛰어난 예측 성능을 보이며, GBM에 기반하고 있지만, GBM의 느린 시간과 과적합 문제를 해결했다.
XGBoost 장점
- 분류/ 회기 영역에서 뛰어난 예측 성능 발휘
- GBM 대비 빠른 수행 시간
- 자체에 과적합 규제 기능을 보유해, 과적합에 강한 내구성을 지님
- max_depth 로 분할 깊이 조절 및 tree punning으로 분할 수를 더 줄일 수 있음
- 자체 내장된 교차 검증으로 값이 최적화 될 때, 조기 중단 기능이 있음
- 결손값을 자체 처리함
파이썬 래퍼 XGBosst 적용 - 위스콘신 유방암 예측
(구글 코랩 환경에서의 실습을 기준으로 한다.)
Step 0. 라이브러리 불러오기 & 환경설정
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')
Step 1. 데이터셋 불러오기
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 # 종속변수
cancer_df.head(3)

- 데이터셋 정보 불러오기
cancer_df.info()

결측치가 없는 것을 확인,
타겟 레이블 값은 마지막 컬럼임을 확인한다.
- 타깃 레이블 값 확인
print(dataset.target_names)
print(cancer_df['target'].value_counts())
1값인 양성 benign, 0값인 악성 malignant
| ['malignant' 'benign'] 1 357 0 212 Name: target, dtype: int64 |
Step 2. 데이터셋 분리
- X_tr : 훈련 데이터
- X_val : 검증 데이터
- X_test : 테스트 데이터
- Feature 용 데이터프레임(독립 변수), label 용 시리즈 객체 추출(종속 변수)
# 종속변수와 독립변수로 분리
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=1)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
| ((455, 30), (114, 30), (455,), (114,)) |
- 학습용 데이터를 학습 90%, 검증 10%으로 다시 분리
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=1)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
| ((409, 30), (46, 30), (409,), (46,)) |
Step 3. 데이터 변환(XGBoost DMatrix)
XGBoost는 사이킷런과 달리 전용 데이터 객체인 DMatrix를 사용한다.
따라서 현재 pandas, numpy 형태로 되어 있는 데이터 세트(학습/훈련/검증)를 전용데이터 객체인 DMatrix로 생성하여 모델에 입력해줘야 한다.
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)
Step 4. 모델링
- 하이퍼 파라미터 설정
params = {
'max_depth' : 3, # 최대 깊이 3
'eta' : 0.05,
'objective' : 'binary:logistic', # 데이터가 이진 분류이므로, obejctive(목적함수)는 이진 로지스틱
'eval_metric' : 'logloss' # 오차
}
num_rounds = 300
- 모델 학습
# 학습 데이터 셋 train, 평가 데이터 셋 eval
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)

300번 전부 실행하지 않고 205 번째 에서 종료 됨( 조기 중단 기능)
Step 5. 예측
사이킷 런의 predict 메서드는 0,1을 반환하지만,
DMatrix의 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])
| predict( ) 수행 결과값을 10개만 표시, 예측 확률 값으로 표시됨 [0.885 0.03 0.998 0.008 0.676 0.001 0.399 0.009 0.995 0.998] 예측값 10개만 표시: [1, 0, 1, 0, 1, 0, 0, 0, 1, 1] |
Step 6. 예측 성능 평가
- 예측 성능 평가 함수 구현
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)
| 오차 행렬 [[37 5] [ 0 72]] 정확도: 0.9561, 정밀도: 0.9351, 재현율: 1.0000, F1: 0.9664, AUC:0.9818 |
- XGBoost plot_importance() 피쳐 중요도 구현
import matplotlib.pyplot as plt
%matplotlib inline
fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(xgb_model, ax=ax)

728x90
'Data Science & AI > Machine Learning' 카테고리의 다른 글
| [ML] 머신러닝 평가지표 - 회귀 모델 MSE, RMSE, MAE (0) | 2023.09.16 |
|---|---|
| [ML] 머신러닝 평가지표 - 분류 모델 평가지표(오차행렬) (0) | 2023.09.15 |
| [Machine Learning] 회귀 , Kaggle 자전거 대여 수요 예측 - 2 (0) | 2023.08.24 |
| [Machine Learning] 회귀 , Kaggle 자전거 대여 수요 예측 - 1 (0) | 2023.08.23 |
| [Machine Learning] 앙상블 학습, Voting Classifier - 유방암 데이터 세트 (0) | 2023.08.22 |