2011-10-18 18 views
5

miei weka spettacoli di uscita:weka - come stampare correttamente le istanze classificati

Correctly Classified Instances  32083    94.0244 % 
Incorrectly Classified Instances  2039    5.9756 % 

mi vogliono essere in grado di stampare ciò che le istanze non corrette erano così posso effettuare le regolazioni e capire perché sono stati classificati erroneamente.

il mio metodo di stampa è di seguito.
Sto tentando di trovare le istanze il cui valore di classe previsto non era uguale al valore effettivo della classe e quindi di stampare i relativi attributi.
ma quando faccio questo l'enumerazione degli attributi non stampa nulla.

Qualcuno ha un suggerimento su come stampare le istanze errate?

grazie mille.

private void printSummary(Classifier base, Evaluation eval, Instances data) throws Exception 
{ 
    // output evaluation 
    System.out.println(); 
    System.out.println("=== Setup ==="); 
    System.out.println("Classifier: " + classifierName.getClass().getName() + " " + Utils.joinOptions(base.getOptions())); 
    System.out.println("Dataset: " + data.relationName()); 
    System.out.println(); 

    // output predictions 
    System.out.println("# - actual - predicted - error - distribution - token"); 
    for (int i = 0; i < data.numInstances(); i++) 
    { 
     double pred = base.classifyInstance(data.instance(i)); 
     double actual = data.instance(i).classValue(); 
     double[] dist = base.distributionForInstance(data.instance(i)); 

     if (pred != actual) 
     { 
      System.out.print((i+1)); 
      System.out.print(" - "); 
      System.out.print(data.instance(i).toString(data.classIndex())); 
      System.out.print(" - "); 
      System.out.print(data.classAttribute().value((int) pred)); 
      System.out.print(" - "); 
      if (pred != data.instance(i).classValue()) 
       System.out.print("yes"); 
      else 
       System.out.print("no"); 
      System.out.print(" - "); 
      System.out.print(Utils.arrayToString(dist)); 
      System.out.print(" - "); 
      data.instance(i).enumerateAttributes().toString(); 
      System.out.println(); 
     } 
    } 

    System.out.println(eval.toSummaryString()); 
    System.out.println(eval.toClassDetailsString()); 
    System.out.println(eval.toMatrixString()); 
} 
+0

ho appena realizzato che è vuoto perché ho dimenticato di avvolgerlo in una dichiarazione di stampa. – britt

+0

sfortunatamente aggiungendolo a print statement o iterando sui valori dell'enum mi mostra solo tutti i possibili valori di tutti gli attributi. in realtà non mi dice quali sono stati i valori di attrib per le mie istanze classificate erroneamente. Qualsiasi aiuto è molto apprezzato. – britt

+0

Capisco, "Uscita Weka" è di Weka Explorer? Se è così, questi risultati sono per la convalida incrociata e molto probabilmente si fanno test in qualche altro modo. Prima di immergerti nel codice, puoi fare un semplice test: aggiungi la clausola 'else' al tuo' if' e conta quante istanze sono effettivamente classificate correttamente ('pred == actual')? – ffriend

risposta

1

faccio questo in questo modo:

  1. treno classificatore.
  2. Per ogni istanza che io chiamo 'classifier.explain'
  3. Se classificazione sia errata li Store di probabilità non corretta (dal peggiore errore all'errore almeno sicuri)
  4. Errore più fiducioso darmi idee quali caratteristiche dovrebbero essere aggiunti classificatore.
+0

Non vedo il metodo classifier.explain disponibile. Il tuo commento mi ha aiutato a sottolineare qualcosa per me. Precedentemente stavo usando l'oggetto eval per stampare i dati di riepilogo e la matrice di confusione, ma stavo anche chiamando classifier.classifyInstance. l'importante differenza era che i dati di valutazione erano basati sulla convalida incrociata 10x e che l'istanza di classificazione stava tentando di classificare nuovamente l'istanza utilizzando il classificatore addestrato. – britt

+0

Sono stato in grado di ottenere la stampa di cui avevo bisogno semplicemente stampando l'istanza in questo modo: System.out.print (dati.esempio (i)); – britt

+0

grazie mille per avermi scollato. – britt

0

Questo è un vecchio post ma ho avuto lo stesso problema e l'ho risolto in modo diverso. Forse qualcuno come me ne avrà bisogno.

Quello che ho fatto è che la valutazione ha metodi di previsione che restituisce ArrayList dell'oggetto di previsione.

Ogni oggetto di previsione è effettivo e previsto e ho semplicemente stampato ogni istanza che il suo valore attuale non è lo stesso del valore previsto.

Il mio codice:

ArrayList<Prediction> predictions = evaluation.predictions(); 
for (int i = 0, trainDataSize = trainData.size(); i < trainDataSize; i++) { 
     Instance instance = trainData.get(i); 
     Prediction prediction = predictions.get(i); 

     if (prediction.actual() != prediction.predicted()) { 

      System.out.println(instance);; 

     } 

    } 

La speranza è aiutare qualcuno.

Problemi correlati