SVM交叉验证始终相同

时间:2013-03-28 23:02:23

标签: r svm

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

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 ...),结果都没有影响。

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

3 个答案:

答案 0 :(得分:1)

  • 使用iris数据并为您的svm调用改变伽马值,我确实得到了不同的预测。

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

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

  • (顺便说一句,留下一次性验证推荐,因为你无法迭代它。你可能想要浏览例如what is said about validation schemes on crossvalidated

    < / LI>

答案 1 :(得分:0)

我真的不太了解R或者你不同的电话正在做什么。我知道你正试图做一次出局(LOO)。以下是一些要检查的事项:

  • 您正在规范您的数据吗?使所有值在0到1之间(或介于-1和1之间),线性地或使用均值和标准差?对于SVM来说非常重要,对于RBF内核来说更是如此,如果你不这样做,你很容易陷入数值困境。
  • 您是否系统地参数搜索C(或RBF内核的C和G)的良好值?进行交叉验证还是保留设置?从我对你的R代码的理解来看,你似乎并没有这样做。你为什么不尝试在你的代码之外的两个fors一个测试2 ^ [ - 10 ... 0]的伽玛和2 ^ [ - 5 ... 5]的C?这就是所谓的交叉验证,我认为你只是在进行内部迭代并缺少一些for循环。

答案 2 :(得分:0)

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

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

同样作为次要评论,我没有理由在构建模型时使用“cross = 10”。

相关问题