Xgboost पेड़ों के हाइपरपैरामीटर कैसे ट्यून करें?


68

मेरे पास एक वर्ग असंतुलित डेटा है और मैं xgboost का उपयोग करके बढ़े हुए ट्रेस के हाइपरपैरामीटर को ट्यून करना चाहता हूं।

प्रशन

  1. क्या xgboost के लिए gridsearchcv या randomsearchcv के बराबर है?
  2. यदि नहीं, तो xgboost के मापदंडों को ट्यून करने के लिए अनुशंसित दृष्टिकोण क्या है?


धन्यवाद, लेकिन यह लिंक एक अलग मुद्दे पर चर्चा करता है और मेरे सवाल का जवाब नहीं देता है।
जॉर्जऑफTheRF

पैरामीटर का सटीक नामकरण है xgboost(max.depth)या xgb.train(max_depth)? क्या xgboost असंगत रूप से विभिन्न स्थानों में पैरामीटर के लिए डॉट बनाम अंडरस्कोर का उपयोग करता है? या वे रूपांतरित हैं?
5

1
@smci, "हेल्प" ("xgboost-deprecated") "
हेमंत

जवाबों:


82

के बाद से इंटरफ़ेस करने के लिए xgboostमें caretहाल ही में बदल गया है, यहाँ एक स्क्रिप्ट है कि का उपयोग करने का एक पूरी तरह से टिप्पणी की पूर्वाभ्यास प्रदान करता है caretधुन पर xgboostअति मानकों।

इसके लिए, मैं कैगल प्रतियोगिता "गिव मी सम क्रेडिट" से प्रशिक्षण डेटा का उपयोग करूंगा ।

1. एक xgboostमॉडल फिटिंग

इस अनुभाग में, हम:

  • xgboostमनमाने ढंग से हाइपरपैरामीटर के साथ एक मॉडल फिट करें
  • क्रॉस-वेलिडेशन ( xgb.cv) का उपयोग करके नुकसान (एयूसी-आरओसी) का मूल्यांकन करें
  • प्रशिक्षण बनाम परीक्षण मूल्यांकन मीट्रिक की साजिश रचें

ऐसा करने के लिए यहां कुछ कोड दिया गया है।

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

अंत में, आप AUC की विविधताओं के लिए बबलपॉट बना सकते हैं etaऔर max_depth:

यहाँ छवि विवरण दर्ज करें


क्या कैरेट अभी भी ग्रिड खोज के लिए एटा, गामा और अधिकतम गहराई का समर्थन करता है जो सबस्पम्पल और xgboost के अन्य मापदंडों के बारे में क्या है?
जॉर्जऑफTheRF

2
ज्यादातर xgboostमानकों के लिए @ML_Pro समर्थन अब मौजूद है, विशेष रूप gammaसे नए के लिए समर्थन है। यहाँ समर्थित मापदंडों की पूरी सूची है।
तक्षकवार्ती

यह xgboost द्वारा समर्थन सही है? मेरा सवाल यह है कि ग्रिड सर्च के लिए सभी पैरामीटर
किसके

1
बहुरंगी वर्गीकरण के लिए आवश्यक परिवर्तन क्या होंगे। इसके अलावा प्रलेखन का कहना है कि scale_pose_weightअसंतुलित वर्गीकरण के लिए उपयोग करें । क्या आप विवरण प्रदान कर सकते हैं कि कैसे? धन्यवाद!
शिष्य अंक

1
असंतुलित श्रेणी के मुद्दे के लिए, scale_pos_weightअब पैरामीटर प्रलेखन में प्रलेखित हैscale_pos_weightएक कैरेट ट्यूनिंग पैरामीटर नहीं है, लेकिन आप मैन्युअल रूप से तुलना कर सकते हैं। मेरे मामले में, वजन का उपयोग करने से बहुत कम प्रभाव हुआ (द्विआधारी वर्गीकरण,> 20% सकारात्मक)
जीनोरमा

24

कैरेट पैकेज में 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 के अन्य मापदंडों जैसे कि सबसम्प्लिमेंट आदि वर्तमान में कैरेट द्वारा समर्थित नहीं हैं।

संपादित करें

गामा, colsample_bytree, min_child_weight और सदस्यता आदि अब कैरेट का उपयोग करके सीधे (जून 2017) ट्यून किए जा सकते हैं। उन्हें काम करने के लिए उपरोक्त कोड के ग्रिड भाग में जोड़ें। टिप्पणी में इसे हाइलाइट करने के लिए धन्यवाद us Thanksr11852।


4
उल्लेखित खामी के संबंध में एक मामूली अद्यतन। caretअब (Feb-2017) के लिए अतिरिक्त पैरामीटर का समर्थन करता है gamma, colsample_bytree, min_child_weightऔर subsample। (इतनी प्रभावी ढंग से आप लगभग सब कुछ - दिए गए समय को ट्यून कर सकते हैं)
us11r11852

10

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मैं ऊपर के लोगों से एक अलग विधि का उपयोग करता हूं। मैं इष्टतम मापदंडों को खोजने के लिए बायेसियन ऑप्टिमाइज़ेशन पैकेज से बायेसियनओप्टिमाइज़ेशन फ़ंक्शन का उपयोग करता हूं। ऐसा करने के लिए, आप सबसे पहले क्रॉस वेलिडेशन फोल्ड बनाते हैं, फिर एक ऐसा फंक्शन बनाते हैं, xgb.cv.bayesजिसमें आप जिस हाइपर पैरामीटर को बदलना चाहते हैं, वह पैरामीटर है। इस उदाहरण में मैं ट्यूनिंग हूँ max.depth, min_child_weight, subsample, colsample_bytree, gamma। आप तब xgb.cvउस फ़ंक्शन में कॉल करते हैं जिसके इनपुट पैरामीटर में हाइपर पैरामीटर सेट होते हैं xgb.cv.bayes। फिर आप बूस्टिंग हाइपर मापदंडों के वांछित रेंज के BayesianOptimizationसाथ कॉल करते हैं xgb.cv.bayesinit_pointsनिर्दिष्ट सीमाओं से यादृच्छिक रूप से लिए गए हाइपर मापदंडों के साथ प्रारंभिक मॉडल की संख्या है, औरn_iterप्रारंभिक बिंदुओं के बाद मॉडलों के दौर की संख्या है। फ़ंक्शन सभी बूस्टिंग मापदंडों और परीक्षण एयूसी को आउटपुट करता है।

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
यह एक अच्छा दृष्टिकोण है, लेकिन एक चेतावनी है : आर पैकेज rBayesianOptimization, नवीनतम CRAN संस्करण 1.1.0 के रूप में (जो 2 वर्षों में अद्यतन नहीं किया गया है), पायथन की तुलना में कोई परीक्षण और अधिक प्रतिबंधात्मक लाइसेंस नहीं है विधि के मूल लेखकों द्वारा पैकेज, जिसमें परीक्षण हैं। Github.com/fmfn/BayesianOptimization देखें ।
ईघाथा

8

यह एक पुराना प्रश्न है, लेकिन मुझे लगा कि मैं साझा करूंगा कि मैं कैसे xgboost मापदंडों को ट्यून करता हूं। मैंने मूल रूप से सोचा था कि मैं इसके लिए कैरट का उपयोग करूंगा लेकिन हाल ही में एक मुद्दा मिला जो सभी मापदंडों के साथ-साथ लापता मूल्यों को भी संभाल रहा था। मैं मापदंडों के विभिन्न संयोजनों के माध्यम से एक पुनरावृत्त लूप लिखने पर भी विचार कर रहा था, लेकिन यह समानांतर में चलना चाहता था और इसके लिए बहुत अधिक समय की आवश्यकता होगी। NMOF पैकेज से ग्रिडसर्च का उपयोग करना दोनों दुनिया (सभी मापदंडों और साथ ही समानांतर प्रसंस्करण) से सर्वश्रेष्ठ प्रदान करता है। यहाँ द्विआधारी वर्गीकरण के लिए उदाहरण कोड है (विंडोज़ और लिनक्स पर काम करता है):

# 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.