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

6
我知道在MatLab中这很容易('-v 10')。
但是我需要在R中做到这一点。我确实找到了一个评论,说添加参数cross = 10就可以了。但是官方帮助文件中没有对此进行确认,所以我对此持怀疑态度。
svm(Outcome ~. , data= source, cost = 100, gamma =1, cross=10)

如果可能的话,我希望能够提供一些在R中成功运行的SVM脚本示例,因为我仍然遇到了一些困难。

编辑:我忘记在标签外提到,我使用的是libsvm软件包。


1
“caret” 软件包可能对您有所帮助。它有详细的使用说明文档,并且可以通过共同的接口(即“train”函数)适配许多不同的模型。 - richiemorrisroe
Tune似乎与e1071包中的内容相似,我尝试最小化使用的软件包数量,因此我会尝试这个,但仍希望得到更多回复。 - Sigvard
3个回答

7
我也尝试进行10倍交叉验证。我认为使用tune不是执行此操作的正确方法,因为此函数用于优化参数,而不是训练和测试模型。
我有以下代码来执行留一法交叉验证。假设数据集是存储您数据的数据框。在每个留一步骤中,将添加观察与预测矩阵,以便最终,结果包含全局观察与预测矩阵。
#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
这里有一种简单的方法来创建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...
}

0
这是我的通用代码,用于运行k折交叉验证,并借助cvsegments生成索引折叠。
# 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接