我一直在寻找在R中使用K-Fold方法执行SVR的方法,最后,我发现了如何执行此操作,并且当我在R中仅使用SVM()函数时,脚本可以正常工作,但是当我尝试为了调整SVM,我会出错,我想是因为我必须在某种程度上改变我不知道的for循环。
错误显示“(下标)逻辑下标太长”
代码如下:
library(plyr)
library(e1071)
# cross-validation
# predict the AWC
data<-read.csv("data.csv",header = T)
k = 5
# sample from 1 to k, nrow times (the number of observations in the data)
data$id <- sample(1:k, nrow(data), replace = TRUE)
list <- 1:k
prediction <- data.frame()
testsetCopy <- data.frame()
for (i in 1:k){
# remove rows with id i from dataframe to create training set
# select rows with id i to create test set
train.set <- subset(data, id %in% list[-i])
testset <- subset(data, id %in% c(i))
# Tuning SVM
mymodel <- tune(method = svm,train.y = train.set$AWC,train.x =
train.set, kernel="radial")
#get the best model out of tuned process.
mymodel1<-mymodel$best.model
# remove the response column 1, AWC
temp <- as.data.frame(predict(mymodel1, testset[,-1]))
# append this iteration's predictions to the end of the prediction data frame
prediction <- rbind(prediction, temp)
# append this iteration's test set to the test set copy data frame
# keep only the AWC Column
testsetCopy <- rbind(testsetCopy, as.data.frame(testset[,1]))
}
答案 0 :(得分:0)
函数tune
可以为您完成工作,您无需编写循环。查看tune
的R文档。那里有一个例子。
此外,通过设置k=5
,看起来您有5个数据点,一次只留下一个。尽管sample(1:nrow(data), round(0.80*nrow(data)),replace = TRUE)
可以完成所有这些工作,但也许不需要这样做,tune
可能会更好。