사이킷런의 프레임워크와 연동하기 위해 사이킷런 전용의 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()
'Lecture ML' 카테고리의 다른 글
머신러닝 강좌 #23] 회귀 : Regression, 단순 선형 회귀를 통한 회귀 이해 그리고 경사하강법 (GD)에대해 (0) | 2021.06.22 |
---|---|
머신러닝 강좌 #22] SMOTE, LightGBM을 이용한 예측 분류 실습 - 캐글 신용카드 사기 검출 (0) | 2021.06.20 |
머신러닝 강좌 #21] 분류 XGBoost를 이용한 고객 만족 예측 (0) | 2021.06.17 |
머신러닝 강좌 #20] LightGBM에 대한 이해 (0) | 2021.06.14 |
머신러닝 강좌 #18] XGBoost (eXtra Boost Machine) (0) | 2021.06.11 |
머신러닝 강좌 #17] GBM(Gradient Boost Machine) (0) | 2021.06.06 |
머신러닝 강좌 #16] 랜덤 포레스트 - 공공데이터 에어코리아 대기오염정보 API 연결 후 머신러닝 실행하기 (0) | 2021.06.06 |
머신러닝 강좌 #15] 랜덤 포레스트 (Random Forest) (2) | 2021.06.03 |