如何在R中使用LibSVM执行10倍交叉验证?

如何在R中使用LibSVM执行10倍交叉验证?,r,machine-learning,svm,libsvm,cross-validation,R,Machine Learning,Svm,Libsvm,Cross Validation,我知道在MatLab中这很容易('-v10') 但我需要在R中这样做。我确实找到了一条关于添加cross=10作为参数的注释。但这在帮助文件中没有得到证实,所以我对此表示怀疑 svm(Outcome ~. , data= source, cost = 100, gamma =1, cross=10) 任何成功的SVM R脚本的例子都会很感激,因为我仍然会遇到一些死胡同 编辑:我忘了在标签之外提到我使用libsvm包来进行此操作。我还尝试执行10倍交叉验证。我认为使用tune不是执行该功能的正确

我知道在MatLab中这很容易('-v10')

但我需要在R中这样做。我确实找到了一条关于添加
cross=10
作为参数的注释。但这在帮助文件中没有得到证实,所以我对此表示怀疑

svm(Outcome ~. , data= source, cost = 100, gamma =1, cross=10)
任何成功的SVM R脚本的例子都会很感激,因为我仍然会遇到一些死胡同


编辑:我忘了在标签之外提到我使用libsvm包来进行此操作。

我还尝试执行10倍交叉验证。我认为使用tune不是执行该功能的正确方式,因为该功能用于优化参数,而不是训练和测试模型

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
我有以下代码来执行遗漏交叉验证。假设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)
#验证
对于(1中的i:长度(数据集)){
拟合=支持向量机(类~,数据=数据集[-i,],类型='C-分类',核='线性')
pred=predict(拟合,数据集[i,])

结果这是我的通用代码,用于在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)
#k折叠交叉验证
种子(1)

k这里有一个简单的方法,可以使用无包创建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...
}
#随机洗牌数据

yourDatathe
caret
软件包可能对您很有用。它有广泛的小插曲,能够通过一个通用接口(即
train
功能)适应多种不同的型号。Tune在e1071软件包中似乎很相似,我尽量减少使用的软件包数量,因此我将尝试此功能,但仍希望得到更多的回复。