【发布时间】:2016-12-10 16:29:13
【问题描述】:
我正在使用 e1071 svm 函数对我的数据进行分类。 我尝试了两种不同的 LOOCV 方法。 第一个是这样的,
svm.model <- svm(mem ~ ., data, kernel = "sigmoid", cost = 7, gamma = 0.009, cross = subSize)
svm.pred = data$mem
svm.pred[which(svm.model$accuracies==0 & svm.pred=='good')]=NA
svm.pred[which(svm.model$accuracies==0 & svm.pred=='bad')]='good'
svm.pred[is.na(svm.pred)]='bad'
conMAT <- table(pred = svm.pred, true = data$mem)
summary(svm.model)
我输入了cross='subject number'来制作LOOCV,但是分类结果和我手动的LOOCV不一样,就像...
for (i in 1:subSize){
data_Tst <- data[i,1:dSize]
data_Trn <- data[-i,1:dSize]
svm.model1 <- svm(mem ~ ., data = data_Trn, kernel = "linear", cost = 2, gamma = 0.02)
svm.pred1 <- predict(svm.model1, data_Tst[,-dSize])
conMAT <- table(pred = svm.pred1, true = data_Tst[,dSize])
CMAT <- CMAT + conMAT
CORR[i] <- sum(diag(conMAT))
}
在我看来,通过 LOOCV,准确度不应该在多次代码运行中发生变化,因为 SVM 使用除一个之外的所有数据创建模型,并一直执行到循环结束。但是,使用带有参数“cross”输入的 svm 函数,每次代码运行的准确性都不同。
哪种方法更准确?感谢您阅读这篇文章! :-)
【问题讨论】: