XGBoost는 앙상블 부스팅 기법의 한 종류이며 이전 모델에서의 loss를 gradient descent를 이용하여 보완해나가는 방식으로 개선(?)된다.
주로 이런 순서로 사용한다.
# 1. 임포트 하기
from xgboost import XGBClassifier
# 2. 객체 생성하기
model = XGBClassifier(여러가지 파라미터~)
xgb_model = model.fit(X_train, y_train, early_stopping_rounds = 200, eval_metric = 'logloss', eval_set = [(X_test, y_test)])
# 3. predict 진행
pred = xgb_model.predict(X_test)
pred_proba = xgb_model.predict_proba(X_test)[:,1]
# 4. 특성 중요도 시각화
fig, ax = plt.subplots(figsize = (10, 12))
plot_importance(xgb_model, ax=ax)
n_estimators[default=100] : 트리 모델의 갯수 라고 생각하면 된다.
early_stopping_rounds : 최대한 몇 개의 트리를 완성할 것인지 valid loss에 더이상 진전이 없다면 멈춘다. n_estimators가 높을 때 주로 사용하며 과적합을 방지해준다.
learning_rate[default=0.1] : 학습 단계별로 이전 결과를 얼마나 반영할지 설정한다.
일반적으로는 0.01 ~ 0.2 사이의 값을 쓰며 너무 작게 하면 시간이 더 오래 걸리게 된다.
min_child_weight[default=1] :
child 에서 필요한 모든 관측치에 대한 가중치의 최소합
이 값보다 샘플 수가 작으면 leaf node가 된다. 너무 크게 설정하면 Under-fitting 될 수 있다.
max_depth[default=6] :
트리의 최대 깊이를 뜻하며 일반적으로 3~10의 값으로 한다.
gamma[default=0] : 트리에서 추가적으로 가지를 나눌지 말지 결정하는 최소 손실 감소 값
값을 크게 설정할 수록 과적합이 감소하는 효과가 있다.
subsample[default=1] : 각 트리마다 데이터 샘플링 비율 over-fitting방지
일반적으로 0.5 ~ 1을 사용
colsample_bytree[default=1] : 각 트리마다 feature 샘플링 비율
일반적으로 0.5 ~ 1을 사용한다.
reg_lambda [default=1] : L2 규제(Ridge)
reg_alpha [default=0] : L1 규제(Lasso)
scale_pos_weight[default = 1] : 데이터가 불균형 할때 사용
보통은 음성 데이터 수 / 양성 데이터 수 값으로 한다.
데이터가 너무 많아서 GridSearchCV를 돌리는데 시간이 너무 오래 걸린다면 우선 트리 수를 줄이고, 기본적인 파라미터 튜닝만을 한 이후에 데이터를 모두 넣어 train시키는 것이 일반적이라 한다.
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV
xgb_model = XGBClassifier(n_estimators=100)
# 후보 파라미터 선정
params = {'max_depth':[5,7], 'min_child_weight':[1,3], 'colsample_bytree':[0.5,0.75]}
# gridsearchcv 객체 정보 입력(어떤 모델, 파라미터 후보, 교차검증 몇 번)
gridcv = GridSearchCV(xgb_model, param_grid=params, cv=3)
# 파라미터 튜닝 시작
gridcv.fit(X_train, y_train, early_stopping_rounds=30, eval_metric='auc', eval_set=[(X_val, y_val)])
#튜닝된 파라미터 출력
print(gridcv.best_params_)
# 1차적으로 튜닝된 파라미터를 가지고 객체 생성
xgb_model = XGBClassifier(n_estimators=1000, learning_rate=0.02, max_depth=7, min_child_weight=1, colsample_bytree=0.75, reg_alpha=0.03)
# 학습
xgb_model.fit(X_train, y_train, early_stopping_rounds=200, eval_metric='auc', eval_set=[(X_val, y_val)])