使用R语言中的createFolds函数进行训练和测试集的划分

我尝试手动计算一些线性回归的性能指标,并希望使用30折交叉验证来分割我的数据

这些性能指标的计算需要使用训练集和测试集。

我运行了以下代码,但它返回了一个错误(“incompatible dimensions, longer object length is not a multiple of shorter object length”)。

有没有办法使用createFolds函数解决这个问题?

######### 上传数据集 #########
wdbc <- read.delim("yacht_hydrodynamics.data",sep = "",header = FALSE)
wdbc[] <- lapply(wdbc, scale)
wdbc<-as.data.frame(wdbc)
############## 留一法交叉验证分割 ###########
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)

如果你查看你读入的数据框:

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)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注