2016-05-21 4 views
3

Ich bin neu in SVM und e1071. Ich habe festgestellt, dass die Ergebnisse jedes Mal anders sind, wenn ich denselben Code verwende.Was ist der "zufällige" oder nicht-deterministische Faktor innerhalb der SVM-Vorhersage durch Wahrscheinlichkeiten in e1071 in R?

Zum Beispiel:

data(iris) 
library(e1071) 

model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
pred <- predict(model, iris[150,-5], probability = TRUE) 
result1 <- as.data.frame(attr(pred, "probabilities")) 

model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
pred <- predict(model, iris[150,-5], probability = TRUE) 
result2 <- as.data.frame(attr(pred, "probabilities")) 

dann bekam ich result1 wie:

  setosa versicolor virginica 
150 0.009704854 0.1903696 0.7999255 

und result2 als:

 setosa versicolor virginica 
150 0.01006306 0.1749947 0.8149423 

und das Ergebnis hält jede Runde ändern.

Hier verwende ich die ersten 149 Zeilen als Trainingssatz und die letzte Zeile als Test. Die Wahrscheinlichkeiten für jede Klasse in result1 und result2 sind nicht genau gleich. Ich vermute, es gibt einen Prozess während der Vorhersage, der "zufällig" ist. Wie läuft das ab?

Ich bin mir bewusst, dass die vorhergesagten Wahrscheinlichkeiten behoben werden können, wenn ich mit der gleichen Nummer vor jedem Anruf I set.seed(). Ich "ziele" nicht auf ein festes Vorhersageergebnis, sondern bin nur neugierig, warum dies passiert und welche Schritte es braucht, um die Wahrscheinlichkeitsvorhersage zu generieren.

Der kleine Unterschied hat keinen großen Einfluss auf die Irisdaten, da die letzte Probe immer noch als "virginica" vorhergesagt wird. Aber wenn meine Daten (mit zwei Klassen A und B) nicht so "gut" sind und eine unbekannte Probe eine Wahrscheinlichkeit von 0,489 und 0,521 für zwei Mal als Klasse A voraussagt, wird es verwirrend sein.

Danke!

Antwort

2

SVM verwendet einen Kreuzvalidierungsschritt bei der Entwicklung der Wahrscheinlichkeiten. Die source code for that step beginnt mit:

// Cross-validation decision values for probability estimates 
static void svm_binary_svc_probability(
    const svm_problem *prob, const svm_parameter *param, 
    double Cp, double Cn, double& probA, double& probB) 
{ 
    int i; 
    int nr_fold = 5; 
    int *perm = Malloc(int,prob->l); 
    double *dec_values = Malloc(double,prob->l); 

    // random shuffle 
    GetRNGstate(); 
    for(i=0;i<prob->l;i++) perm[i]=i; 
    for(i=0;i<prob->l;i++) 
    { 
     int j = i+((int) (unif_rand() * (prob->l-i))) % (prob->l-i); 
     swap(perm[i],perm[j]); 
    } 

Sie erstellen kannst „Berechenbarkeit“ durch den Zufallskeim kurz vor dem Anrufeinstell-:

> data(iris) 
> library(e1071) 
> set.seed(123) 
> model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
> pred <- predict(model, iris[150,-5], probability = TRUE) 
> result1 <- as.data.frame(attr(pred, "probabilities")) 
> set.seed(123) 
> model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
> pred <- predict(model, iris[150,-5], probability = TRUE) 
> result2 <- as.data.frame(attr(pred, "probabilities")) 
> result1 
     setosa versicolor virginica 
150 0.009114718 0.1734126 0.8174727 
> result2 
     setosa versicolor virginica 
150 0.009114718 0.1734126 0.8174727 

Aber ich bin das Epigramms von Emerson erinnert: „Eine törichte Konsistenz ist der Hobgoblin der kleinen Geister. "

+0

Danke für Ihre Antwort! Könnten Sie bitte genauer erklären, wie svm aus e1071 die Wahrscheinlichkeit durch eine Kreuzvalidierung erzeugt, so dass es einen zufälligen Prozess gibt? Ich habe nicht gefunden, was Sie im Quellcode veröffentlicht haben, und ich verstehe den von Ihnen geposteten Code nicht vollständig. Ich weiß, dass ich vor dem Aufruf einen Startwert setzen kann, um ihn konsistent zu machen. Ich wollte kein konsistentes Ergebnis, aber ich möchte nur verstehen, wie das passiert. Danke vielmals!! – Yan

+0

Nachdem Sie die Quellversion des Pakets in der gezippten Version erhalten haben, deren Verknüpfung oben angezeigt wird, erweitern und entpacken Sie sie. Dort sollten Sie einen Ordner namens 'src' sehen. Der Code, den ich extrahiert habe, befindet sich in der Datei svm.cpp. Es sollte leicht mit einem Texteditor zu finden sein. Ich bin auch kein C++ - Programmierer, und ich denke, dass die Frage nach einem Code-Durchlauf, den keiner von uns jemals ändern wird, zu groß ist, um nach einer SO-Frage zu fragen. –

+0

Entschuldigung, wenn meine Frage unpassend war. Aber ich habe nicht nach einer Lösung für den Code gefragt. Ich habe mich nur gefragt, ob Sie mir eine ein oder zwei Sätze erklären könnten "SVM verwendet einen Kreuzvalidierungsschritt bei der Entwicklung der Wahrscheinlichkeitsschätzungen", d. H. Wie dieser Kreuzvalidierungsschritt durchgeführt wird, um hier die Wahrscheinlichkeiten zu entwickeln. Ich bin kein Programmierer und neu im Codieren, es ist schwer für mich, die Antwort selbst zu finden, indem ich den Rohcode lese. Ich würde mich freuen, wenn Sie das erklären könnten, ohne den Code zu lesen.Aber wenn es deine Zeit kostet, tut es mir leid. Vielen Dank! – Yan

Verwandte Themen