실습에 사용되는 데이터는 위스콘신 유방암 데이터입니다. 이 데이터 세트는 다양한 속성값을 기반으로 악성 종양인지 양성 조양인지를 분류하는 데이터 세트입니다.
먼저 필요한 모듈들을 로딩하여 줍니다.
In
import xgboost as xgb
from xgboost import plot_importance
import pandas as pd
import numpy as nd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
데이터를 불러와서 피처와 레이블 값을 지정하여 줍니다.
dt=load_breast_cancer()
features=dt.data
label= dt.target
데이터를 살펴보도록 하겠습니다.
In
cancer_df = pd.DataFrame(data=features, columns=df.feature_names)
cancer_df['target']=label
cancer_df.head(3)
Out
다양한 속성들이 존재합니다!!
In
cancer_df.info()
Out
이번에는 레이블 값의 분포를 확인해 보도록 하겠습니다.
In
print(cancer_df['target'].value_counts())
Out
여기서 1은 양성을 의미하고, 0은 악성을 의미합니다. 양성은 357, 악성은 212개로 분포되어 있습니다.
이제 전체 데이터를 학습과 테스트로 분리하여 주는데, 학습을 80%, 테스트를 20%로 분할하겠습니다.
In
x_train, x_test, y_train, y_test = train_test_split(features, label, test_size=0.2, random_state=156)
여기서!! 파이썬 래퍼와 사이컷런 래퍼의 차이가 발생합니다. 바로 학습용과 테스트용 데이터 세트를 위해서 별도의 DMatrix를 생성한다는 것입니다.
- DMatrix는 넘파이 입력 파라미터를 받아서 만들어지는 XGBoost의 전용 데이터 세트입니다. 주요 입력 파라미터는 data와 label입니다. 여기서 data는 피처 데이터 세트, label은 분류의 경우 레이블 데이터, 회귀의 경우 종속값 데이터입니다.
넘파이 형태의 학습&테스트 데이터 세트를 DMatrix로 변환하겠습니다.
In
dtrain = xgb.DMatrix(data=x_train, label=y_train)
dtest = xgb.DMatrix(data=x_test, label=y_test)
XGboost의 하이퍼 파라미터는 딕셔너리 형태를 주로 사용합니다. 하이퍼 파리미터를 임의로 설정해보도록 하겠습니다.
In
params = {'max_depth':3,
'eta':0.1,
'objective':'binary:logistic',
'eval_metric':'logloss',
'early_stoppings':100}
num_rounds=400
파이썬 래퍼에서는 하이퍼 파라미터를 xgboost 모듈의 train() 함수에 파라미터로 전달하게 됩니다.
하지만!! 사이킷런의 경우 Estimator의 생성자를 하이퍼 파라미터로 전달하게 됩니다.
이제 위에 하이퍼 파라미터를 이용해서 XGBoost 학습을 하겠습니다.
▷ 여기서 속도를 개선하기 위해서 조기 중단을 사용해보도록 하겠습니다. 조기중단은 early_stopping_rounds 파라미터를 train 함수에 적용하여 주는데 여기서는 반드시 eval_set: 성능평가를 수행할 평가용 데이터 세트, eval_metric: 평가 세트에 적용할 성능 평가 방법(분류는 주로 error, logloss를 적용)를 같이 설정해야 합니다.
In
w_list = [(dtrain,'train'),(dtest,'test')]
xgb_ml = xgb.train(params=params, dtrain=dtrain, num_boost_round=num_rounds,\
early_stopping_rounds=100, evals=w_list)
Out
결과는 앞부분과 뒷부분만 잘라서 붙였습니다. 결과값은 이렇게 반복 시마다 evals에 표시된 데이터 세트에 대해서 평가 지표 결과가 출력됩니다.
이제 테스트 데이터 세트로 예측을 해보겠습니다. 파이썬 래퍼 에서는 train() 함수를 호출해서 학습이 완료된 모델 객체를 반환하여 주고, 이 모델 객체는 예측을 위해서 predict() 메서드를 이용합니다. 하지만!! 사이킷런 래퍼 의 predict() 메서드는 예측 결과 클래스의 값을 반환하고 파이썬 래퍼는 예측 결과값이 아닌 예측 결과를 추정할 수 있는 확률 값을 반환합니다.
예측 확률이 0.5보다 크면 1, 아니면 0으로 예측값을 결정하겠습니다.
In
pred_probs = xgb_ml.predict(dtest)
pred=[1 if x > 0.5 else 0 for x in pred_probs]
print('예측값 10개:',pred[:10])
Out
다음으로 예측 성능을 평가하여 주는데, 저는 따로 만들어둔 get_eval()함수를 사용하겠습니다 . 이 함수는 여러 가지 평가들을 한번에 출력해주는 함수입니다.
In
get_eval(y_test, preds, pred_probs)
Out
다음과 같이 여러 평가에 관한 값들이 출력되었습니다.
다음은 시각화를 진행하겠습니다. 기본 평가 지표로는 f1 스코어를 기반으로 하여 각 피처들의 중요도에 관한 그래프를 출력하는데 plot_importance()를 사용하여 시각화를 할 수 있습니다. 파이썬 래퍼에서는 plot_importance()를 사용해서 바로 시각화를 할 수 있지만 사이킷런 래퍼에서는 Estimator 객체의 feature_importances_ 속성을 이용해서 직접 시각화 코드를 작성해야 합니다.
In
from xgboost import plot_importance
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(9,10))
plot_importance(xgb_ml, ax=ax)
Out
시각화 결과는 f0 =첫 번째 피처, f1= 두 번째 피처로 해석합니다.
Reference
'Machine Learning' 카테고리의 다른 글
LightGBM (3) | 2020.04.28 |
---|---|
XGBoost 실습 - 사이킷런 래퍼 - (0) | 2020.04.27 |
XGBoost(eXtra Gradient Boost) (0) | 2020.04.26 |
GBM(Gradient Boosting Machine) (1) | 2020.04.26 |
랜덤 포레스트(Random forest) (0) | 2020.04.26 |