【问题标题】:R e1071 SVM leave one out cross validation function result differ from manual LOOCVR e1071 SVM 遗漏交叉验证函数结果与手动 LOOCV 不同
【发布时间】: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 函数,每次代码运行的准确性都不同。

哪种方法更准确?感谢您阅读这篇文章! :-)

【问题讨论】:

    标签: r svm


    【解决方案1】:

    您正在使用不同的超参数(成本、伽玛)和不同的内核(线性、sigmoid)。如果您想要相同的结果,那么每次运行的结果应该相同。

    另外,这取决于如何实现 Leave One Out (LOO):

    1. 您的 LOO 方法是随机遗漏一个还是作为数据集上的滑动窗口?

    2. 您的 LOO 方法是一次从一个类中漏掉一个,还是同时从两个类中漏掉一个?

    3. 训练集是否始终相同,或者您是否在拆分训练集和测试集之前使用了随机化程序(假设您有一个单独的独立测试集)?在这种情况下,您正在交叉验证的示例每次运行都会改变。

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 2015-05-27
      • 2020-08-31
      • 1970-01-01
      • 2017-04-13
      • 2014-04-02
      • 2017-12-22
      • 2014-05-05
      • 2013-02-21
      相关资源
      最近更新 更多