R e1071交叉验证精度不一样
R e1071 cross-validation accuracy is not the same
我试图重现第 10 页的 libsvm "A Practical Guide to Support Vector Classification" 中显示的示例。我使用的数据 "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 折交叉验证准确度(平均值(bioData.model$accuracies)或 bioData.model$tot.accuracy)都不同.
我使用 libsvm 包中提供的 svm-train.exe 进行了相同的测试,它确实产生了与手册中所示相同的结果,无论我 运行测试,它总是给我相同的 k 折交叉验证准确度。
谁能告诉我为什么?任何帮助将不胜感激。
如果您查看 documentation you'll see that the function you are using relies on "random numbers". The term "random" is somewhat ambiguous in computer science. In truth there is an algorithm that creates what are called "pseudo-random" numbers. That algorithm (in basic terms) takes in one parameter (where it should start) and produces the same sequence every time (random seed)。顺便说一句,这就是所有现代加密系统的基础,即给定相同的随机种子,序列将始终相同。
要在 R 中设置随机种子:
set.seed(3)
其中 3 可以替换为您要设置的任何数字。现在一旦你设置了它,每次你生成一个随机数时,伪随机序列中的下一个数字将被采用。因此,如果您设置种子,请尝试几次,然后 运行 您的代码生成的结果不应与 运行 在设置随机种子后立即对代码生成相同的结果。
希望对您有所帮助!
我试图重现第 10 页的 libsvm "A Practical Guide to Support Vector Classification" 中显示的示例。我使用的数据 "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 折交叉验证准确度(平均值(bioData.model$accuracies)或 bioData.model$tot.accuracy)都不同.
我使用 libsvm 包中提供的 svm-train.exe 进行了相同的测试,它确实产生了与手册中所示相同的结果,无论我 运行测试,它总是给我相同的 k 折交叉验证准确度。
谁能告诉我为什么?任何帮助将不胜感激。
如果您查看 documentation you'll see that the function you are using relies on "random numbers". The term "random" is somewhat ambiguous in computer science. In truth there is an algorithm that creates what are called "pseudo-random" numbers. That algorithm (in basic terms) takes in one parameter (where it should start) and produces the same sequence every time (random seed)。顺便说一句,这就是所有现代加密系统的基础,即给定相同的随机种子,序列将始终相同。
要在 R 中设置随机种子:
set.seed(3)
其中 3 可以替换为您要设置的任何数字。现在一旦你设置了它,每次你生成一个随机数时,伪随机序列中的下一个数字将被采用。因此,如果您设置种子,请尝试几次,然后 运行 您的代码生成的结果不应与 运行 在设置随机种子后立即对代码生成相同的结果。
希望对您有所帮助!