2016-05-08 7 views
0

Ich arbeite mit Java, Eclipse und Weka, ich möchte den Baum mit jeder Regel und der Prädiktion einer Reihe von Daten zeigen, um meinen Entscheidungsbaum zu testen.Wie kann ich mit weka einen Entscheidungsbaum implementieren?

Ich habe versucht, mit diesem Code etwas zu tun, aber es tut nicht, was ich brauche, um den ganzen Baum mit jeder möglichen Regel zu zeigen. Ich kann nur einen Teil des Baumes nicht alle sehen.

Und ich war nicht in der Lage, es mit einem Datentest und Datentraining zu testen, ich denke es hat etwas mit dem Format zu tun, das ich in der Text- und Zugdatei verwende.

Die Frage ist also, wie kann ich den Baum mit allen möglichen Dezisionen zeigen und dann testen?

Dies ist, was ich bisher:

public class Test { 
    public static BufferedReader readDataFile(String filename) { 
     BufferedReader inputReader = null; 

     try { 
      inputReader = new BufferedReader(new FileReader(filename)); 
      } catch (FileNotFoundException ex) { 
      System.err.println("File not found: " + filename); 
     } 

     return inputReader; 
    } 

    public static void main(String[] args) throws Exception { 

     //Get File 
     BufferedReader reader = readDataFile("maitre.txt"); 

     //Get the data 
     Instances data = new Instances(reader); 
     reader.close(); 

     //Setting class attribute 
     data.setClassIndex(data.numAttributes() - 1); 

     //Make tree 
     J48 tree = new J48(); 
     String[] options = new String[1]; 
     options[0] = "-U"; 
     tree.setOptions(options); 
     tree.buildClassifier(data); 

     //Print tree 
     System.out.println(tree); 

     //Predictions with test and training set of data 

     BufferedReader datafile = readDataFile("maitre.txt"); 
     BufferedReader testfile = readDataFile("maitretest.txt"); 

     Instances train = new Instances(datafile); 
     data.setClassIndex(data.numAttributes() - 1); // from somewhere 
     Instances test = new Instances(testfile); 
     data.setClassIndex(data.numAttributes() - 1); // from somewhere 
     // train classifier 
     Classifier cls = new J48(); 
     cls.buildClassifier(train); 
     // evaluate classifier and print some statistics 
     Evaluation eval = new Evaluation(train); 
     eval.evaluateModel(cls, test); 
     System.out.println(eval.toSummaryString("\nResults\n======\n", false)); 
    } 
} 

der Fehler:

Exception in thread "main" weka.core.UnassignedClassException: weka.classifiers.trees.j48.C45PruneableClassifierTree: Class attribute not set! 
    at weka.core.Capabilities.test(Capabilities.java:1284) 
    at weka.core.Capabilities.test(Capabilities.java:1208) 
    at weka.core.Capabilities.testWithFail(Capabilities.java:1506) 
    at weka.classifiers.trees.j48.C45PruneableClassifierTree.buildClassifier(C45PruneableClassifierTree.java:120) 
    at weka.classifiers.trees.J48.buildClassifier(J48.java:293) 
    at Test.main(Test.java:60) 

maitre.txt und maitretest.txt haben wie diese sind somenthing:

@relation maitre 

@attribute patrons {none, some, full} 
@attribute waitEstation {0-10,10-30,30-60,>60} 
@attribute reservation {TRUE, FALSE} 
@attribute bar {TRUE, FALSE} 
@attribute alternative {TRUE, FALSE} 
@attribute sit {yes, no} 

@data 
some,0-10,TRUE,FALSE,TRUE,yes 
full,30-60,FALSE,FALSE,TRUE,no 
some,0-10,FALSE,TRUE,FALSE,yes 
full,10-30,FALSE,FALSE,TRUE,yes 
full,>60,TRUE,FALSE,TRUE,no 
some,0-10,TRUE,TRUE,FALSE,yes 
none,0-10,FALSE,TRUE,FALSE,no 
some,0-10,TRUE,FALSE,FALSE,yes 
full,>60,FALSE,TRUE,FALSE,no 
full,10-30,TRUE,TRUE,TRUE,yes 
none,0-10,FALSE,FALSE,FALSE,no 
full,30-60,FALSE,TRUE,TRUE,no 

Antwort

0

Ja Natürlich hat es ein Problem mit Ihrem Dateiformat. Speichern Sie beide Dateien als .arff-Datei und wiederholen Sie den Vorgang. Und ja dafür müssen Sie ARFF Dateien mit arffloader lesen .... Code unten wird Ihnen helfen, ...

 ArffLoader loader= new ArffLoader(); 
     loader.setSource(new File("C:/Users/..../Desktop/maitre.arff")); 
     Instances data= loader.getDataSet(); 

Viel Glück :)

+0

Dank, der den Fehler behoben, aber wie kann ich die Ausgabe in diesem Fall erhalten, ja oder nein für jedes Beispiel in der maitretest.arff, weil rigth jetzt erhalte ich allgemeine Ergebnisse. – SSM89

+0

Sie müssen das Ausgabeattribut 'maitetest.arff' als? Und bitte kreuzen Sie die Antwort als akzeptiert an, wenn es geholfen hat. –

+0

folge ich nicht, wie setze ich das Folgeattribut ?? Und dann wie greife ich auf die Ausgabe für jedes Beispiel zu? – SSM89

0

Dieser Code könnte helfen ...

for(int i=0;i<Train.numInstances();i++) 
     { 
       double value=cls.classifyInstance(originalTrain.instance(i)); 
       String prediction=Train.classAttribute().value((int)value); 
     System.out.println(Train.instance(i)+"............Prediction.......... "+prediction); 
     } 

Dieser obige Code dient zur Vorhersage des Werts. Unten finden Sie die Beispieldatei maitretest.arff. Hoffe, es hilft :)

@relation maitretest 

@attribute patrons {none, some, full} 
@attribute waitEstation {0-10,10-30,30-60,>60} 
@attribute reservation {TRUE, FALSE} 
@attribute bar {TRUE, FALSE} 
@attribute alternative {TRUE, FALSE} 
@attribute sit {yes, no} 

@data 
some,0-10,TRUE,FALSE,TRUE,? 
full,30-60,FALSE,FALSE,TRUE,?