2013-03-28 61 views
1

使用下面的代码,我正在尝试执行leave-one-out交叉验证。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 - 我试图与成本和伽玛(也尝试best.svm()函数)

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

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

是否有任何问题?代码数据是相当大的,以被张贴在这里

回答

0

你正在创建“trainingtemp”为你留一出的数据,但始终传递模型完整的数据“trainingdata”尝试修改你的模型,例如:。

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

对不起。事实上,这是一个错误。我实际上是通过trainingtemp。那是我错误地尝试过的最后一个变化。 – Shahzad

0

我真的不知道那么多的R或者你的不同的电话在做什么,我知道你正在尝试留下一个(LOO),这里有一些事情要检查:

  • 您是否正常化了您的数据?使所有值位于0和1之间(或-1和1之间),线性或使用均值和标准偏差?这对于SVM是非常重要的,对于RBF内核来说更是如此,如果你不这样做,你可以很容易地陷入数值上的困难。
  • 您是否系统地参数搜索C(或者在RBF内核的情况下为C和gamma)的良好值?做交叉验证还是暂停设置?从我对R代码的理解看来,您似乎没有这样做。为什么不在代码之外尝试两个fors,其中一个测试2^[ - 10 ... 0]用于gamma,而另一个则用2^[ - 5 ... 5]测试C?这就是所谓的交叉验证,我认为你只是在进行内部迭代并且缺少一些for循环。
+0

是的。数据在0和1之间进行标准化。best.svm搜索最佳的C和伽马值。所以我相信没有错误,但我也手动选择了Cost和gamma的几个值,但C和M的最终结果总是相同的。我只注意到另一件事,即预测总是只有一个类。在LOO交叉验证过程中,任何一个例子都不会预测到其他类。究竟如何能够在这种情况下继续前进? – Shahzad

1
  • 使用iris数据,并为您的通话SVM不同伽马,我得到不同的预测。

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

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

  • (顺便说一句,留一法证实是推荐的,因为你不能重复它,你可能想通过what is said about validation schemes on crossvalidated浏览EG)

0

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

所以,如果你可以把数据放在一些可共享的地方。

同样作为一个次要的评论,我没有得到使用“十字= 10”,当你建立一个模型的原因。