2017-06-01 3 views
1

Ich habe eine große Datensätze mit 10000 Datensätze, so dass 5000 zu Klasse 1 und verbleibenden 5000 zu Klasse -1 gehören. Ich habe Random Forest verwendet und eine gute Genauigkeit von über 90% erreicht.Drucken Sie tatsächliche und vorhergesagte Klassenbezeichnungen mit zufälliger Gesamtstruktur in Java

Nun, wenn ich eine ARFF Datei

@relation cds_orf 
 
@attribute start numeric 
 
@attribute end numeric 
 
@attribute score numeric 
 
@attribute orf_coverage numeric 
 
@attribute class {1,-1} 
 
@data 
 
(suppose this contains 5 records)

meine Ausgabe sollte so etwas wie dieses

No Actual_class Predicted class 
 
1  1     1 
 
2  1     1 
 
3 -1     -1 
 
4  1     -1 
 
5  1     1

Ich will sein die Jav ein Code, um diesen Ausgang zu drucken. Vielen Dank. (Hinweis: Ich habe classifier.classifyInstance() verwendet, aber es gibt NullPointerException)

Antwort

2

Nun, ich fand die Antwort selbst nach einer Menge Forschung. Der folgende Code tut das gleiche und schreibt die Ausgabe in die Anthere-Datei orf_out.

import java.io.BufferedReader; 
 
import java.io.BufferedWriter; 
 
import java.io.FileReader; 
 
import java.io.FileWriter; 
 
import java.io.PrintWriter; 
 
import java.util.Random; 
 
import weka.classifiers.Evaluation; 
 
import weka.classifiers.trees.RandomForest; 
 
import weka.core.Instances; 
 
    
 
/** 
 
* 
 
* @author samy 
 
*/ 
 
public class WekaTest { 
 
    
 
    /** 
 
    * @throws java.lang.Exception 
 
    */ 
 
    public static void rfnew() throws Exception { 
 
     BufferedReader br; 
 
     int numFolds = 10; 
 
     br = new BufferedReader(new FileReader("orf_arff")); 
 
    
 
     Instances trainData = new Instances(br); 
 
     trainData.setClassIndex(trainData.numAttributes() - 1); 
 
     br.close(); 
 
     
 
     RandomForest rf = new RandomForest(); 
 
     rf.setNumTrees(100);   
 
     
 
     Evaluation evaluation = new Evaluation(trainData); 
 
     evaluation.crossValidateModel(rf, trainData, numFolds, new Random(1)); 
 
     rf.buildClassifier(trainData); 
 
     PrintWriter out = new PrintWriter("orf_out"); 
 
     out.println("No.\tTrue\tPredicted"); 
 
     for (int i = 0; i < trainData.numInstances(); i++)  
 
     { 
 
      String trueClassLabel; 
 
      trueClassLabel = trainData.instance(i).toString(trainData.classIndex()); 
 
      // Discreet prediction 
 
      double predictionIndex = 
 
      rf.classifyInstance(trainData.instance(i)); 
 

 
      // Get the predicted class label from the predictionIndex. 
 
      String predictedClassLabel;    
 
      predictedClassLabel = trainData.classAttribute().value((int) predictionIndex); 
 
      out.println((i+1)+"\t"+trueClassLabel+"\t"+predictedClassLabel); 
 
     } 
 
     
 
     out.println(evaluation.toSummaryString("\nResults\n======\n", true)); 
 
     out.println(evaluation.toClassDetailsString()); 
 
     out.println("Results For Class -1- "); 
 
     out.println("Precision= " + evaluation.precision(0)); 
 
     out.println("Recall= " + evaluation.recall(0)); 
 
     out.println("F-measure= " + evaluation.fMeasure(0)); 
 
     out.println("Results For Class -2- "); 
 
     out.println("Precision= " + evaluation.precision(1)); 
 
     out.println("Recall= " + evaluation.recall(1)); 
 
     out.println("F-measure= " + evaluation.fMeasure(1)); 
 
     out.close(); 
 
    } 
 
}

Ich brauchte buildClassifier in meinem Code zu verwenden.

Verwandte Themen