【问题标题】:R e1071 cross-validation accuracy is not the sameR e1071 交叉验证精度不一样
【发布时间】:2015-07-06 03:59:28
【问题描述】:

我试图重现第 10 页的 libsvm“支持向量分类的实用指南”中显示的示例。我使用的数据“train.2”可以在此处下载“http://www.csie.ntu.edu.tw/~cjlin/papers/guide/data/”。

为了解析数据,测试分类准确率,我写了如下代码:

library(e1071)
rm(list=ls(all=T))
root <- "C:/Users/administrator/Documents/RProjects/libsvm"
bioDataFile <- sprintf("%s/data/train.2", root)
bioData <- read.delim(bioDataFile, header=F, sep=" ", stringsAsFactors=F)
bioData <- bioData[, c(-2,-3,-ncol(bioData))]
bioData <- lapply(1:nrow(bioData), function(n){
reformData <- bioData[n,-1,drop=F]
reformData <- sapply(1:ncol(reformData), function(m){
as.numeric(unlist(strsplit(reformData[,m], ":"))[2])
})
data.frame(Type=factor(bioData[n,1]), t(reformData))
})
bioData <- do.call("rbind", bioData)

然后我进行了测试:

bioData.model <- svm(Type~., data=bioData, cross=5)

但是,我发现: 1.我无法得到与手册中相同的结果; 2. 我发现每次运行命令时,k-fold 交叉验证准确率(mean(bioData.model$accuracies) 或 bioData.model$tot.accuracy)都不一样。

我使用 libsvm 包中提供的 svm-train.exe 进行了相同的测试,它确实产生了与手册中所示相同的结果,并且无论我运行多少次测试,它总是给我相同的结果k-fold 交叉验证准确率。

谁能告诉我为什么?任何帮助将不胜感激。

【问题讨论】:

  • 为了获得结果的可重复性,您需要在运行交叉验证之前设置随机种子。

标签: r libsvm cross-validation


【解决方案1】:

如果您查看documentation,您会发现您使用的函数依赖于“随机数”。 “随机”一词在计算机科学中有些含糊。事实上,有一种算法可以创建所谓的“伪随机”数字。该算法(在基本术语中)采用一个参数(它应该从哪里开始)并每次(random seed) 产生相同的序列。顺便说一句,这是所有现代加密系统的基础,即在给定相同随机种子的情况下,序列始终相同。

在 R 中设置随机种子:

set.seed(3)

其中 3 可以替换为您要设置的任何数字。现在,一旦您设置了它,每次生成一个随机数时,都会采用伪随机序列中的下一个数字。因此,如果您设置了种子,请尝试几次,然后运行您的代码,它不会产生与设置随机种子后立即运行代码相同的结果。

希望这会有所帮助!

【讨论】:

  • 谢谢!我阅读了 libsvm 的 C 源代码,发现你是对的。 :-)
猜你喜欢
  • 2016-12-10
  • 2020-08-29
  • 1970-01-01
  • 2016-02-18
  • 2012-01-13
  • 2012-08-26
  • 2017-04-13
  • 2019-10-27
  • 2020-12-05
相关资源
最近更新 更多