2012-08-14 8 views
6

Ich würde gerne wissen, ob es in WEKA eine Möglichkeit gibt, eine Anzahl von 'Best-Rates' für eine Klassifizierung auszugeben.WEKA Klassifizierung Wahrscheinlichkeit der Klassen

Mein Szenario ist: Ich klassifiziere die Daten zum Beispiel mit Kreuzvalidierung, dann auf Weka-Ausgabe bekomme ich etwas wie: das sind die 3 besten Annahmen für die Klassifizierung dieser Instanz. Was ich will, ist wie, auch wenn eine Instanz nicht korrekt klassifiziert ist, bekomme ich eine Ausgabe der 3 oder 5 besten Annahmen für diese Instanz.

Beispiel:

Klassen: A, B, C, D, E Instances: 1 ... 10

und Ausgabe wären: Beispiel 1 90% wahrscheinlich ist, Klasse A sein, 75% wahrscheinlich Klasse B, 60% gerne Klasse C.

Danke.

Antwort

2

Ich weiß nicht, ob Sie es nativ machen können, aber Sie können nur die Wahrscheinlichkeiten für jede Klasse bekommen, sortiert sie und nehmen Sie die ersten drei. Die gewünschte Funktion ist distributionForInstance(Instance instance), die eine double[] gibt, die die Wahrscheinlichkeit für jede Klasse gibt.

+0

okay danke, ich versuche es. – user1454263

0

Nicht im Allgemeinen. Die gewünschte Information ist nicht bei allen Klassifizierern verfügbar - in den meisten Fällen (z. B. für Entscheidungsbäume) ist die Entscheidung ohne einen Konfidenzwert eindeutig (wenn auch möglicherweise inkorrekt). Ihre Aufgabe erfordert Klassifikatoren, die mit Unsicherheiten umgehen können (z. B. der naive Bayes-Klassifikator).

Technisch gesehen ist es wahrscheinlich am einfachsten, das Modell zu trainieren und dann eine einzelne Instanz zu klassifizieren, für die Weka Ihnen die gewünschte Ausgabe geben soll. Im Allgemeinen können Sie das natürlich auch für Instanzen tun, aber ich denke nicht, dass Weka dies out-of-the-box bietet. Sie müssten den Code wahrscheinlich anpassen oder über eine API (z. B. in R) verwenden.

+0

Ich soll es über die API verwenden – user1454263

0

Wenn Sie eine Wahrscheinlichkeit für die Instanz berechnen, wie genau tun Sie das?

Ich habe meine PART-Regeln und Daten für die neue Instanz here gepostet, aber soweit die Berechnung manuell ich bin nicht so sicher, wie dies zu tun ist! Dank

EDIT: jetzt berechnet:

Privat float [] getProbDist (String split) {

// nimmt etwas wie (52/2), was bedeutet 52 Fällen korrekt klassifiziert und 2 falsch klassifiziert.

if(prob_dis.length > 2) 
     return null; 

    if(prob_dis.length == 1){ 
     String temp = prob_dis[0]; 
     prob_dis = new String[2]; 
     prob_dis[0] = "1"; 
     prob_dis[1] = temp; 
    } 

    float p1 = new Float(prob_dis[0]); 
    float p2 = new Float(prob_dis[1]); 
    // assumes two tags 
    float[] tag_prob = new float[2]; 

    tag_prob[1] = 1 - tag_prob[1]; 
    tag_prob[0] = (float)p2/p1; 

// returns double[] as being the probabilities 

return tag_prob;  
} 
5

weka API hat eine Methode namens Classifier.distributionForInstance() tha verwendet werden kann, die Klassifizierung Vorhersage Verteilung zu erhalten. Sie können die Verteilung dann nach abnehmender Wahrscheinlichkeit sortieren, um Ihre Top-N-Vorhersagen zu erhalten.

Unten ist eine Funktion, die ausdruckt: (1) die Grundwahrheitskennzeichnung der Testinstanz; (2) das vorhergesagte Label von classifyInstance(); und (3) die Vorhersageverteilung von distributionForInstance(). Ich habe das mit J48 verwendet, aber es sollte mit anderen Klassifikatoren funktionieren.

Die Eingabeparameter sind die serialisierte Modelldatei (die Sie während der Modelltrainingsphase erstellen können und die Option -d anwenden) und die Testdatei im ARFF-Format.

public void test(String modelFileSerialized, String testFileARFF) 
    throws Exception 
{ 
    // Deserialize the classifier. 
    Classifier classifier = 
     (Classifier) weka.core.SerializationHelper.read(
      modelFileSerialized); 

    // Load the test instances. 
    Instances testInstances = DataSource.read(testFileARFF); 

    // Mark the last attribute in each instance as the true class. 
    testInstances.setClassIndex(testInstances.numAttributes()-1); 

    int numTestInstances = testInstances.numInstances(); 
    System.out.printf("There are %d test instances\n", numTestInstances); 

    // Loop over each test instance. 
    for (int i = 0; i < numTestInstances; i++) 
    { 
     // Get the true class label from the instance's own classIndex. 
     String trueClassLabel = 
      testInstances.instance(i).toString(testInstances.classIndex()); 

     // Make the prediction here. 
     double predictionIndex = 
      classifier.classifyInstance(testInstances.instance(i)); 

     // Get the predicted class label from the predictionIndex. 
     String predictedClassLabel = 
      testInstances.classAttribute().value((int) predictionIndex); 

     // Get the prediction probability distribution. 
     double[] predictionDistribution = 
      classifier.distributionForInstance(testInstances.instance(i)); 

     // Print out the true label, predicted label, and the distribution. 
     System.out.printf("%5d: true=%-10s, predicted=%-10s, distribution=", 
          i, trueClassLabel, predictedClassLabel); 

     // Loop over all the prediction labels in the distribution. 
     for (int predictionDistributionIndex = 0; 
      predictionDistributionIndex < predictionDistribution.length; 
      predictionDistributionIndex++) 
     { 
      // Get this distribution index's class label. 
      String predictionDistributionIndexAsClassLabel = 
       testInstances.classAttribute().value(
        predictionDistributionIndex); 

      // Get the probability. 
      double predictionProbability = 
       predictionDistribution[predictionDistributionIndex]; 

      System.out.printf("[%10s : %6.3f]", 
           predictionDistributionIndexAsClassLabel, 
           predictionProbability); 
     } 

     o.printf("\n"); 
    } 
}