본문 바로가기

Lecture ML

머신러닝 강좌 #19] XGBoost (eXtra Boost Machine), Scikit Wrapper Class

반응형

사이킷런의 프레임워크와 연동하기 위해 사이킷런 전용의 XGBoost 래퍼 클래스를 제공합니다. 사이킷런의 기본 Estimator를 그대로 상속해 만들었기 때문에 다른 Estimator와 동일하게 fit()과 predict()만으로 학습과 예측이 가능하고, GridSearchCV, Pipline 등 사이킷런의 다른 유틸리티를 그대로 사용할 수 있기 때문에 기존의 다른 머신러닝 알고리즘으로 만들어놓은 프로그램이 있더라도 알고리즘 클래스만 XGboost 래퍼 클래스로 바꾸면 기존 프로그램을 그대로 사용할 수 있습니다. 

 

18장에서 설명한 파이썬 래퍼 XGBoost에서 사용한 파라미터는 아래와 같이 변경하여 사용합니다.

  • eta → learning_rate
  • sub_sample → subsample
  • lambda → reg_lambda
  • alpha → reg_alpha
  • n_estimator → n_estimator
  • num_boost_round → num_boost_round

 

만일 두 개가 동시에 사용되면 파이썬 래퍼 XGBoost API에서는 n_estimator파라미터를 무시하고 num_boost_round 파라미터를 적용합니다. 하지만 XGBClassifier와 같은 사이킷런 래퍼 XGBoost클래스에서는 n_estimators파라미터를 적용합니다.

 

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 Common_Module.CMStat as CMStat
import warnings

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

# print(cancer_df.info())
# print(cancer_df['target'].value_counts())

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)

xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
xgb_wrapper.fit(X_train, y_train)
w_preds = xgb_wrapper.predict(X_test)
w_pred_proba = xgb_wrapper.predict_proba(X_test)[:,1]

CMStat.get_clf_eval(y_test, w_preds, w_pred_proba)

 

fit안에 반복 횟수를 정의하는 early_stopping_rounds, 조기 중단을위한 평가 지표인 eval_metrics, 그리고 성능 평가를 수행할 데이터 세트인 eval_set을 설정합니다. 

xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
evals = [(X_test, y_test)]
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)
CMStat.get_clf_eval(y_test, ws100_preds, None)

 

n_estimators를 400으로 설정해도 400번 반복을 수행하지 않고 311번 후 학습을 완료했습니다. 이유는 211번 반복 시 logloss가 0.08593이고 311번 반복 시 logloss가 0.085948인데, 211번에서 311번까지 early_stopping_rounds=100으로 지정된 100번의 반복 동안 성능 평가 지수가 향상되지 않았기 대문에 더 이상 반복하지 않고 멈춘 것입니다.

[302]	validation_0-logloss:0.08602
[303]	validation_0-logloss:0.08610
[304]	validation_0-logloss:0.08598
[305]	validation_0-logloss:0.08606
[306]	validation_0-logloss:0.08597
[307]	validation_0-logloss:0.08600
[308]	validation_0-logloss:0.08600
[309]	validation_0-logloss:0.08588
[310]	validation_0-logloss:0.08592
[311]	validation_0-logloss:0.08595
Stopping. Best iteration:
[211]	validation_0-logloss:0.08559

 

결괏값을 보면 조기 중단이 적용되지 않은 결과보다 약간 저조한 성능을 나타냈지만, 큰 차이는 아닙니다.

정확도: 0.9649
정밀도: 0.9620
재현율: 0.9870
F1: 0.9744

 

하지만 조기 중단 값을 너무 급격하게 줄이면 예측 성능이 저하될 우려가 큽니다. 만일 early_stopping_rounds를 10으로 하면 아직 성능이 향상될 여지가 있음에도 불구하고 10번 반복하는 동안 성능 평가 지표가 향상되지 않으면 반복이 멈춰 버려서 충분한 학습이 되지 않아 예측 성능이 나빠질 수 있습니다. 

 

from xgboost import plot_importance
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10,12))
plot_importance(xgb_wrapper, ax=ax)
plt.show()

 

반응형