1

使用以下代码,我正在尝试执行留一法交叉验证。

library(e1071)
library(plyr)

trainingdata<-read.table('data.txt', sep=",", header=TRUE)
f0 <- function(x) any(x!=1) & any(x!=0) & is.numeric(x)
trainingdata<-cbind(colwise(identity, f0)(trainingdata))

C <- 0
M <- 0
count <- nrow(trainingdata)
for(i in 1:count)
{
   actual <- trainingdata[i,]$label
   trainingtemp <- trainingdata[-c(i), ]

   model <- svm(factor(label)~., data=trainingtemp, method="C-classification",     
   kernel="sigmoid", C=0.1, gamma=0.01, cross=10)

   testdata <- trainingdata[i, ]
   prediction <- predict(model, testdata)
   prediction <- paste(prediction)

   if(actual==prediction)
      C <- C+1
   else
      M <- M+1
}

write.csv(data.frame(C,M))

我不明白的问题是我总是得到相同的 C(正确分类)和 M(错误分类)值。在以下条件下结果相同:

1 - 我尝试了不同的 Cost 和 gamma 值(也尝试了 best.svm() 函数)

2 - 也尝试了不同的分类方法+不同的内核。

3 - 数据集中共有大约 50 个特征。即使在构建模型时使用了任何一个特征,即 (svm(label~x1...) 或 svm(label~x2...),结果也没有影响。

代码有问题吗?数据非常大,可以在这里发布。

4

4 回答 4

1
  • 为您的 svm 调用使用iris数据和不同的 gamma,我确实得到了不同的预测。

  • 我建议您将所有预测放入一个向量中,并在 cv 完成后比较预测和正确的标签。这样,您可以更轻松地检查预测是否确实发生了变化。

  • 如果没有您的数据以及 C 和 gamma 的选择,我们将无法为您提供任何进一步的帮助。

  • (顺便说一句,不建议使用留一法验证,因为您无法对其进行迭代。您可能希望浏览例如有关 crossvalidated 上的验证方案的内容

于 2013-03-29T16:41:19.183 回答
0

您正在创建“trainingtemp”作为保留数据,但始终将完整数据“trainingdata”传递给模型。尝试修改您的模型,例如:

model <- svm(factor(label)~., data=trainingtemp, method="C-classification",     
   kernel="sigmoid", C=0.1, gamma=0.01, cross=10)
于 2013-03-28T23:13:34.147 回答
0

这可以特定于您的数据,因为对于不同的数据,我也会得到不同的值(正如 cbeleites 指出的那样)。

因此,如果您可以将数据放在某个可共享的地方。

另外作为一个小评论,我没有得到在构建模型时使用“cross=10”的原因。

于 2014-05-17T21:57:06.603 回答
0

我真的不太了解 R 或您的不同调用在做什么。我知道您正在尝试使用留一法 (LOO)。以下是一些需要检查的事项:

  • 您是否正在标准化您的数据?使所有值都位于 0 和 1 之间(或 -1 和 1 之间),无论是线性还是使用均值和标准偏差?这对于 SVM 非常重要,对于 RBF 内核更是如此,如果你不这样做,你很容易遇到数值困难。
  • 您是否在系统地参数搜索 C 的良好值(或在 RBF 内核的情况下为 C 和 gamma)?进行交叉验证或保留集?根据我对您的 R 代码的理解,您似乎并没有这样做。为什么不在代码之外尝试两个 fors,一个测试 2^[-10...0] 的 gamma 和 2^[-5...5] 的 C?这就是真正所谓的交叉验证,我认为您只是在进行内部迭代并且缺少几个 for 循环。
于 2013-03-29T03:22:32.077 回答