Укажите перекрестную валидацию с помощью каретки
Привет и заранее спасибо. я использую caret
перекрестная проверка нейронной сети от nnet
пакет. в method
параметр для train.Control
Функция Я могу указать свой тип перекрестной проверки, но все они выбирают наблюдения случайным образом для перекрестной проверки. Можно ли в любом случае использовать каретку для перекрестной проверки конкретных наблюдений в моих данных по идентификатору или жестко заданному параметру? Например вот мой текущий код:
library(nnet)
library(caret)
library(datasets)
data(iris)
train.control <- trainControl(
method = "repeatedcv"
, number = 4
, repeats = 10
, verboseIter = T
, returnData = T
, savePredictions = T
)
tune.grid <- expand.grid(
size = c(2,4,6,8)
,decay = 2^(-3:1)
)
nnet.train <- train(
x = iris[,1:4]
, y = iris[,5]
, method = "nnet"
, preProcess = c("center","scale")
, metric = "Accuracy"
, trControl = train.control
, tuneGrid = tune.grid
)
nnet.train
plot(nnet.train)
Предположим, я хотел добавить еще один столбец CV_GROUP
к iris
фрейм данных, и я хотел карет для перекрестной проверки нейронной сети на наблюдениях со значением 1
для этого столбца:
iris$CV_GROUP <- c(rep.int(0,times=nrow(iris)-20), rep.int(1,times=20))
Это возможно с caret
?
1 ответ
Использование index
а также indexOut
Варианты управления. Я разработал способ реализации этого, который позволит вам выбрать желаемое количество повторений и сгибов:
library(nnet)
library(caret)
library(datasets)
library(data.table)
library(e1071)
r <- 2 # number of repeats
k <- 5 # number of folds
data(iris)
iris <- data.table(iris)
# Create folds and repeats here - you could create your own if you want #
set.seed(343)
for (i in 1:r) {
newcol <- paste('fold.num',i,sep='')
iris <- iris[,eval(newcol):=sample(1:k, size=dim(iris)[1], replace=TRUE)]
}
folds.list.out <- list()
folds.list <- list()
list.counter <- 1
for (y in 1:r) {
newcol <- paste('fold.num', y, sep='')
for (z in 1:k) {
folds.list.out[[list.counter]] <- which(iris[,newcol,with=FALSE]==z)
folds.list[[list.counter]] <- which(iris[,newcol,with=FALSE]!=z)
list.counter <- list.counter + 1
}
iris <- iris[,!newcol,with=FALSE]
}
tune.grid <- expand.grid(
size = c(2,4,6,8)
,decay = 2^(-3:1)
)
train.control <- trainControl(
index=folds.list
, indexOut=folds.list.out
, verboseIter = T
, returnData = T
, savePredictions = T
)
iris <- data.frame(iris)
nnet.train <- train(
x = iris[,1:4]
, y = iris[,5]
, method = "nnet"
, preProcess = c("center","scale")
, metric = "Accuracy"
, trControl = train.control
, tuneGrid = tune.grid
)
nnet.train
plot(nnet.train)