본문 바로가기

파이썬 머신러닝 완벽가이드

4.5 XGboost 실습

728x90

XGboost는 파이썬 기반과 사이킷런 기반 두 종류를 제공합니다. 하지만 해당 포스팅에서는 앞으로 자주 사용할 사이킷런 기반 XGboost에 대해서만 실습을 진행해보도록 하겠습니다. 데이터셋으로는 예전에 사용했던 위스콘시 암 데이터를 사용하였습니다.

 

우선 데이터를 분석해보도록 하겠습니다.

# 사이킷런 래퍼 XGboost
from xgboost import XGBClassifier
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

# dataframe으로 변경 후 target 피처 추가
cancer_df = pd.DataFrame(data=X_features, columns=dataset.feature_names)
cancer_df['target']= y_label

 

print(dataset.target_names)
print(cancer_df['target'].value_counts())

 

['malignant' 'benign']
1    357
0    212
Name: target, dtype: int64

 

# 전체 데이터 중 80%는 학습용 데이터, 20%는 테스트용 데이터 추출
X_train, X_test, y_train, y_test=train_test_split(X_features, y_label,
                                         test_size=0.2, random_state=156 )
print(X_train.shape , X_test.shape)
(455, 30) (114, 30)

 

eval_set은 교차검증을 위한 평가용 데이터셋입니다. 따라서 실제로는 평가용 데이터셋을 따로 구분해야하지만 지금 데이터에서는 데이터의 양이 너무 적어 test데이터를 사용하도록 하겠습니다. 하지만 원칙적으로는 테스트 데이터셋에 대한 과적합이 발생할 수 있기 때문에 이렇게 사용하면 안 됩니다.

# 원래 evals에는 교차검증을 위한 데이터셋을 사용해야함.
evals = [(X_test, y_test)]

xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
xgb_wrapper.fit(X_train , y_train, eval_set=evals, eval_metric="logloss",  verbose=True)

w_preds = xgb_wrapper.predict(X_test)
w_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]

 

아래 코드는 100번 이상 성능 향상이 일어나지 않으면 조기 종료하는 파라미터가 추가된 코드입니다.

xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)

evals = [(X_test, y_test)]
# 100번 이상 성능 향상이 없다면 조기 종료
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]

 

분류에 사용된 주요 파라미터는 다음과 같습니다.

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)

 

 

 

 

 

 

 

반응형