2011-10-18 13 views
5

mis weka muestra la salida:weka - Cómo imprimir incorrectamente instancias de anuncios

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

yo quiero ser capaz de imprimir lo que eran los casos incorrectos para que pueda hacer los ajustes y entender por qué fueron mal clasificados.

mi método de impresión está a continuación.
Estoy intentando encontrar instancias cuyo valor de clase predicho no era igual al valor de clase real y luego imprimir sus atributos.
pero cuando hago esto, la enumeración de atributos no imprime nada.

¿Alguien tiene alguna sugerencia de cómo imprimir las instancias mal clasificadas?

muchas gracias.

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

me acabo de dar cuenta de que está vacío porque me olvidé de envolverlo en una declaración de impresión. – britt

+0

desafortunadamente agregarlo a la declaración de impresión o iterar sobre los valores de la enumeración simplemente me muestra todos los valores posibles de todos los atributos. en realidad, no me dice cuáles fueron los valores attrib para mis instancias mal clasificadas. Cualquier ayuda es muy apreciada. – britt

+0

Entiendo que "Weka output" es de Weka Explorer? Si es así, estos resultados son para validación cruzada, y es muy probable que realice pruebas de otra manera. Antes de sumergirte en el código, ¿puedes hacer una prueba simple? Agrega la cláusula 'else' a tu' si' y cuenta cuántas instancias están realmente clasificadas correctamente ('pred == actual'). – ffriend

Respuesta

1

hago esto de esa manera:

  1. tren clasificador.
  2. Para cada instancia que llamo 'classifier.explain'
  3. Si la clasificación es incorrecta las guardo por la probabilidad incorrecta (de peor error a menos de error confianza)
  4. error más confianza me dan ideas de qué características deben añadirse a clasificador.
+0

No veo el método clasificador.explicar disponible. Sin embargo, su comentario me ayudó a señalar algo. Previamente estaba usando el objeto eval para imprimir los datos de resumen y la matriz de confusión, pero también estaba llamando a clasificador.classifyInstance. la diferencia importante era que los datos eval se basaban en la validación cruzada 10x, y la instancia classify intentaba clasificar la instancia nuevamente usando el clasificador entrenado. – britt

+0

pude obtener la impresión que necesitaba simplemente imprimiendo la instancia como esta: System.out.print (data.instancia (i)); – britt

+0

muchas gracias por hacerme despegar. – britt

0

Esta es la publicación anterior pero tuve el mismo problema y lo resolví de forma diferente. Tal vez alguien como yo lo necesite.

Lo que hice es que la evaluación tiene predicciones método que devuelve ArrayList del objeto de predicción.

Cada objeto de Predicción tiene real y predicho y simplemente imprimí cada instancia que su real no es el mismo valor predicho.

Mi código:

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);; 

     } 

    } 

espero que ayude a alguien.

Cuestiones relacionadas