R e1071 точность перекрестной проверки не одинакова

Я пытался воспроизвести пример, показанный в libsvm «Практическое руководство по классификации опорных векторов» на странице 10. Данные «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) различается каждый раз, когда я запускаю команду.

Я провел тот же тест, используя svm-train.exe из пакета libsvm, он дал те же результаты, что и в руководстве, и независимо от того, сколько раз я запускал тест, он всегда дает мне тот же k-кратный точность перекрестной проверки.

Кто-нибудь может сказать мне, почему? Любая помощь приветствуется.


person Cheng    schedule 27.04.2015    source источник
comment
Для воспроизводимости результатов вам необходимо установить случайное начальное число до запуска перекрестной проверки.   -  person Alex A.    schedule 27.04.2015


Ответы (1)


Если вы посмотрите документацию, то увидите, что функция вы используете, полагается на случайные числа. Термин «случайный» в информатике несколько неоднозначен. На самом деле существует алгоритм, который создает так называемые псевдослучайные числа. Этот алгоритм (в общих чертах) принимает один параметр (где он должен начинаться) и выдает одну и ту же последовательность каждый раз, когда (случайное число). Кстати, это то, на чем основаны все современные системы шифрования, на том факте, что последовательность всегда будет одинаковой при одном и том же случайном начальном значении.

Чтобы установить случайное семя в R, используйте:

set.seed(3)

Где 3 можно заменить любым числом, которое вы хотите установить. Теперь, когда вы его установили, каждый раз, когда вы генерируете случайное число, будет использоваться следующее число в псевдослучайной последовательности. Поэтому, если вы устанавливаете начальное число, попробуйте его пару раз, а затем запустите свой код, он не должен генерировать тот же результат, что и запуск кода сразу после установки случайного начального числа.

Надеюсь это поможет!

person ibreznik    schedule 27.04.2015
comment
Спасибо! Я прочитал исходный код libsvm на C и обнаружил, что вы правы. :-) - person Cheng; 28.04.2015