【问题标题】:How to perform 10 fold cross validation with LibSVM in R?如何在 R 中使用 LibSVM 执行 10 折交叉验证?
【发布时间】:2012-11-01 02:19:27
【问题描述】:

我知道在 MatLab 中这非常简单('-v 10')。

但我需要在 R 中执行此操作。我确实找到了一条关于添加 cross = 10 作为参数的评论。但这在帮助文件中没有得到证实,所以我对此持怀疑态度。

svm(Outcome ~. , data= source, cost = 100, gamma =1, cross=10)

任何成功的 R 支持向量机脚本示例也将不胜感激,因为我仍然遇到一些死胡同?

编辑:我忘了在标签之外提到我为此使用了 libsvm 包。

【问题讨论】:

  • caret 包可能对您有用。它具有广泛的插图,并且能够通过一个通用界面(train 函数)适应许多不同的模型。
  • 在 e1071 包中调音似乎是相似的,我尽量减少我使用的包的数量,所以我会尝试这个但仍然希望得到更多的回复。

标签: r machine-learning svm libsvm cross-validation


【解决方案1】:

这是一种无需包即可创建 10 个测试和训练折叠的简单方法:

#Randomly shuffle the data
yourData<-yourData[sample(nrow(yourData)),]

#Create 10 equally size folds
folds <- cut(seq(1,nrow(yourData)),breaks=10,labels=FALSE)

#Perform 10 fold cross validation
for(i in 1:10){
    #Segement your data by fold using the which() function 
    testIndexes <- which(folds==i,arr.ind=TRUE)
    testData <- yourData[testIndexes, ]
    trainData <- yourData[-testIndexes, ]
    #Use test and train data howeever you desire...
}

【讨论】:

    【解决方案2】:

    这是我在 cvsegments 的帮助下运行 k 折叠交叉验证以生成索引折叠的通用代码。

    # k fold-cross validation
    set.seed(1)
    k <- 80;
    result <- 0;
    library('pls');
    folds <- cvsegments(nrow(imDF), k);
    for (fold in 1:k){
        currentFold <- folds[fold][[1]];
        fit = svm(classes ~ ., data=imDF[-currentFold,], type='C-classification', kernel='linear')
        pred = predict(fit, imDF[currentFold,])
        result <- result + table(true=imDF[currentFold,]$classes, pred=pred);   
    }
    classAgreement(result)
    

    【讨论】:

      【解决方案3】:

      我也在尝试进行 10 折交叉验证。我认为使用 tune 不是执行它的正确方法,因为此功能用于优化参数,而不是用于训练和测试模型。

      我有以下代码来执行 Leave-One-Out 交叉验证。假设 dataset 是一个存储数据的 data.frame。在每个 LOO 步骤中,添加观察到的与预测的矩阵,因此最后,result 包含全局观察到的与预测的矩阵。

      #LOOValidation
      for (i in 1:length(dataset)){
          fit = svm(classes ~ ., data=dataset[-i,], type='C-classification', kernel='linear')
          pred = predict(fit, dataset[i,])
          result <- result + table(true=dataset[i,]$classes, pred=pred);
      }
      classAgreement(result)
      

      所以为了进行 10 折交叉验证,我想我们应该手动划分数据集,并使用折来训练和测试模型。

      for (i in 1:10)
          train <- getFoldTrainSet(dataset, i)
          test <- getFoldTestSet(dataset,i)
          fit = svm(classes ~ ., train, type='C-classification', kernel='linear')
          pred = predict(fit, test)
          results <- c(results,table(true=test$classes, pred=pred));
      
      }
      # compute mean accuracies and kappas ussing results, which store the result of each fold
      

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-07-14
        • 2012-02-04
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 2016-04-05
        • 2020-02-10
        相关资源
        最近更新 更多