Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Entscheidungsbäume, Random Forest, Support Vektor Maschinen, Neuronale Netze, ...

Moderator: consuli

Antworten
schubbiaschwilli
Beiträge: 229
Registriert: Di Jun 27, 2017 12:09 pm

Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von schubbiaschwilli »

Gude!

Ich habe ein Problem bzw. eine Frage zu den Ergebnissen der vorhergesagten Wahrscheinlichkeit von Klassifikationen bei SVM, speziell dem e1071-Paket. Ich weiß, dass dies nur eine Schnittstelle zur LIBSVM ist, aber ich muss ja irgendwo anfangen.

Ich habe eine Klassifizierung mit 2 Ereignissen, teile diese in Trainings- und Testdaten, und trainiere ein SVM-Modell (in diesem Beispiel ist es ein Radial-Kernel, aber das Problem tritt auch bei anderen Kernen auf). Dann mache ich eine Vorhersage mit den Testdaten, und lasse mit die 'probabilities' ausgeben. Und jetzt ist es so, dass diese sich... ändern. (Oder auch nicht, dazu unten mehr.)

Ich habe in meinem Beispiel die Iris-Daten genutzt, die Abweichungen der 'probabilities' sind hier auch nicht sehr groß, aber ich denke ausreichend, um das Problem zu erklären. Dazu setzte ich die Iris-Daten mit 'Setosa' auf 1 und alle anderen auf 0, und dies ist meine (binäre) abhängige Variable, und alle anderen sind meine Regressoren.

Also mein Code:

Code: Alles auswählen

# Mod data
iris_mod <- iris

iris_mod$Setosa <- ifelse(iris$Species=="setosa",1,0)
iris_mod <- iris_mod[,c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Setosa" )]

# Split into Training- and Testdata
TrainingsData <- iris_mod[-c(1),]
TestData <- iris_mod[c(1),]

# Build model and make prediction
library(e1071)

# Alternierend
predict(svm(Setosa~., kernel="radial", type="C-classification", scale=TRUE, probability=TRUE, data=TrainingsData, gamma=1, cost=100), newdata=TestData, probability=TRUE)

# Konstant
set.seed(87654)
predict(svm(Setosa~., kernel="radial", type="C-classification", scale=TRUE, probability=TRUE, data=TrainingsData, gamma=1, cost=100), newdata=TestData, probability=TRUE)

# Konstant, wenn das Model nicht noch einmal geändert wird
SVMmodel <- svm(Setosa~., kernel="radial", type="C-classification", scale=TRUE, probability=TRUE, data=TrainingsData, gamma=1, cost=100)
predict(SVMmodel, newdata=TestData, probability=TRUE)
Also, wenn ich jetzt den Code bzw. die eine Zeile Code unter '# Alternierend' ausführe, bekomme ich für jeden Durchlauf ein anderes Ergebnis - Die nummerischen Abweichungen sind hier nicht groß, aber... Sie sind da.

Wenn ich den seed fest setze, bleiben diese Werte Konstant - Siehe dazu die 2 Zeilen Code unter '# Konstant'.

Wenn ich das Model erst bestimme, und dann nicht mehr ändere, bleiben diese Werte ebenfalls fest - Siehe dazu die ein bzw. zwei Zeilen unter '# Konstant, wenn das Model nicht noch einmal geändert wird'

Kann das bitte mal jemand bestätigen?

Es liegt also (so vermute ich) nicht an der Funktion 'predict' - Wenn sich das Model nicht ändert, liefert diese die gleichen Ergebnisse.
Wenn ich mir allerdings die Ergebnisse der Funktion 'svm' ausgeben lasse, sehe ich allerdings ebenfalls immer wieder die gleichen Ergebnisse (auch mit 'summary'). Dies bedeutet, ich sehe die sich ändernden Werte erst, wenn ich mir mehrmals mit der svm-Funktion Modelle berechnen lasse, und mit diesen als Argument in der 'prediction'-Funktion mir 'probabilities' berechnen lasse - Allerdings nicht, wenn ich vorher den seed setze.
Aus diesem Grund tippe ich, dass in der svm-Funktion Numerik läuft, deren Startwerte vom seed abhängen, die aber instabile Ergebnisse liefert... Oder so ähnlich.

Hat da jemand ähnliche Erfahrungen gemacht? Oder gibt es vielleicht da schon Diskussionen zu?

Dank&Gruß
Schubbiaschwilli
bigben
Beiträge: 2577
Registriert: Mi Okt 12, 2016 9:09 am

Re: Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von bigben »

Hallo schubbiaschwilli,

Ich habe leider keine Ahnung und keine Erfahrung mit SVMs. Hier vermutet jemand, dass diw Wahl der Kreuzvalidierungsgruppen der Ansatzpunkt ist, wo der Zufalldzahlengenerator und damit das seed ins Spiel kommen: https://stats.stackexchange.com/a/532425/117812

HTH, Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schubbiaschwilli
Beiträge: 229
Registriert: Di Jun 27, 2017 12:09 pm

Re: Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von schubbiaschwilli »

Hallo Bernhard!

Danke für deine Anregung - Allerdings nutze ich keine Kreuzvalidierung, so dass ich an dieser Stelle noch nicht weitergekommen bin.
Als nächstes werde ich aber versuchen, dieses Problem in Python nachzubilden - Vielleicht bringt es was... (Das war der Schritt, denn ich nicht machen wollte, und habe halt die Hoffnung, ich bekomme noch einen entscheidenden Hinweis). Nun ja, das wird ein paar Tage dauern, bis ich die Zeit finde...

Dank&Gruß Schubbiaschwilli
bigben
Beiträge: 2577
Registriert: Mi Okt 12, 2016 9:09 am

Re: Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von bigben »

Da habe ich tatsächlich nicht genau genug gelesen, sorry.

LG, Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schubbiaschwilli
Beiträge: 229
Registriert: Di Jun 27, 2017 12:09 pm

Re: Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von schubbiaschwilli »

Gude!

Um das mal weiter voranzubringen: Es gibt auch die library kernlab, mit der man ebenfalls SVM berechnen kann.

Code: Alles auswählen

# Mod data
iris_mod <- iris

iris_mod$Setosa <- ifelse(iris$Species=="setosa",1,0)
iris_mod <- iris_mod[,c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Setosa" )]

# Split into Training- and Testdata
TrainingsData <- iris_mod[-c(1),]
TestData <- iris_mod[c(1),]

# Build model and make prediction
library(kernlab)

# Alternierend
predict(ksvm(Setosa~., data=TrainingsData, type="C-svc", kernel="rbfdot", kpar=list(sigma=1), C=100, prob.model=TRUE, scaled=TRUE), newdata=TestData, type="probabilities")

# Konstant
set.seed(87654)
predict(ksvm(Setosa~., data=TrainingsData, type="C-svc", kernel="rbfdot", kpar=list(sigma=1), C=100, prob.model=TRUE, scaled=TRUE), newdata=TestData, type="probabilities")

# Konstant, wenn das Model nicht noch einmal geändert wird
SVMmodel <- ksvm(Setosa~., data=TrainingsData, type="C-svc", kernel="rbfdot", kpar=list(sigma=1), C=100, prob.model=TRUE, scaled=TRUE)
predict(SVMmodel, newdata=TestData, type="probabilities")
Hier sind die Ergebnisse ähnlich - Es liegt also (so interpretiere ich das) nicht an der library, sondern es scheint ein Problem von SVM zu sein - So meine Interpretation dieser Ergebnisse.

Dank&Gruß Schubbiaschwilli
Athomas
Beiträge: 675
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von Athomas »

Aus diesem Grund tippe ich, dass in der svm-Funktion Numerik läuft, deren Startwerte vom seed abhängen, die aber instabile Ergebnisse liefert...
"Instabil" ist ja ein hässliches Wort für "probabilistisch" - aus dem "Handbuch" von e1071 zur Funktion "svm":
"The probability model for classification fits a logistic distribution using maximum likelihood to the decision values of all binary classifiers, and computes the a-posteriori class probabilities for the multi-class problem using quadratic optimization. The probabilistic regression model assumes (zero-mean) laplace-distributed errors for the predictions, and estimates the scale parameter using maximum likelihood."
Wenn ich mir allerdings die Ergebnisse der Funktion 'svm' ausgeben lasse, sehe ich allerdings ebenfalls immer wieder die gleichen Ergebnisse (auch mit 'summary').
Machma str() und guck Dir die Werte von probA und probB an: da ändert sich was und bei einer vorgegebenen seed nicht!
schubbiaschwilli
Beiträge: 229
Registriert: Di Jun 27, 2017 12:09 pm

Re: Alternierende Ergebnisse bei der vorhergesagten Wahrscheinlichkeit bei SVM/e1071

Beitrag von schubbiaschwilli »

Gude!

Äh, da werden keine 'Zufalls'zahlen, also einzelne Ereignisse gewürfelt, sondern das Ergebnis sollte die (geschätzte) Wahrscheinlichkeit sein, mit der ein bestimmter Datensatz vom Modell in eine bestimmte Kategorie eingeordnet wird - Und dieser Wert sollte doch fest sein, oder verstehe ich da was falsch?

Dank&Gruß Schubbiaschwilli
Antworten