2017-01-27 2 views
0

Ich bin neu in SVM. Ich verwende jlibsvm für eine Multi-Class-Klassifizierung Problem. Grundsätzlich mache ich ein Satzklassifikationsproblem. Es gibt 3 Klassen. Was ich verstanden habe ist Ein-gegen-alle-Klassifizierung. Ich habe ein vergleichsweise kleines Zugset. Insgesamt 75 Sätze, zu denen jeweils 25 Sätze gehören.Wie jlibsvm Vorhersage Wahrscheinlichkeit in Multi-Class-Klassifikation

I 3 SVMs mache (also 3 verschiedene Modelle), wo während des Trainings, in SVM_A gehören Sätze der Klasse A wird ein echtes Etikett, das heißt und andere Sätze wird ein haben - 1 Etikett. Entsprechend durchgeführt für SVM_B und SVM_C.

Während des Testens, um die wahre Bezeichnung eines Satzes zu erhalten, gebe ich den Satz zu 3 Modellen und ich nehme die Vorhersage Wahrscheinlichkeit von diesen 3 Modellen zurückgegeben. Welcher den höchsten Wert zurückgibt, ist die Klasse, zu der der Satz gehört.

So mache ich. Aber ich bekomme die gleiche Vorhersagewahrscheinlichkeit für jeden Satz im Testset für alle Modelle.

A predicted:0.012820514 
B predicted:0.012820514 
C predicted:0.012820514 

Diese Werte werden für alle Sätze im Trainingssatz wiederholt.

Die folgende ist, wie ich festgelegten Parameter für die Ausbildung:

C_SVC svm = new C_SVC(); 
MutableBinaryClassificationProblemImpl problem; 

ImmutableSvmParameterGrid.Builder builder = ImmutableSvmParameterGrid.builder(); 

// create training parameters ------------ 
HashSet<Float> cSet; 
HashSet<LinearKernel> kernelSet; 

cSet = new HashSet<Float>(); 
cSet.add(1.0f); 

kernelSet = new HashSet<LinearKernel>(); 
kernelSet.add(new LinearKernel()); 

// configure finetuning parameters 

builder.eps = 0.001f; // epsilon 
builder.Cset = cSet; // C values used 
builder.kernelSet = kernelSet; //Kernel used 
builder.probability=true; // To get the prediction probability 
ImmutableSvmParameter params = builder.build(); 

Was mache ich falsch?

Gibt es einen anderen besseren Weg Multi-Class-Klassifizierung anderen als das zu tun?

Antwort

2

Sie erhalten die gleiche Ausgabe, weil Sie das gleiche Modell dreimal generieren.

Der Grund dafür ist, dass jlibsvm in der Lage ist, eine Multiclass-Klassifizierung out-of-the-Box basierend auf den bereitgestellten Daten durchzuführen (LIBSVM selbst unterstützt dies auch). Wenn festgestellt wird, dass in den angegebenen Daten mehr als zwei Klassen vorhanden sind, führt es automatisch eine Klassifizierung mit mehreren Klassen durch. Daher ist ein manueller 1vsN-Ansatz nicht erforderlich. Geben Sie die Daten einfach mit Klassen-Labels für jede Kategorie an.

ist jedoch jlibsvm noch in Beta und stützt sich auf eine ziemlich alte Version von LIBSVM (2,88). Viel hat changed. Für eine intuitivere Java-Bindung (im Vergleich zur Standardversion LIBSVM) können Sie einen Blick auf zlibsvm werfen, der über Maven Central verfügbar ist und auf der neuesten Version LIBSVM basiert.

Verwandte Themen