我知道在MatLab中这很容易('-v 10')。
但是我需要在R中做到这一点。我确实找到了一条关于添加cross = 10
的评论,因为参数会这样做。但是在帮助文件中没有证实这一点,所以我对它持怀疑态度。
svm(Outcome ~. , data= source, cost = 100, gamma =1, cross=10)
R的成功SVM脚本的任何示例也会受到赞赏,因为我仍然遇到了一些死胡同?
编辑:我忘记在我使用libsvm软件包的标签之外提及。
答案 0 :(得分:6)
我也在尝试进行10倍交叉验证。我认为使用tune不是执行它的正确方法,因为此函数用于优化参数,但不用于训练和测试模型。
我有以下代码来执行Leave-One-Out交叉验证。假设 dataset 是存储数据的data.frame。在每个LOO步骤中,添加观察到的预测矩阵,以便最后,结果包含全局观察矩阵和预测矩阵。
#LOOValidation
for (i in 1:length(dataset)){
fit = svm(classes ~ ., data=dataset[-i,], type='C-classification', kernel='linear')
pred = predict(fit, dataset[i,])
result <- result + table(true=dataset[i,]$classes, pred=pred);
}
classAgreement(result)
因此,为了执行10倍交叉验证,我想我们应该手动分区数据集,并使用折叠来训练和测试模型。
for (i in 1:10)
train <- getFoldTrainSet(dataset, i)
test <- getFoldTestSet(dataset,i)
fit = svm(classes ~ ., train, type='C-classification', kernel='linear')
pred = predict(fit, test)
results <- c(results,table(true=test$classes, pred=pred));
}
# compute mean accuracies and kappas ussing results, which store the result of each fold
我希望这对你有所帮助。
答案 1 :(得分:1)
这是一种使用无包装创建10个测试和训练折叠的简单方法:
#Randomly shuffle the data
yourData<-yourData[sample(nrow(yourData)),]
#Create 10 equally size folds
folds <- cut(seq(1,nrow(yourData)),breaks=10,labels=FALSE)
#Perform 10 fold cross validation
for(i in 1:10){
#Segement your data by fold using the which() function
testIndexes <- which(folds==i,arr.ind=TRUE)
testData <- yourData[testIndexes, ]
trainData <- yourData[-testIndexes, ]
#Use test and train data howeever you desire...
}
答案 2 :(得分:0)
这是我的通用代码,用于运行由cvsegments辅助生成索引折叠的k折交叉验证。
# k fold-cross validation
set.seed(1)
k <- 80;
result <- 0;
library('pls');
folds <- cvsegments(nrow(imDF), k);
for (fold in 1:k){
currentFold <- folds[fold][[1]];
fit = svm(classes ~ ., data=imDF[-currentFold,], type='C-classification', kernel='linear')
pred = predict(fit, imDF[currentFold,])
result <- result + table(true=imDF[currentFold,]$classes, pred=pred);
}
classAgreement(result)