生成用于交叉验证的集合

Del*_*ine 13 r

如何使用R自动拆分矩阵进行5倍交叉验证?我实际上想要生成5组(test_matrix_indices,train matrix_indices).

Jor*_*eys 23

我想你想要矩阵行是要分割的情况.然后,所有你需要的是samplesplit:

X <- matrix(rnorm(1000),ncol=5)
id <- sample(1:5,nrow(X),replace=TRUE)
ListX <- split(x,id) # gives you a list with the 5 matrices
X[id==2,] # gives you the second matrix
Run Code Online (Sandbox Code Playgroud)

我会使用该列表,因为它允许您执行以下操作:

names(ListX) <- c("Train1","Train2","Train3","Test1","Test2")
mean(ListX$Train3)
Run Code Online (Sandbox Code Playgroud)

这使代码更容易阅读,并使您无法在工作区中创建大量的矩阵.如果将矩阵单独放在工作区中,则必然会陷入困境.使用清单!

如果您希望测试矩阵小于或大于其他矩阵,请使用以下prob参数sample:

id <- sample(1:5,nrow(X),replace=TRUE,prob=c(0.15,0.15,0.15,0.15,0.3))
Run Code Online (Sandbox Code Playgroud)

为您提供一个测试矩阵,其大小是火车矩阵的两倍.

如果您想确定确切的病例数,sample并且prob不是最佳选择.你可以用一个技巧:

indices <- rep(1:5,c(100,20,20,20,40))
id <- sample(indices)
Run Code Online (Sandbox Code Playgroud)

分别得到100,20,......和40个案例的矩阵.


Woj*_*ala 15

f_K_fold <- function(Nobs,K=5){
    rs <- runif(Nobs)
    id <- seq(Nobs)[order(rs)]
    k <- as.integer(Nobs*seq(1,K-1)/K)
    k <- matrix(c(0,rep(k,each=2),Nobs),ncol=2,byrow=TRUE)
    k[,1] <- k[,1]+1
    l <- lapply(seq.int(K),function(x,k,d) 
                list(train=d[!(seq(d) %in% seq(k[x,1],k[x,2]))],
                     test=d[seq(k[x,1],k[x,2])]),k=k,d=id)
   return(l)
}
Run Code Online (Sandbox Code Playgroud)

  • 什么id d?我不懂. (2认同)