假设我有一个多类数据集(例如鸢尾花)。我想执行分层的 10 倍 CV 来测试模型性能。我在包中找到了一个名为stratified
的包splitstackchange
函数,它根据我想要的数据比例为我提供了一个分层折叠。因此,如果我想要测试折叠,它将是数据行的 0.1。
#One Fold
library(splitstackchange)
stratified(iris,c("Species"),0.1)
我想知道如何在 10 倍循环中实现此功能或任何其他形式的分层 cv。我无法破解它背后的逻辑。在这里,我包括一个可重现的示例。
library(splitstackshape)
data=iris
names(data)[ncol(data)]=c("Y")
nFolds=10
for (i in 1:nFolds){
testing=stratified(data,c("Y"),0.1,keep.rownames=TRUE)
rn=testing$rn
testing=testing[,-"rn"]
row.names(testing)=rn
trainingRows=setdiff(1:nrow(data),as.numeric(row.names(testing)))
training=data[trainingRows,]
names(training)[ncol(training)]="Y"
}
对 n 折 cv 使用插入符号包。我会建议这个关于插入符号的非常有用的链接。
你们发现以下解决方案很有用。
library(tidyverse)
library(splitstackshape)
library(caret)
library(randomForest)
data=iris
## split data into train and test using stratified sampling
d <- rownames_to_column(data, var = "id") %>% mutate_at(vars(id), as.integer)
training <- d %>% stratified(., group = "Species", size = 0.90)
dim(training)
## proportion check
prop.table(table(training$Species))
testing <- d[-training$id, ]
dim(testing)
prop.table(table(testing$Species))
## Modelling
set.seed(123)
tControl <- trainControl(
method = "cv", #cross validation
number = 10, #10 folds
search = "random" #auto hyperparameter selection
)
trRf <- train(
Species ~ ., #formulae
data = training[,-1], #data without id field
method = "rf", # random forest model
trControl = tControl # train control from previous step.
)
很晚了,但我希望我能帮助别人。 示例代码对我有帮助:
library(splitstackshape)
dat1 <- data.frame(ID = 1:100,
A = sample(c("AA", "BB", "CC", "DD", "EE"), 100, replace = TRUE),
B = rnorm(100), C = abs(round(rnorm(100), digits=1)),
D = sample(c("CA", "NY", "TX"), 100, replace = TRUE),
E = sample(c("M", "F"), 100, replace = TRUE))
flds=list()
dat=dat1
for(i in 1:10){
j=10-(i-1)
if(j>1){
a=stratified(dat, c("E", "D"), size = 1/j)
flds[[i]]=a$ID
dat=dat%>%filter(ID %in% setdiff(dat$ID,a$ID))
} else{
flds[[i]]=dat$ID
}
}
caret
包是一个不错的选择。
createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
将返回 10 倍 CV 的测试倍数y
的索引。
createMultiFolds(y, k = 10, times = 5)
将返回 5 倍 10 倍 CV 的测试折叠y
的索引。
数据根据标签y
分层。
了解更多: https://www.r-bloggers.com/2020/11/caretcreatefolds-vs-createmultifolds/