R中带有createFolds函数的训练和测试集

问题描述 投票:0回答:1

我尝试手动计算一些线性回归性能指标,并且我想使用30折交叉验证对我的data进行拆分。

这些绩效指标需要经过培训和测试才能计算出来。

我运行以下代码,但它给我一个错误(“尺寸不兼容,较长的对象长度不是较短的对象长度的倍数”)。

是否有使用createFolds函数解决此问题的方法?

######### Upload the data set #########

wdbc <- read.delim("yacht_hydrodynamics.data",sep = "",header = FALSE) 
wdbc[] <- lapply(wdbc, scale)
wdbc<-as.data.frame(wdbc)

############## Leave One Out Cross Validation split ###########

k=30
fitted_value <- rep(0,k)

for(i in 1:k){
test<-wdbc[i,]
training<-wdbc[-i,]

m=lad(V7 ~ ., data=training, method="BR")

co.data = coef(m)  
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "V7")]))

fitted_value[i] <- x %*% co.data

}

 R2<-(cor(wdbc$V7,fitted_value)^2) ### R-squared
 SAD<-sum(abs(wdbc$V7 - fitted_value)) ### Sum Absloute Deviation

 c(round(SAD,2) ,round(R2,2))

NOTE

“ V7”是因变量。

r machine-learning regression r-caret
1个回答
0
投票

您的错误来自此行:

R2<-(cor(wdbc$V7,fitted_value)^2)

如果您查看读取的data.frame:

wdbc = read.delim("http://archive.ics.uci.edu/ml/machine-learning-databases/00243/yacht_hydrodynamics.data",sep="",header=FALSE)
 dim(wdbc)
[1] 308   7

因此从308的向量中减去30个值的向量不起作用

不确定是进行30倍交叉验证还是将1留空,上面的代码是1留出,应该将k = nrow(wdbc)设置为1留出。以下是30折的建议:

k=30
foldidx = split(sample(nrow(wdbc)),1:nrow(wdbc) %% k)
fitted_value <- vector("list",k)

for(i in 1:k){
test<-wdbc[foldidx[[i]],]
training<-wdbc[-foldidx[[i]],]

m=lad(V7 ~ ., data=training, method="BR")

co.data = coef(m)  
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "V7")]))

fitted_value[[i]] <- x %*% co.data

}

最后一部分与值匹配,您不列出索引,也没有存储已拟合值的列表:

obs = wdbc$V7[unlist(foldidx)]
test = unlist(fitted_value)

R2<-(cor(obs,test)^2)
© www.soinside.com 2019 - 2024. All rights reserved.