R caret / Как проходит перекрестная проверка для поезда в рамках RFE?
У меня есть вопрос относительно rfe
функция от caret
библиотека. На ссылке на страницу каретки они дают следующий алгоритм RFE: алгоритм
Для этого примера я использую rfe
функция с 3-кратной перекрестной проверкой и функция поезда с линейной SVM и 5-кратной перекрестной проверкой.
library(kernlab)
library(caret)
data(iris)
# parameters for the tune function, used for fitting the svm
trControl <- trainControl(method = "cv", number = 5)
# parameters for the RFE function
rfeControl <- rfeControl(functions = caretFuncs, method = "cv",
number= 4, verbose = FALSE )
rf1 <- rfe(as.matrix(iris[,1:4]), as.factor(iris[,5]) ,sizes = c( 2,3) ,
rfeControl = rfeControl, trControl = trControl, method = "svmLinear")
- Из вышеприведенного алгоритма я предположил, что алгоритм будет работать с 2-мя вложенными перекрестными проверками:
rfe
разделит данные (150 образцов) на 3 раза-
train
Функция будет работать на обучающем наборе (100 выборок) с 5-кратной перекрестной проверкой для настройки параметров модели - с последующим RFE.
Что меня смущает, так это то, что когда я смотрю на результаты rfe
функция:
> lapply(rf1$control$index, length)
$Fold1
[1] 100
$Fold2
[1] 101
$Fold3
[1] 99
> lapply(rf1$fit$control$index, length)
$Fold1
[1] 120
$Fold2
[1] 120
$Fold3
[1] 120
$Fold4
[1] 120
$Fold5
[1] 120
Из этого видно, что размер обучающих наборов из 5-кратного резюме составляет 120 образцов, когда я ожидал бы размер 80.
Так что было бы здорово, если бы кто-то мог прояснить, как работают и тренируются вместе.
ура
> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: i386-apple-darwin9.8.0/i386 (32-bit)
locale:
[1] C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] pROC_1.5.4 e1071_1.6-1 class_7.3-5 caret_5.15-048
[5] foreach_1.4.0 cluster_1.14.3 plyr_1.7.1 reshape2_1.2.1
[9] lattice_0.20-10 kernlab_0.9-15
loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_2.15.1 grid_2.15.1 iterators_1.0.6
[5] stringr_0.6.1 tools_2.15.1
1 ответ
Проблема здесь в том, что lapply(rf1$fit$control$index, length)
не хранит то, что мы думаем, что делает.
Чтобы я понял, что нужно было заглянуть в код. Что происходит там, это следующее:
Когда вы звоните rfe
все данные передаются в nominalRfeWorkflow
,
В nominalRfeWorkflow
, данные поезда и испытания разделены в соответствии с rfeControl
(в нашем примере 3 раза в соответствии с 3-кратным правилом CV) rfeIter
, Эти расщепления мы можем найти в нашем результате под rf1$control$index
,
В rfeIter
~100 обучающих выборок (наш пример) используются для поиска окончательных переменных (которые являются выходными данными этой функции). Насколько я понимаю, ~50 тестовых образцов (наш пример) используются для расчета производительности для различных наборов переменных, но они сохраняются только как внешние показатели, но не используются для выбора окончательных переменных. Для их выбора используются оценки эффективности 5-кратной перекрестной проверки. Но мы не можем найти эти показатели в конечном результате, возвращаемом rfe
, Если они нам действительно нужны, нам нужно их извлечь из fitObject$control$index
в rfeIter
верните их nominalRfeWorkflow
затем rfe
и оттуда в результате rfe
-Классный объект, возвращаемый rfe
,
Так что же хранится в lapply(rf1$fit$control$index, length)
? - Когда rfe
Найденные наилучшие переменные позволяют создать окончательное соответствие модели с лучшими переменными и полными справочными данными (150). rf1$fit
создан в rfe
следующее:
fit <- rfeControl$functions$fit(x[, bestVar, drop = FALSE],
y,
first = FALSE,
last = TRUE,
...)
Эта функция снова запускает train
и выполняет окончательную перекрестную проверку с полными справочными данными, окончательным набором функций и trControl
дано через эллипсы (...
). Так как наш trControl
предполагается сделать 5 кратное резюме, поэтому правильно, что lapply(rf1$fit$control$index, length)
возвращает 120, так как мы должны вычислить 150/5*4=120.