R 中带有 createFolds 函数的训练和测试集
Training and Testing set with createFolds function in R
我尝试手动计算一些线性回归性能指标,我想使用 30 折 交叉验证拆分我的 data。
这些性能指标需要计算训练和测试集。
我运行下面的代码但是它给了我一个错误("incompatible dimensions, longer object length is not a multiple of shorter object length")。
有没有办法使用 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))
注意
"V7" 是因变量。
您的错误来自这一行:
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 折交叉验证还是留一,你上面的代码是留一,你应该设置 k = nrow(wdbc)
留一。以下是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)
我尝试手动计算一些线性回归性能指标,我想使用 30 折 交叉验证拆分我的 data。
这些性能指标需要计算训练和测试集。
我运行下面的代码但是它给了我一个错误("incompatible dimensions, longer object length is not a multiple of shorter object length")。
有没有办法使用 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))
注意
"V7" 是因变量。
您的错误来自这一行:
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 折交叉验证还是留一,你上面的代码是留一,你应该设置 k = nrow(wdbc)
留一。以下是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)