xgboost 나무의 하이퍼 파라미터를 조정하는 방법?


68

클래스 불균형 데이터가 있으며 xgboost를 사용하여 증폭 된 머릿단의 하이퍼 파라미터를 조정하고 싶습니다.

질문

  1. xgboost에 대해 gridsearchcv 또는 randomsearchcv에 해당하는 것이 있습니까?
  2. 그렇지 않다면 xgboost의 매개 변수를 조정하는 권장 방법은 무엇입니까?


고맙지 만 그 링크는 다른 문제를 논의하고 내 질문에 대답하지 않습니다.
GeorgeOfTheRF

매개 변수의 정확한 이름인가 xgboost(max.depth)또는 xgb.train(max_depth)? xgboost가 다른 위치의 매개 변수에 대해 점 대 밑줄을 일관되게 사용합니까? 아니면 그들은 회심합니까?
smci

1
@smci, "help ("xgboost-deprecated ")"확인
Hemant Rupani

답변:


82

인터페이스가하기 때문에 xgboostcaret최근 변경, 여기에 사용하는 완전히 주석 연습 제공하는 스크립트입니다 caret조정에 xgboost하이퍼 매개 변수.

이를 위해 저는 Kaggle 대회 "Give Me Some Credit" 의 교육 데이터를 사용할 것 입니다.

1. xgboost모델 피팅

이 섹션에서 우리는 :

  • xgboost임의 하이퍼 파라미터가 있는 모델에 적합
  • 교차 검증 ( xgb.cv)을 사용하여 손실 (AUC-ROC) 평가
  • 교육 및 테스트 평가 메트릭스 플롯

이를 수행하는 코드는 다음과 같습니다.

library(caret)
library(xgboost)
library(readr)
library(dplyr)
library(tidyr)

# load in the training data
df_train = read_csv("04-GiveMeSomeCredit/Data/cs-training.csv") %>%
  na.omit() %>%                                                                # listwise deletion 
  select(-`[EMPTY]`) %>%
  mutate(SeriousDlqin2yrs = factor(SeriousDlqin2yrs,                           # factor variable for classification
                                   labels = c("Failure", "Success")))

# xgboost fitting with arbitrary parameters
xgb_params_1 = list(
  objective = "binary:logistic",                                               # binary classification
  eta = 0.01,                                                                  # learning rate
  max.depth = 3,                                                               # max tree depth
  eval_metric = "auc"                                                          # evaluation/loss metric
)

# fit the model with the arbitrary parameters specified above
xgb_1 = xgboost(data = as.matrix(df_train %>%
                                   select(-SeriousDlqin2yrs)),
                label = df_train$SeriousDlqin2yrs,
                params = xgb_params_1,
                nrounds = 100,                                                 # max number of trees to build
                verbose = TRUE,                                         
                print.every.n = 1,
                early.stop.round = 10                                          # stop if no improvement within 10 trees
)

# cross-validate xgboost to get the accurate measure of error
xgb_cv_1 = xgb.cv(params = xgb_params_1,
                  data = as.matrix(df_train %>%
                                     select(-SeriousDlqin2yrs)),
                  label = df_train$SeriousDlqin2yrs,
                  nrounds = 100, 
                  nfold = 5,                                                   # number of folds in K-fold
                  prediction = TRUE,                                           # return the prediction using the final model 
                  showsd = TRUE,                                               # standard deviation of loss across folds
                  stratified = TRUE,                                           # sample is unbalanced; use stratified sampling
                  verbose = TRUE,
                  print.every.n = 1, 
                  early.stop.round = 10
)

# plot the AUC for the training and testing samples
xgb_cv_1$dt %>%
  select(-contains("std")) %>%
  mutate(IterationNum = 1:n()) %>%
  gather(TestOrTrain, AUC, -IterationNum) %>%
  ggplot(aes(x = IterationNum, y = AUC, group = TestOrTrain, color = TestOrTrain)) + 
  geom_line() + 
  theme_bw()

AUC 테스트와 훈련은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

2. 하이퍼 파라미터 검색 train

하이퍼 파라미터 검색을 위해 다음 단계를 수행합니다.

  • data.frame훈련 된 모델에 원하는 고유 한 매개 변수 조합으로을 만듭니다 .
  • 교차 검증 매개 변수를 포함하여 각 모델의 학습에 적용되는 제어 매개 변수를 지정하고 확률을 계산하여 AUC를 계산할 수 있도록 지정하십시오.
  • 각 파라미터 조합에 대해 모델을 교차 검증하고 학습하여 각 모델에 대한 AUC를 저장합니다.

이 작업을 수행하는 방법을 보여주는 코드가 있습니다.

# set up the cross-validated hyper-parameter search
xgb_grid_1 = expand.grid(
  nrounds = 1000,
  eta = c(0.01, 0.001, 0.0001),
  max_depth = c(2, 4, 6, 8, 10),
  gamma = 1
)

# pack the training control parameters
xgb_trcontrol_1 = trainControl(
  method = "cv",
  number = 5,
  verboseIter = TRUE,
  returnData = FALSE,
  returnResamp = "all",                                                        # save losses across all models
  classProbs = TRUE,                                                           # set to TRUE for AUC to be computed
  summaryFunction = twoClassSummary,
  allowParallel = TRUE
)

# train the model for each parameter combination in the grid, 
#   using CV to evaluate
xgb_train_1 = train(
  x = as.matrix(df_train %>%
                  select(-SeriousDlqin2yrs)),
  y = as.factor(df_train$SeriousDlqin2yrs),
  trControl = xgb_trcontrol_1,
  tuneGrid = xgb_grid_1,
  method = "xgbTree"
)

# scatter plot of the AUC against max_depth and eta
ggplot(xgb_train_1$results, aes(x = as.factor(eta), y = max_depth, size = ROC, color = ROC)) + 
  geom_point() + 
  theme_bw() + 
  scale_size_continuous(guide = "none")

마지막으로 etaand 의 변형에 대해 AUC에 대한 버블 플롯을 만들 수 있습니다 max_depth.

여기에 이미지 설명을 입력하십시오


캐럿은 여전히 ​​그리드 검색을 위해 에타, 감마 및 최대 깊이 만 지원합니까?
GeorgeOfTheRF

2
@ML_Pro 대부분의 xgboost매개 변수에 대한 지원이 현재 존재하며 특히 gamma새로운 지원 이 제공됩니다. 다음 은 지원되는 매개 변수의 전체 목록입니다.
tchakravarty

그것은 xgboost의 지원입니까? 제 질문은 그리드 검색을 위해 캐럿을 지원하는 모든 매개 변수에 관한 것입니다.
GeorgeOfTheRF

1
멀티 클래스 분류에 필요한 변경 사항은 무엇입니까? 또한 문서에는 scale_pose_weight불균형 분류에 대한 사용법 이 나와 있습니다 . 방법에 대한 세부 정보를 제공 할 수 있습니까? 감사!
discipulus

1
불균형 클래스 문제의 경우 scale_pos_weight이제 매개 변수 documentation에 문서화되어 있습니다. scale_pos_weight캐럿 조정 매개 변수는 아니지만 수동으로 비교할 수 있습니다. 제 경우에는 가중치를 사용하는 것이 효과가 거의 없었습니다 (이진 분류,> 20 % 양성)
geneorama

24

Caret 패키지에는 xgboost가 통합되었습니다.

cv.ctrl <- trainControl(method = "repeatedcv", repeats = 1,number = 3, 
                        #summaryFunction = twoClassSummary,
                        classProbs = TRUE,
                        allowParallel=T)

    xgb.grid <- expand.grid(nrounds = 1000,
                            eta = c(0.01,0.05,0.1),
                            max_depth = c(2,4,6,8,10,14)
    )
    set.seed(45)
    xgb_tune <-train(formula,
                     data=train,
                     method="xgbTree",
                     trControl=cv.ctrl,
                     tuneGrid=xgb.grid,
                     verbose=T,
                     metric="Kappa",
                     nthread =3
    )

샘플 출력

eXtreme Gradient Boosting 

32218 samples
   41 predictor
    2 classes: 'N', 'Y' 

No pre-processing
Resampling: Cross-Validated (3 fold, repeated 1 times) 
Summary of sample sizes: 21479, 21479, 21478 
Resampling results

  Accuracy   Kappa      Accuracy SD   Kappa SD   
  0.9324911  0.1094426  0.0009742774  0.008972911

내가 본 한 가지 단점은 하위 샘플 등과 같은 xgboost의 다른 매개 변수가 현재 캐럿에서 지원되지 않는다는 것입니다.

편집하다

Caret를 사용하여 감마, colsample_bytree, min_child_weight 및 하위 샘플 등을 2017 년 6 월에 직접 조정할 수 있습니다. 위 코드의 그리드 부분에 추가하면 작동합니다. 댓글에 강조 표시해 주신 usrr5252에게 감사드립니다.


4
언급 된 단점에 관한 사소한 업데이트. caret현재 (2 월 2017)에 대한 추가 매개 변수를 지원 gamma, colsample_bytree, min_child_weightsubsample. (따라서 주어진 시간에 거의 모든 것을 효과적으로 조정할 수 있습니다)
usεr11852

10

나는 이것이 오래된 질문이라는 것을 알고 있지만 위의 방법과 다른 방법을 사용합니다. Bayesian Optimization 패키지의 BayesianOptimization 함수를 사용하여 최적의 매개 변수를 찾습니다. 이를 위해 먼저 교차 검증 폴드를 생성 한 다음 xgb.cv.bayes변경하려는 부스팅 하이퍼 파라미터를 파라미터로 포함 하는 함수를 생성합니다 . 이 예에서는 튜닝 중 max.depth, min_child_weight, subsample, colsample_bytree, gamma입니다. 그런 다음 xgb.cv의 입력 매개 변수에서 설정 한 하이퍼 매개 변수를 사용하여 해당 함수 를 호출 xgb.cv.bayes합니다. 그런 다음 원하는 및 부스팅 하이퍼 파라미터의 원하는 범위로 호출 BayesianOptimization합니다 xgb.cv.bayes. init_points지정된 범위에서 임의로 추출한 하이퍼 파라미터가있는 초기 모델의 수입니다.n_iter초기 포인트 이후의 모델 라운드 수입니다. 이 기능은 모든 부스팅 파라미터와 테스트 AUC를 출력합니다.

cv_folds <- KFold(as.matrix(df.train[,target.var]), nfolds = 5, 
                  stratified = TRUE, seed = 50)
xgb.cv.bayes <- function(max.depth, min_child_weight, subsample, colsample_bytree, gamma){
  cv <- xgv.cv(params = list(booster = 'gbtree', eta = 0.05,
                             max_depth = max.depth,
                             min_child_weight = min_child_weight,
                             subsample = subsample,
                             colsample_bytree = colsample_bytree,
                             gamma = gamma,
                             lambda = 1, alpha = 0,
                             objective = 'binary:logistic',
                             eval_metric = 'auc'),
                 data = data.matrix(df.train[,-target.var]),
                 label = as.matrix(df.train[, target.var]),
                 nround = 500, folds = cv_folds, prediction = TRUE,
                 showsd = TRUE, early.stop.round = 5, maximize = TRUE,
                 verbose = 0
  )
  list(Score = cv$dt[, max(test.auc.mean)],
       Pred = cv$pred)
}

xgb.bayes.model <- BayesianOptimization(
  xgb.cv.bayes,
  bounds = list(max.depth = c(2L, 12L),
                min_child_weight = c(1L, 10L),
                subsample = c(0.5, 1),
                colsample_bytree = c(0.1, 0.4),
                gamma = c(0, 10)
  ),
  init_grid_dt = NULL,
  init_points = 10,  # number of random points to start search
  n_iter = 20, # number of iterations after initial random points are set
  acq = 'ucb', kappa = 2.576, eps = 0.0, verbose = TRUE
)

1
이것은 좋은 접근 방법이지만 주의 사항이 있습니다 . 최신 CRAN 버전 1.1.0 (2 년 이상 업데이트되지 않은)의 R 패키지 rBayesianOptimization은 Python보다 테스트와 제한적인 라이센스가 없습니다. 테스트를 수행 한 메소드의 원래 작성자가 패키지합니다. github.com/fmfn/BayesianOptimization을 참조하십시오 .
egnha

8

이것은 오래된 질문이지만 xgboost 매개 변수를 조정하는 방법을 공유 할 것이라고 생각했습니다. 나는 원래 이것에 캐럿을 사용할 것이라고 생각했지만 최근에는 모든 매개 변수와 누락 된 값을 처리하는 문제를 발견했습니다. 또한 다른 매개 변수 조합을 통해 반복 루프를 작성하는 것을 고려하고 있었지만 병렬로 실행되기를 원했으며 너무 많은 시간이 필요했습니다. NMOF 패키지에서 gridSearch를 사용하면 두 가지 세계에서 가장 좋은 결과를 얻을 수 있습니다 (병렬 처리뿐만 아니라 모든 매개 변수). 바이너리 분류를위한 예제 코드는 다음과 같습니다 (Windows 및 Linux에서 작동).

# xgboost task parameters
nrounds <- 1000
folds <- 10
obj <- 'binary:logistic'
eval <- 'logloss'

# Parameter grid to search
params <- list(
  eval_metric = eval,
  objective = obj,
  eta = c(0.1,0.01),
  max_depth = c(4,6,8,10),
  max_delta_step = c(0,1),
  subsample = 1,
  scale_pos_weight = 1
)

# Table to track performance from each worker node
res <- data.frame()

# Simple cross validated xgboost training function (returning minimum error for grid search)
xgbCV <- function (params) {
  fit <- xgb.cv(
    data = data.matrix(train), 
    label = trainLabel, 
    param =params, 
    missing = NA, 
    nfold = folds, 
    prediction = FALSE,
    early.stop.round = 50,
    maximize = FALSE,
    nrounds = nrounds
  )
  rounds <- nrow(fit)
  metric = paste('test.',eval,'.mean',sep='')
  idx <- which.min(fit[,fit[[metric]]]) 
  val <- fit[idx,][[metric]]
  res <<- rbind(res,c(idx,val,rounds))
  colnames(res) <<- c('idx','val','rounds')
  return(val)
}

# Find minimal testing error in parallel
cl <- makeCluster(round(detectCores()/2)) 
clusterExport(cl, c("xgb.cv",'train','trainLabel','nrounds','res','eval','folds'))
sol <- gridSearch(
  fun = xgbCV,
  levels = params,
  method = 'snow',
  cl = cl,
  keepNames = TRUE,
  asList = TRUE
)

# Combine all model results
comb=clusterEvalQ(cl,res)
results <- ldply(comb,data.frame)
stopCluster(cl)

# Train model given solution above
params <- c(sol$minlevels,objective = obj, eval_metric = eval)
xgbModel <- xgboost(
  data = xgb.DMatrix(data.matrix(train),missing=NaN, label = trainLabel),
  param = params,
  nrounds = results[which.min(results[,2]),1]
)

print(params)
print(results)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.