Xgboost ağaçlarının hiperparametreleri nasıl ayarlanır?


68

Sınıfta dengesiz bir veri var ve yükseltilmiş tressin hiperparametrelerini xgboost kullanarak ayarlamak istiyorum.

Sorular

  1. Xgboost için bir gridsearchcv veya randomsearchcv eşdeğeri var mı?
  2. Değilse, xgboost parametrelerini ayarlamak için önerilen yaklaşım nedir?


Teşekkürler ama bu bağlantı farklı bir konuyu tartışıyor ve sorumu cevaplamıyor.
GeorgeOfTheRF 12:15

Parametrenin tam adı mı xgboost(max.depth)yoksa xgb.train(max_depth)? Xgboost, farklı yerlerde parametre için tutarsız bir şekilde nokta - alt çizgi kullanıyor mu? Yoksa onlar dönüştürülüyor mu?
smci

1
@smci, "yardım (" xgboost-deprecated ")" kontrol edin
Hemant Rupani

Yanıtlar:


82

Arayüz için yana xgboostiçinde caretson zamanlarda değişti, burada kullanmanın tam yorumladı açıklayan yönergeler içerir bir script caretayarlamak için xgboosthiper parametreler.

Bunun için Kaggle yarışmasının "Bana Biraz Kredi Ver" yarışmasının eğitim verilerini kullanacağım .

1. Bir xgboostmodelin takılması

Bu bölümde biz:

  • xgboostkeyfi hiperparametreleri olan bir modele sığabilecek
  • Çapraz doğrulama ( xgb.cv) kullanarak kaybı (AUC-ROC) değerlendirin
  • Eğitim ve test değerlendirme metriklerini çizin

İşte bunu yapmak için bazı kodlar.

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'nin eğitimine karşı sınava bakışı şöyle:

görüntü tanımını buraya girin

2. Hiperparametre kullanarak arama train

Hiperparametre araması için aşağıdaki adımları uygularız:

  • data.frameeğitimli modeller için istediğimiz benzersiz bir kombinasyon kombinasyonunu yarattık .
  • Çapraz doğrulama parametreleri de dahil olmak üzere her modelin eğitimi için geçerli olan kontrol parametrelerini ve AUC'nin hesaplanabilmesi için olasılıkların hesaplandığını belirtin
  • Her model için AUC'yi kaydederek her parametre birleşimi için modelleri çapraz doğrulayın ve eğitin.

İşte bunun nasıl yapılacağını gösteren bir kod.

# 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")

Son olarak, varyasyonları üzerinde AUC için bubbleplot oluşturabilir etave max_depth:

görüntü tanımını buraya girin


Şapka hala sadece eta, gama ve grid arama için maksimum derinliği destekliyor mu?
GeorgeOfTheRF

2
@ML_Pro Çoğu xgboostparametre için destek var, özellikle desteği gammayeni. İşte desteklenen parametrelerin tam listesi.
tchakravarty

Bu xgboost tarafından sağlanan destek değil mi? Sorum tüm parametreler ızgara arama için şapka destekliyor hangi hakkındadır
GeorgeOfTheRF

1
Çok sınıflı sınıflandırma için gerekli değişiklikler ne olurdu. Ayrıca belgeler scale_pose_weightdengesiz sınıflandırma için kullanıldığını söylüyor . Nasıl yapılacağı hakkında ayrıntılı bilgi verebilir misiniz? Teşekkürler!
discipulus

1
Dengesiz sınıf sorunu için, scale_pos_weightşimdi parametre belgelerinde belgelenmiştir . scale_pos_weightbir şapka ayarı parametresi değildir, ancak manuel olarak karşılaştırabilirsiniz. Benim durumumda, ağırlığın kullanılmasının çok az etkisi oldu (ikili sınıflandırma,>% 20 pozitif)
geneorama

24

Caret paketinde xgboost var.

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
    )

Örnek çıktı

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

Gördüğüm bir dezavantaj, alt örnek vb. Gibi diğer xgboost parametrelerinin şu anda caret tarafından desteklenmediğidir.

Düzenle

Gamma, colsample_bytree, min_child_weight ve alt örnek vb. Şimdi (Haziran 2017) doğrudan Caret kullanılarak ayarlanabilir. Onları çalışması için yukarıdaki kodun ızgara kısmına eklemeniz yeterli. Yorumunuzda vurguladığınız için teşekkür ederiz.


4
Söz konusu dezavantaj ile ilgili küçük bir güncelleme. caretŞimdi (Şubat-2017) için ek parametreleri destekler gamma, colsample_bytree, min_child_weightve subsample. (Yani etkili bir şekilde hemen hemen her şeyi ayarlayabilirsin - verilen süre)
usεr11852 diyor Reinstate Monic

10

Bunun eski bir soru olduğunu biliyorum, ancak yukarıdakilerden farklı bir yöntem kullanıyorum. En iyi parametreleri bulmak için Bayesian Optimizasyon paketindeki BayesianOptimization işlevini kullanıyorum. Bunu yapmak için önce çapraz doğrulama katlamaları yaratır, ardından xgb.cv.bayesdeğiştirmek istediğiniz hiper parametrelerini yükselten parametrelere sahip bir fonksiyon yaratırsınız. Bu örnekte ayar yapıyorum max.depth, min_child_weight, subsample, colsample_bytree, gamma. Daha sonra xgb.cvbu fonksiyona, giriş parametrelerinde ayarlanan hiper parametrelerle çağırın xgb.cv.bayes. Ardından BayesianOptimization, xgb.cv.bayesve yükselten hiper parametrelerinin istenen aralıklarıyla çağırırsınız . init_pointsBelirtilen aralıklardan rastgele alınan hiper parametreli ilk modellerin sayısı ven_iterbaşlangıç ​​noktalarından sonraki model tur sayısıdır. Fonksiyon, tüm yükseltme parametrelerini ve AUC testini verir.

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
Bu iyi bir yaklaşım, ancak bir uyarı var : En son CRAN sürüm 1.1.0'dan (2 yıldan beri güncellenmemiş) R paketi rBayesianOptimization, Python'dan daha fazla test ve kısıtlayıcı lisansa sahip değil. Test edilen yöntemin orijinal yazarları tarafından paketlenir. Bakınız github.com/fmfn/BayesianOptimization .
egnha

8

Bu eski bir soru ama xgboost parametrelerini nasıl ayarlayacağımı paylaşacağımı düşündüm. Başlangıçta bunun için şapka kullanırım diye düşündüm, ancak son zamanlarda tüm parametrelerin yanı sıra eksik değerleri de içeren bir sorun buldum. Ayrıca, farklı parametre kombinasyonları üzerinden yinelenen bir döngü yazmayı düşünüyordum ancak paralel olarak çalışmasını istedim ve çok fazla zaman gerektiriyordu. NMOF paketinden gridSearch kullanmak, her iki dünyanın da en iyisini sağladı (tüm parametrelerin yanı sıra paralel işleme). İkili sınıflandırma için örnek kod: (Windows ve Linux üzerinde çalışır):

# 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.