2017-06-01 46 views
1

我有一個包含10000條記錄的大型數據集,其中5000個屬於類1,其餘5000個屬於類-1。我使用隨機森林,並獲得了超過90%的良好準確性。在Java中使用隨機森林打印實際和預測的類標籤

現在,如果我有一個ARFF文件

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

我的輸出應該是這樣的

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

我想要的JAV打印此輸出的代碼。謝謝。 (注意:我已經使用了classifier.classifyInstance(),但它給出了NullPointerException)

回答

2

那麼我經過大量研究後自己找到了答案。以下代碼執行相同的操作,並將輸出寫入另一個文件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(); 
 
    } 
 
}

我需要在我的代碼使用buildClassifier。