caret 없이 XGBoost (이하 XGB) 실행해보기. Hyperparameter 튜닝은 RF(random forest)에 비하면 훨씬 많다. 주로 참고한 블로그 링크는 다음과 같음.
https://apple-rbox.tistory.com/6
library('xgboost')
xgboost()와 xgboost.train()은 기능은 거의 같다. xgboost.train()이 옵션이 좀 더 자세하다고 한다. 기본적으로 신경써 주어야 하는 것은 다음과 같다.
- 데이터와 라벨이 분리가 되어야 한다.
- 데이터는 매트릭스 형태로 지정되어야 한다.
- 라벨은 벡터(쉽게 말해 정수형태)로 입력이 되어야 하는데 0부터 시작해야 한다.
- cross validation (CV)을 위하여 xgb.cv() 함수를 제공해 주고 있다. 별도의 코딩이 없어도 된다는 것은 장점인데, 다른 모델과 비교해야 한다고 하면 단점이 될 수 도 있다.
참고한 블로그에서는 iris 데이터를 이용하였다. 데이터를 분할한다.
x = iris %>% select(-Species) %>% data.matrix
y = iris$Species
어짜피 CV 방법을 무엇인가는 지정해 주어야 한다. 여기서 N-fold CV를 이용하고 있으니까, 그냥 이걸 이용한다. early stopping 옵션도 있다.
cv_model1 =
xgb.cv(
data = x,
label = as.numeric(y)-1,
num_class = levels(y) %>% length,
nfold = 5,
nrounds = 200,
early_stopping_rounds = 150,
objective = 'multi:softprob',
eval_metric = 'mlogloss',
verbose = F,
prediction = T)
xgboost 의 설명서(vignette)를 찾아보면 더 많은 옵션이 있는 것을 알 수 있다. 나는 아마 objective에 ‘binary:logistic’을 실제로 이용하지 않을까 싶다. eval_metric dms ‘error’나 ‘auc’를 이용할 것 같다.
만들어진 모델로 결과를 예측하려면 predict()를 이용한다. 설명서의 예시는 다음과 같다.
bst <- xgboost(data = train$data, label = train$label, max_depth = 2,
eta = 0.5, nthread = 2, nrounds = 5, objective = "binary:logistic")
pred <- predict(bst, test$data)
하이퍼파라미터 튜닝 항목은 많다. eta, gamma, max_depth 등등등… 보통은 eta와 gamma를 이용하는 것 같다. 편하게 for 문을 이용한다. 이게 불편한 방법이지만 분석 환경을 고려해야 한다. 모델을 생성하면 evaluation_log 부분이 있는데 여기에서 수치를 추출한다. 앞에는 train 2개, 뒤에는 test 2개가 있다. 평균값을 선택한다.
XGB에서는 변수 중요도를 확인할 수 있다고 한다. xgb.cv()는 결과를 받을 수 없고, xgboost의 모델을 이용해야 한다고 한다. 즉, CV로 평가된 결과가 아니라 원자료들로만 구성된 그런 모델만 쓸 수 있다는 의미.
> xgb.importance(model = bst)
Feature Gain Cover Frequency
1: odor=none 0.67615471 0.4978746 0.4
2: stalk-root=club 0.17135375 0.1920543 0.2
3: stalk-root=rooted 0.12317236 0.1638750 0.2
4: spore-print-color=green 0.02931918 0.1461960 0.2