假设我有一个多类数据集(例如iris),我想执行分层10倍CV来测试模型性能,我在splitstackchange
包中找到了一个名为stratified
的函数,它可以根据我想要的数据比例提供分层倍数,所以如果我想要测试倍数,它将是数据行的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"
}
3条答案
按热度按时间slmsl1lt1#
使用插入符号包n倍简历。我会建议this非常翔实的链接插入符号。
您可能发现以下解决方案很有用。
qgelzfjb2#
现在已经很晚了,但是我希望我能帮助到一些人。下面的示例代码可以帮助我:
xj3cbfub3#
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/