XGBoost 개요
XGBoost는 트리 기반의 앙상블 학습에서 가장 각광받고 있는 알고리즘 중 하나입니다.
XGBoost는 GBM에 기반하고 있지만, GBM의 단점인 느린 수행 시간 및 과적합 규제 부재등의 문제를 해결해서 매우 각광을 받고 있다.
파이썬 Wrapper와 싸이킷런 Wrapper에는 약간의 차이가 존재합니다.
XGBClassifier는 기존의 사이킷런에서 사용하는 하이퍼 파라미터 몇 가지를 변경하였는데, 변경 사항은 다음과 같습니다.
- eta -> learning_rate
- sub_sample ->subsample
- lambda ->reg_lambda
- alpha ->reg_alpha
장점
- 뛰어난 예측 성능
- GBM 대비 빠른 수행 시간
- 과적합 규제
- Tree pruning
- 자체 내장된 교차 검증 (지정된 반복횟수가 아닌 교차검증을 통해 평가 데이터 세트의 평가값이 최적화 되면 반복을 중간에 멈출 수 있는 조기 중단 기능이 있음)
- 결손값 자체 처리
과적합 문제가 심할경우
- eta값을 낮춘다(0.01~0.1).eta값을 낮출 경우 num_round(또는 n_estimators)는 반대로 높혀줘야한다
- max_depth 값을 낮춘다
- min_child_weight 값을 높인다
- gamma 값을 높인다
XGBoost(파이썬 Wrapper)를 적용하여 위스콘신 유방암 예측
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')
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(5)
head(5)로 앞의 데이터 5개를 보여준다)
print(dataset.target_names)
print(cancer_df['target'].value_counts())
"결과값"
['malignant' 'benign']
1 357
0 212
train,test 데이터 분리
X_train,X_test,y_train,y_test = train_test_split(dataset.data,dataset.target,test_size = 0.2)
#X_features,y_label
print(X_train.shape,X_test.shape)
"결과값"
(455, 30) (114, 30) # X_train는 455개의 데이터, X_test는 114개의 데이터
XGBoost만의 전용 데이터 세트 DMatrix를 생성 할 수 있다.
주로 Numpy로 입력파라미터를 받아서 만들어진다.
- data : 피처 데이터 세트
- label : 분류일경우 레이블 데이터 세트
회귀일경우 숫자형인 종속값 데이터 세트
early_stopping_rounds 파라미터를 설정해 조기 중단을 수행하기 위해서는 반드시
eval_set 과 eval_metric이 함께 설정 돼야 한다.
※XGboost는 반복마다 eval_set으로 지정된 데이터 세트에서 eval_metric의 지정된 평가 지표로 예측오류를 측정
# XGBoost 는 DMatrix 라는 numpy로 만들어지는 전용 데이터 세트 (data,label) 파라미터로
#DF.values로 1차원 변경후 사용
dtrain = xgb.DMatrix(data = X_train, label = y_train)
dtest = xgb.DMatrix(data = X_test, label = y_test)
params = {
'max-depth':3,
'eta':0.1, # XGBClassifier일 경우 learning_rate 로 쓴다
'objective':'binary:logistic', #목적함수 : 0 or 1 이므로 이진 로지스틱 사용
'eval_metric' : 'logloss', # 오류 함수의 평가 성능 지표 : logloss
'early_stoppings':100 #100회이상 시행시에도 오류가 내려가지않으면 중단
} # 트리 깊이 최대 3 , 학습률 0.1 ,
num_rounds = 400 # 400회 반복
wlist = [(dtrain,'train'),(dtest,'eval')]
xgb_model = xgb.train(params = params, dtrain=dtrain,num_boost_round= num_rounds,
early_stopping_rounds=100,evals = wlist)
XGBoost는의 predict()는 예측 결과값이 아닌 예측결과를 추정할 수 있는 확률을 반환한다.
pred_probs = xgb_model.predict(dtest)
print("predict() 수행 결괏값을 10개만 표시,예측 확률값으로 표시됌")
print(np.round(pred_probs[:10],3))
# 예측확률이 0.5보다 크면 악성(1) 아니면 0
preds = [1 if x > 0.5 else 0 for x in pred_probs]
print(preds[:10])
"결과값"
predict() 수행 결괏값을 10개만 표시,예측 확률값으로 표시됌
[0.972 1. 0. 1. 0.165 1. 1. 0.979 0.046 0.018]
[1, 1, 0, 1, 0, 1, 1, 1, 0, 0]
XGBoost의 plot_importance()를 통해 피처의 중요도를 막대그래프 형식으로 나타내보기
from xgboost import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline
fig,ax =plt.subplots(figsize=(10,12))
plot_importance(xgb_model,ax=ax)
plot_importance(학습완료된 모델객체, ax객체)
싸이킷런을 래퍼 XGBoost
from xgboost import XGBClassifier
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]
""사전에 get_clf_eval 함수를 구현해놨음"
"결과"
[0] validation_0-logloss:0.61823
[1] validation_0-logloss:0.55884
[2] validation_0-logloss:0.51012
[3] validation_0-logloss:0.46664
[4] validation_0-logloss:0.43062
[5] validation_0-logloss:0.40135
[6] validation_0-logloss:0.37567
....
....
[379] validation_0-logloss:0.09340
[380] validation_0-logloss:0.09333
[381] validation_0-logloss:0.09338
[382] validation_0-logloss:0.09335
fig,ax = plt.subplots(figsize= (10,12))
plot_importance(xgb_wrapper,ax=ax)
이처럼 파이썬Wrapper 와 사이킷런 Wrapper 가 동일하게 피쳐 중요도가 시각화 됨을 알수있다.
'# AI 이론 > Machine Learning' 카테고리의 다른 글
[ML]캐글 신용카드 사기 검출 (0) | 2022.02.05 |
---|---|
LightGBM (0) | 2022.01.26 |
피처 스케일링(Feature Scaling) (0) | 2022.01.19 |
[Sklearn]타이타닉 생존자 예측 (0) | 2022.01.14 |
1.머신러닝이란? (0) | 2022.01.04 |