এক্সজিবিস্ট গাছের হাইপারপ্যারামিটার টিউন করবেন কীভাবে?


68

আমার একটি শ্রেণির ভারসাম্যহীন ডেটা রয়েছে এবং আমি এক্সজিবিস্ট ব্যবহার করে উত্সাহিত ট্রেসের হাইপারপ্যারামিটারগুলি টিউন করতে চাই।

প্রশ্নাবলি

  1. Xbboost এর জন্য গ্রিডসার্কভি বা র্যান্ডমসার্কসিভের সমতুল্য কি আছে?
  2. যদি না হয় তবে এক্সজিবিস্টের প্যারামিটারগুলি টিউন করার জন্য প্রস্তাবিত পদ্ধতিটি কী?


ধন্যবাদ তবে সেই লিঙ্কটি একটি আলাদা সমস্যা নিয়ে আলোচনা করে এবং আমার প্রশ্নের উত্তর দেয় না।
জর্জিফ অফআরএফ

প্যারামিটারটির সঠিক নামকরণ xgboost(max.depth)নাকি xgb.train(max_depth)? Xgboost কি বিভিন্ন জায়গায় প্যারামিটারের জন্য ডট বনাম আন্ডারস্কোরটি বেমানান করে? না তারা রূপান্তরিত হয়?
স্মি

1
@ এসএমসি, "সহায়তা (" এক্সজিবিস্ট-অবমূল্যায়ন ")" দেখুন "
হেমন্ত রূপানী

উত্তর:


82

যেহেতু ইন্টারফেসে xgboostমধ্যে caretসম্প্রতি পরিবর্তিত হয়েছে, এখানে একটি স্ক্রিপ্ট যে ব্যবহারের একটি সম্পূর্ণরূপে মন্তব্য, walkthrough প্রদান করে 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()

প্রশিক্ষণ বনাম প্রশিক্ষণ এওসি দেখতে দেখতে এখানে রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

2. হাইপারপ্যারামিটার অনুসন্ধান ব্যবহার করে train

হাইপারপ্যারামিটার অনুসন্ধানের জন্য, আমরা নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করি:

  • data.frameপ্যারামিটারগুলির অনন্য সংমিশ্রণগুলির সাথে একটি তৈরি করুন যার জন্য আমরা প্রশিক্ষিত মডেলগুলি চাই।
  • ক্রস-বৈধকরণের প্যারামিটারগুলি সহ প্রতিটি মডেলের প্রশিক্ষণে প্রযোজ্য নিয়ন্ত্রণ পরামিতিগুলি নির্দিষ্ট করুন এবং উল্লেখ করুন যে সম্ভাবনাগুলি গণনা করা হবে যাতে এটিউসিটি গণনা করা যায়
  • প্রতিটি প্যারামিটার সংমিশ্রণের জন্য প্রতিটি মডেলের জন্য এটিউ সংরক্ষণ করে ক্রস-বৈধকরণ এবং প্রশিক্ষণ দিন।

এখানে কিছু কোড রয়েছে যা এটি কীভাবে করবে তা দেখায়।

# 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 জন্য bubbleplot তৈরি করতে পারেন etaএবং max_depth:

এখানে চিত্র বর্ণনা লিখুন


ক্যারেটটি কেবল গ্রাড অনুসন্ধানের জন্য কেবল এটা, গামা এবং সর্বাধিক গভীরতার সমর্থন করে কি সাবজিওয়াল এবং এক্সজিবিস্টের অন্যান্য পরামিতিগুলি সম্পর্কে কী?
জর্জফফ আরআরএফ

2
@ML_Pro বেশিরভাগ xgboostপরামিতিগুলির জন্য সমর্থন এখন বিদ্যমান, বিশেষত সমর্থনটি gammaনতুন। সমর্থিত পরামিতিগুলির একটি সম্পূর্ণ তালিকা এখানে
tchakravarty

এটি ঠিক এক্সজিস্ট দ্বারা সমর্থন? আমার প্রশ্নটি যা সম্পর্কে সমস্ত প্যারামিটারগুলি গ্রিড অনুসন্ধানের জন্য ক্যারেট সমর্থন করে
জর্জআফএআরএফ এফ

1
মাল্টিক্লাস শ্রেণিবিন্যাসের জন্য প্রয়োজনীয় পরিবর্তনগুলি কী হবে। এছাড়াও ডকুমেন্টেশন বলে scale_pose_weightভারসাম্যহীন শ্রেণিবদ্ধকরণের জন্য ব্যবহার । কিভাবে আপনি বিশদ প্রদান করতে পারেন? ধন্যবাদ!
শিষ্য

1
ভারসাম্যহীন শ্রেণির ইস্যুটির জন্য, scale_pos_weightএখন প্যারামিটার ডকুমেন্টেশনে নথিভুক্ত করা হয়scale_pos_weightক্যারেট টিউনিং প্যারামিটার নয়, তবে আপনি ম্যানুয়ালি তুলনা করতে পারেন। আমার ক্ষেত্রে, ওজন ব্যবহারের খুব কম প্রভাব
পড়েছে

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

একটি ত্রুটি আমি দেখতে পাচ্ছি যে এক্সজিবিস্টের অন্যান্য পরামিতি যেমন সাবমেল ইত্যাদি etc বর্তমানে ক্যারেট দ্বারা সমর্থিত নয়।

সম্পাদন করা

গামা, কলসাম্পল_বাইট্রি, মিনি_চাইল্ড_ওয়েট এবং সাবসম্পেল ইত্যাদি এখন (জুন ২০১)) ক্যারেট ব্যবহার করে সরাসরি টিউন করা যায়। এটি কার্যকর করতে উপরের কোডটির গ্রিড অংশে কেবল তাদের যুক্ত করুন। এটিকে মন্তব্যে তুলে ধরার জন্য usεr11852 ধন্যবাদ।


4
উল্লিখিত ত্রুটি সম্পর্কিত একটি গৌণ আপডেট। caretNOW (ফেব্রুয়ারী-2017) এর জন্য অতিরিক্তি প্যারামিটার সমর্থন gamma, colsample_bytree, min_child_weightএবং subsample। (সুতরাং কার্যকরভাবে আপনি প্রায় প্রতিটি টিউন করতে পারেন - নির্দিষ্ট সময়)
usεr11852

10

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি উপরেরগুলির থেকে আলাদা পদ্ধতি ব্যবহার করি। আমি অনুকূল প্যারামিটারগুলি খুঁজতে বায়েসিয়ান অপটিমাইজেশন প্যাকেজ থেকে বয়েসিয়ানঅપ્টিমাইজেশন ফাংশনটি ব্যবহার করি। এটি করার জন্য, আপনি প্রথমে ক্রস বৈধকরণের ভাঁজগুলি তৈরি করেন, তারপরে এমন একটি ফাংশন তৈরি xgb.cv.bayesকরুন যা আপনাকে পরিবর্তন করতে চান এমন হাইপার প্যারামিটারগুলির উত্স হিসাবে প্যারামিটার রয়েছে। এই উদাহরণে আমি টিউন করছি max.depth, min_child_weight, subsample, colsample_bytree, gamma। এরপরে xgb.cvইনপুট প্যারামিটারগুলিতে সেট করা হাইপার প্যারামিটারগুলির সাথে আপনি সেই ফাংশনে কল করুন xgb.cv.bayes। তারপরে আপনি বুস্টিং হাইপার প্যারামিটারগুলির এবং পছন্দসই রেঞ্জগুলির BayesianOptimizationসাথে কল করুন call নির্দিষ্ট রেঞ্জগুলি থেকে এলোমেলোভাবে নেওয়া হাইপার প্যারামিটার সহ প্রাথমিক মডেলের সংখ্যা এবংxgb.cv.bayesinit_pointsn_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
এটি একটি ভাল পন্থা, কিন্তু একটা হয় সতর্কীকরণ : জনপ্রিয় সাম্প্রতিক Cran সংস্করণ 1.1.0 (যা 2 বছর ওভারে আপডেট করা হয়েছে) হিসাবে আর প্যাকেজ rBayesianOptimization, কোন পরীক্ষা এবং পাইথন বেশি নিয়ন্ত্রণমূলক লাইসেন্স আছে পদ্ধতির মূল লেখকদের দ্বারা প্যাকেজ, যার পরীক্ষা রয়েছে। Github.com/fmfn/BayesianOptimization দেখুন ।
egnha

8

এটি একটি পুরানো প্রশ্ন তবে ভেবেছিলাম আমি কীভাবে এক্সজি বুস্ট পরামিতিগুলি টিউন করব। আমি প্রাথমিকভাবে ভেবেছিলাম আমি এর জন্য ক্যারেট ব্যবহার করব তবে সম্প্রতি পরামিতিগুলির পাশাপাশি হারাতে থাকা মানগুলির মধ্যে একটি সমস্যা পাওয়া গেছে। আমি প্যারামিটারগুলির বিভিন্ন সংমিশ্রণের মাধ্যমে একটি পুনরাবৃত্তি লুপ লেখার বিষয়েও বিবেচনা করছিলাম তবে এটি চেয়েছিল যে এটি সমান্তরালে চলুক এবং খুব বেশি সময় প্রয়োজন require এনএমএফ প্যাকেজ থেকে গ্রিড অনুসন্ধান ব্যবহার করে উভয় দুনিয়া (সমস্ত প্যারামিটার পাশাপাশি সমান্তরাল প্রক্রিয়াকরণ) থেকে সেরা সরবরাহ করা হয়েছে। বাইনারি শ্রেণিবদ্ধকরণের জন্য উদাহরণ কোড এখানে রয়েছে (উইন্ডোজ এবং লিনাক্সে কাজ করে):

# 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.