Позволяет ли использование одного и того же объекта trainControl для перекрестной проверки при обучении нескольких моделей с помощью каретки для точного сравнения моделей? - PullRequest
0 голосов
/ 03 октября 2018

Я недавно углубился в пакет R caret, и у меня есть вопрос о воспроизводимости и сравнении моделей во время обучения, который я не смог точно определить.

Мое намерение состоит в том, чтобы каждый вызов train и, следовательно, каждая результирующая модель использовали одни и те же разбиения перекрестной проверки, чтобы первоначальные сохраненные результаты перекрестной проверки были сопоставимы с оценками вне выборкимодель, которая рассчитывается при строительстве.

Один из методов, которые я видел, состоит в том, что вы можете указывать начальное число перед каждым вызовом train следующим образом:

set.seed(1)
model <- train(..., trControl = trainControl(...))
set.seed(1)
model2 <- train(..., trControl = trainControl(...))
set.seed(1)
model3 <- train(..., trControl = trainControl(...))

Тем не менее, существует ли совместное использование объекта trainControl между *Вызовы 1012 * означают, что они обычно используют одинаковую повторную выборку и индексы, или я должен явно передать аргумент seeds в функцию.Имеет ли объект управления поездом случайные функции, когда он используется, или они установлены в объявлении?

Мой текущий метод:

set.seed(1)
train_control <- trainControl(method="cv", ...)
model1 <- train(..., trControl = train_control)
model2 <- train(..., trControl = train_control)
model3 <- train(..., trControl = train_control)

Будут ли эти железнодорожные звонки использовать одинаковые разбиения и быть сопоставимыми, или мне нужно предпринять дальнейшие шаги для обеспечения этого?то есть указание семян при создании объекта trainControl или вызов set.seed перед каждым поездом?Или и то, и другое?

Надеюсь, в этом есть какой-то смысл, и это не полный мусор.Любая помощь


Мой код проекта, о котором я спрашиваю, можно найти здесь .Это может быть легче прочитать, и вы поймете.

1 Ответ

0 голосов
/ 03 октября 2018

Сгибы CV не создаются при определении trainControl, если это явно не указано с помощью аргумента index, который я рекомендую.Они могут быть созданы с использованием одной из специализированных caret функций:

createFolds
createMultiFolds
createTimeSlices
groupKFold

При этомиспользование определенного начального числа до определения trainControl не приведет к одинаковым сгибам CV.

Пример:

library(caret)
library(tidyverse)

set.seed(1)
trControl = trainControl(method = "cv",
                         returnResamp = "final",
                         savePredictions = "final")

создайте две модели:

knnFit1 <- train(iris[,1:4], iris[,5],
                 method = "knn",
                 preProcess = c("center", "scale"),
                 tuneLength = 10,
                 trControl = trControl)

ldaFit2 <- train(iris[,1:4], iris[,5],
                 method = "lda",
                 tuneLength = 10,
                 trControl = trControl)

проверьте, находятся ли одинаковые индексы в одинаковых сгибах:

knnFit1$pred %>%
  left_join(ldaFit2$pred, by = "rowIndex") %>%
  mutate(same = Resample.x == Resample.y) %>%
  {all(.$same)}
#FALSE

Если вы устанавливаете одинаковое начальное число перед каждым train вызовом

set.seed(1)
knnFit1 <- train(iris[,1:4], iris[,5],
                 method = "knn",
                 preProcess = c("center", "scale"),
                 tuneLength = 10,
                 trControl = trControl)

set.seed(1)
ldaFit2 <- train(iris[,1:4], iris[,5],
                 method = "lda",
                 tuneLength = 10,
                 trControl = trControl)


set.seed(1)
rangerFit3 <- train(iris[,1:4], iris[,5],
                 method = "ranger",
                 tuneLength = 10,
                 trControl = trControl)


knnFit1$pred %>%
  left_join(ldaFit2$pred, by = "rowIndex") %>%
  mutate(same = Resample.x == Resample.y) %>%
  {all(.$same)}

knnFit1$pred %>%
  left_join(rangerFit3$pred, by = "rowIndex") %>%
  mutate(same = Resample.x == Resample.y) %>%
  {all(.$same)}

, в сгибах будут использоваться одни и те же индексы,Однако я бы не стал полагаться на этот метод при использовании параллельных вычислений.Поэтому, чтобы обеспечить использование одних и тех же разбиений данных, лучше всего определить их вручную, используя index / indexOut аргументы в trainControl.

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

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