我有一个非常简单的代码,可以生成K-fold交叉验证的培训和测试集。
我有一个矩阵 X [20x15],如果我采用折叠次数n_folds
,例如10我得到矩阵:trainingData
[18x15]和testData
[2x15]这是正确的。
现在,如果我更改了折叠次数n_folds=20
,我会选择trainingData
[19x15]这是正确的,但对于testData
,R会生成一个列表,而不是矩阵[1x15]。当我使用as.matrix
函数时,它生成一个[15x1]矩阵而不是[1x15]。
以下是n_fold=20
的代码:
library(dplyr)
library(tidyr)
require(stats)
set.seed(19875)
n=20
p=15
real_p=15
x=matrix(rnorm(n*p), nrow=n, ncol=p)
n_folds=20
#Randomly shuffle the data
x=x[sample(nrow(x)),]
folds=cut(seq(1, nrow(x)), breaks = n_folds, labels = FALSE)
#Perform 10 fold cross validation
for(i in 1:n_folds){
#segment your data by folds using the which() function
testIndexes=which(folds==i, arr.ind = TRUE)
testData=x[testIndexes,]
trainData=x[-testIndexes,]
}
为testData
生成矩阵的最简单方法是矩阵[1x15]而不是列表?
答案 0 :(得分:1)
这里的问题是你要提取行,而你只有一行,所以你得到了一个向量。要强制执行矩阵,请使用对矩阵的调用。您对矩阵调用的初始尝试使用了构造矩阵的默认方式,该方法生成单个列。指定列和行的内容。我假设您希望维度为length(testIndexes)
p
,但如果它是其他内容,您可以将其用作正确答案的形式。只需按照你想要的那样。
set.seed(19875)
n=20
p=15
real_p=15
x=matrix(rnorm(n*p), nrow=n, ncol=p)
n_folds=20
#Randomly shuffle the data
x=x[sample(nrow(x)),]
folds=cut(seq(1, nrow(x)), breaks = n_folds, labels = FALSE)
#Perform 10 fold cross validation
for(i in 1:n_folds){
#segment your data by folds using the which() function
testIndexes=which(folds==i, arr.ind = TRUE)
testData=matrix(x[testIndexes,], length(testIndexes), p)
trainData=x[-testIndexes,]
}
答案 1 :(得分:1)
我重新编写了你的代码并想出了这个,我希望它有用:
library ( dplyr )
library ( tidyr )
library ( stats )
library ( magrittr )
set.seed ( 19875 )
N <- 20
P <- 15
X <- matrix ( rnorm ( N * P ), N )
N_Folds <- 5
Folds <- rep ( 1:N_Folds, l = N ) %>% sample
for ( Fold in 1:N_Folds ){
Validation <- which ( Fold == Folds )
Valid_Data <- X [ Validation,, drop = FALSE ]
Train_Data <- X [ -Validation,, drop = FALSE ]
}
Train_Data %>% dim
Valid_Data %>% dim
大卫