Как создать собственную модель (используя трюк петли / подмодели в карете) - PullRequest
0 голосов
/ 27 августа 2018

Я борюсь с этим вопросом смущающе долгое время.Я чувствую себя абсолютным кретином, поскольку ответ, вероятно, до боли очевиден, но я не могу найти ни одной темы, объясняющей, как это сделать.

Часть документации о создании пользовательских моделей выглядит для меня как this .Я чувствую, что где-то во время обучения я пропустил какой-то очень специфический урок, который сейчас все помнят, кроме меня, потому что все, что я нахожу, это «да, просто создайте пользовательскую модель и все готово».

Я хочу получить прогнозы для каждой отдельной итерации gbm в caretgbm я могу просто использовать, например, n.trees в predict(..., n.trees = 1:100), и это сделано.

В caret очевидно, потому что мне нужно использовать что-то под названием трюк подмоделей, что означает - если яправильно понимаю - что мне нужно создать свою собственную модель.

Но в getModelInfo('gbm') я вижу, что есть какая-то функция цикла!

$gbm$loop
function (grid) 
{
    loop <- plyr::ddply(grid, c("shrinkage", "interaction.depth", 
        "n.minobsinnode"), function(x) c(n.trees = max(x$n.trees)))
    submodels <- vector(mode = "list", length = nrow(loop))
    for (i in seq(along = loop$n.trees)) {
        index <- which(grid$interaction.depth == loop$interaction.depth[i] & 
            grid$shrinkage == loop$shrinkage[i] & grid$n.minobsinnode == 
            loop$n.minobsinnode[i])
        trees <- grid[index, "n.trees"]
        submodels[[i]] <- data.frame(n.trees = trees[trees != 
            loop$n.trees[i]])
    }
    list(loop = loop, submodels = submodels)

Как использоватьтот?Почему он не работает по умолчанию?Нужно ли мне создавать собственную модель - или, может быть, нет?

Отказ от ответственности 1: Я не хочу использовать перекрестную проверку.Я просто хочу выводить прогнозы для каждой итерации одного прогона gbm.

Отказ от ответственности 2: Я не хочу использовать predict.gbm() на $finalModel, так как я хочу также протестировать некоторые другие алгоритмы, который также использует этот трюк подмодели.Я не хочу использовать все различные специфичные для алгоритма функции predict(), потому что тогда зачем мне вообще беспокоиться о каретке.

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

1 Ответ

0 голосов
/ 27 августа 2018

Вот пример того, как вывести желаемые прогнозы для тестовых данных для каждого дерева:

library(caret)
library(mlbench) #for the data set
data(Sonar) #some data set I always use on stack overflow

res <- train(Class~.,
             data = Sonar,
             method = "gbm",
             trControl = trainControl(method = "cv", #some evaluations scheme
                                      number = 5,
                                      savePredictions = "all"), #tell caret you would like to save all,
             tuneGrid = expand.grid(shrinkage = 0.01,
                                    interaction.depth = 2, 
                                    n.minobsinnode = 10,
                                    n.trees = 1:100)) #some random values and all the trees

res$pred #results are stored in here

В основном код, который вы показываете в посте, предупреждает, что не нужно настраивать все модели n.treeа лучше просто настроить значение max(n.trees) для каждой комбинации гиперпараметров, а затем использовать его для получения прогнозов для n.trees < max(n.trees)

некоторого графика

library(ggplot2)

ggplot(res$results)+
  geom_line(aes(x = n.trees, y = Accuracy))

enter image description here

Вы также можете отказаться от savePredictions = "all", так как это создает объект поезда, требующий памяти.Но лучше использовать res$results, в котором вы будете вычислять все нужные метрики.

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