Обучение и прогнозирование с Xgboost в R - PullRequest
1 голос
/ 05 апреля 2020

У меня есть один вопрос, связанный с перекрестной проверкой, настройкой, обучением и прогнозированием модели при использовании пакета и функции xgb.cv в .

В частности, я повторно использовал и адаптировал код из inte rnet, чтобы найти лучший параметр в пространстве параметров (настройка), используя xgb.cv в задаче классификации.

Здесь вы можете найти код, используемый для выполнения этой задачи:

# *****************************
# *******  TUNING  ************
# *****************************
start_time <- Sys.time()

best_param <- list()
best_seednumber <- 1234
best_acc <- 0
best_acc_index <- 0

set.seed(1234)
# In reality, might need 100 or 200 iters
for (iter in 1:200) {
  param <- list(objective = "binary:logistic",
                eval_metric = c("error"),      # rmse is used for regression
                max_depth = sample(6:10, 1),
                eta = runif(1, .01, .1),   # Learning rate, default: 0.3
                subsample = runif(1, .6, .9),
                colsample_bytree = runif(1, .5, .8), 
                min_child_weight = sample(5:10, 1), # These two are important
                max_delta_step = sample(5:10, 1) # Can help to focus error
                # into a small range.
  )
  cv.nround <-  1000
  cv.nfold <-  10 # 10-fold cross-validation
  seed.number  <-  sample.int(10000, 1) # set seed for the cv
  set.seed(seed.number)
  mdcv <- xgb.cv(data = dtrain, params = param,  
                 nfold = cv.nfold, nrounds = cv.nround,
                 verbose = F, early_stopping_rounds = 20, maximize = FALSE,
                 stratified = T)

  max_acc_index  <-  mdcv$best_iteration
  max_acc <- 1 - mdcv$evaluation_log[mdcv$best_iteration]$test_error_mean
  print(i)
  print(max_acc)
  print(mdcv$evaluation_log[mdcv$best_iteration])

  if (max_acc > best_acc) {
    best_acc <- max_acc
    best_acc_index <- max_acc_index
    best_seednumber <- seed.number
    best_param <- param
  }
}

end_time <- Sys.time()

print(end_time - start_time)    # Duration -> 1.54796 hours

Примерно через 1,5 часа этот код возвращает мне лучшие параметры в настройке перекрестной проверки. Я также могу воспроизвести точность, полученную в l oop и лучших параметрах.

# Reproduce what found in loop
set.seed(best_seednumber)
best_model_cv <- xgb.cv(data=dtrain, params=best_param, nfold=cv.nfold, nrounds=cv.nround,
                     verbose = T, early_stopping_rounds = 20, maximize = F, stratified = T,
                     prediction=TRUE)
print(best_model_cv)
best_model_cv$params

Теперь я хочу использовать эти «лучшие параметры», чтобы тренировать свой полный тренировочный набор, используя либо xgboost или xgb.train и сделать на наборе тестовых данных.

best_model <- xgboost(params = best_param, data=dtrain,
                      seed=best_seednumber, nrounds=10)

На данный момент, я не уверен, является ли этот код для обучения правильным и каковы параметры что я должен использовать в течение xgboost. Проблема в том, что когда я запускаю это обучение и затем делаю свои прогнозы в наборе тестовых данных, мой классификатор в основном классифицирует почти все новые экземпляры в одном классе (что невозможно, поскольку я также использовал другие модели, которые в принципе дают точные классификационные показатели).

Итак, подведем итог, мои вопросы:

  1. Как я могу использовать параметры обучения, полученные из перекрестного Этап проверки в обучающей функции пакета ?

  2. Поскольку я довольно новичок в этой области, можете ли вы подтвердить, что я должен предварительно обработать свои данные испытаний установить, как я предварительно обработал свой учебный набор данных (преобразования, проектирование объектов и т. д.)?

Я знаю, что мой код не воспроизводится, но меня больше интересует использование функция, так что я думаю, на данном этапе это не критично.

Спасибо.

1 Ответ

0 голосов
/ 06 апреля 2020

В конце была ошибка в определении моего набора тестовых данных, которая вызвала проблему. Нет ничего плохого в том, как я определил параметры модели тренировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...