2017-01-23 3 views
0

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

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

Что было бы лучшим способом достичь этого?

Это будет несколько соответствовать критериям ранней остановки, но не точно.

В качестве альтернативы, если есть возможность получить модель из промежуточного раунда?

Вот пример, чтобы лучше объяснить вопрос. (На примере игрушка, которая поставляется с xgboost помощи документации и использование eval_metric по умолчанию)

library(xgboost) 
data(agaricus.train, package='xgboost') 
train <- agaricus.train 
bstSparse <- xgboost(data = train$data, label = train$label, max.depth = 2, eta = 1, nthread = 2, nround = 5, objective = "binary:logistic") 

Вот выход

[0] train-error:0.046522 
[1] train-error:0.022263 
[2] train-error:0.007063 
[3] train-error:0.015200 
[4] train-error:0.007063 

Теперь давайте говорить от области знания, которые я знаю, что когда-то ошибка поезд идет ниже 0,015 (третий раунд в этом случае), любые дальнейшие раунды только приводят к перестановке. Как остановить процесс обучения после третьего раунда и получить подготовленную модель, чтобы использовать ее для прогнозирования по другому набору данных?

Мне нужно запустить процесс обучения по множеству разных наборов данных, и я не знаю, сколько раундов он может предпринять для обучения, чтобы получить ошибку ниже фиксированного числа, поэтому я не могу установить аргумент nrounds на предопределенный стоимость. Только интуиция, которую я имею, заключается в том, что после того, как ошибка обучения будет ниже числа, мне нужно прекратить дальнейшие тренировочные раунды.

ответ

0
# In the absence of any code you have tried or any data you are using then try something like this: 

require(xgboost) 
library(Metrics) # for rmse to calculate errors 

# Assume you have a training set db.train and have some feature indices of interest and a test set db.test 
    predz <- c(2,4,6,8,10,12) 
    predictors <- names(db.train[,predz]) 
# you have some response you are interested in 
    outcomeName <- "myLabel" 

# you may like to include for testing some other parameters like: eta, gamma, colsample_bytree, min_child_weight 

    # here we look at depths from 1 to 4 and rounds 1 to 100 but set your own values 

     smallestError <- 100 # set to some sensible value depending on your eval metric 

     for (depth in seq(1,4,1)) { 
     for (rounds in seq(1,100,1)) { 

        # train 
        bst <- xgboost(data = as.matrix(db.train[,predictors]), 
            label = db.train[,outcomeName], 
            max.depth = depth, nround = rounds, 
            eval_metric = "logloss", 
            objective = "binary:logistic", verbose=TRUE) 
        gc() 

        # predict 
        predictions <- as.numeric(predict(bst, as.matrix(db.test[,predictors]), outputmargin=TRUE)) 
        err <- rmse(as.numeric(db.test[,outcomeName]), as.numeric(predictions)) 

        if (err < smallestError) { 
          smallestError = err 
          print(paste(depth,rounds,err)) 
        }  
       } 
     } 

# You could adapt this code for your particular evaluation metric and print this out to suit your situation. Similarly you could introduce a break in the code when some specified number of rounds is reached that satisfies some condition you seek to achieve. 
+0

Спасибо за ваш ответ. Если я правильно понимаю, код, который у вас есть, включает в себя повторное обучение модели с увеличением числа раундов и прекращение, когда ошибка становится ниже отсечки. Есть ли способ запустить модель только один раз, вычисляя eval_metric после каждого раунда, а затем сохраняя модель, когда eval_metric идет ниже отсечки. –

+0

Возможно, вам потребуется перечитать документацию xgboost. Xgboost использует итеративный подход для получения полезной модели. Каждый раунд приближается к некоторому уровню ошибки, с которым вам удобно: баланс времени для создания модели и сложности модели, соответствующей вашей ситуации. Я не думаю, что вы можете заранее знать «правильную» модель. Опять же, в отсутствие какого-либо из вашего кода или какого-либо образца набора данных мне сложно знать, что вы спрашиваете –

+0

Я добавил пример на мой вопрос - надеюсь, он объясняет мой вопрос лучше –

Смежные вопросы