Search code examples
javatreewekadecision-tree

How can I use weka to implement a decision tree?


I'm working with java, eclipse and weka, I want to show the tree with every rule and the predictin of a set of data to test my decision tree.

I was trying somenthing with this code but it's not doing what I need which is to show all the tree with every possible rule. I can only see part of the tree not all.

And I haven't been able to test it with a data test and data training, I think it has somenthing to do with the format I'm using in the text and train file.

So the question is, how can I show the tree with every possible decition and then test it ??

This is what I have so far:

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

the error:

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 and maitretest.txt have are somenthing like this:

@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

Solution

  • Yes ofcourse it has problem with your file format. save the both files as .arff file and then repeat the process. And yes for that you will need to read arff files with arffloader....below code will help you...

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

    Good luck :)