import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.File;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.trees.J48;
import weka.core.Instance;
import weka.core.Instances;
/**
* WekaTest - example to illustrate the Weka-API
*
* This example takes data from an arff-file, trains a J48 classifier
* on it and reports classification results for some test data
*
*
* @author timo
* @version 1.0-20070911
*/
public class WekaTest {
private static final String TEST_FILENAME = "res/test.arff";
private static final String TRAINING_FILENAME = "res/train.arff";
private static final String CLASSIFIER_FILENAME = "res/j48.classifier";
/**
* train classifier on training data
* @param arffFilename name of an arff-file to train on
* @return trained decision tree (J48)
*/
public static Classifier createJ48Classifier(String arffFilename) {
File arffFile = new File(arffFilename);
FileReader arffReader;
Instances instances;
Classifier classifier;
try {
arffReader = new FileReader(arffFile);
instances = new Instances(arffReader);
instances.setClassIndex(instances.numAttributes() - 1);
classifier = new J48();
classifier.buildClassifier(instances);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.toString());
return null;
}
return classifier;
}
/**
* load classifier from file
* @param filename name of the file the serialized classifier is stored in
* @return classifier from file
*/
public static Classifier loadClassifier(String filename) {
Classifier classifier;
try {
InputStream is = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(is);
classifier = (Classifier) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return classifier;
}
/**
* store classifier in a file
* @param classifier to store
* @param filename of file to store to
* @return true on success, false on failure
*/
public static boolean saveClassifier(Classifier classifier, String filename) {
try {
OutputStream os = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(classifier);
oos.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* evaluate a classifier using the template in weka.classifiers.Evaluation
* prints evaluation details to standard out
*
* @param c classifier
*/
public static void evaluate(Classifier c) {
try {
Instances trainInstances = new Instances(new FileReader(new File(TRAINING_FILENAME)));
trainInstances.setClassIndex(trainInstances.numAttributes() - 1);
Instances testInstances = new Instances(new FileReader(new File(TEST_FILENAME)));
testInstances.setClassIndex(testInstances.numAttributes() - 1);
Evaluation eva = new Evaluation(trainInstances);
eva.evaluateModel(c, testInstances);
System.out.println(eva.toSummaryString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* classifies the instance i given classifier c and
* prints the result to standard out
* @param c
* @param i
*/
public static void classifyInstance(Classifier c, Instance i) {
double gold = i.classValue();
double silver = -1.0;
double[] distribution = new double[i.numAttributes()];
try {
silver = c.classifyInstance(i);
distribution = c.distributionForInstance(i);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
sb.append("instance ");
sb.append(i.toString());
sb.append("\n");
sb.append("\twith class attribute ");
sb.append(gold);
sb.append("\n");
sb.append("\tis classified as ");
sb.append(silver);
sb.append("\n");
sb.append("distribution among classes is \n");
for (int j = 0; j < distribution.length; j++) {
sb.append("\t");
sb.append(j);
sb.append(": ");
sb.append(distribution[j]);
sb.append("\n");
}
System.out.println(sb.toString());
}
public static void classifyFile(Classifier c, String filename) {
try {
Instances testInstances = new Instances(new FileReader(new File(filename)));
testInstances.setClassIndex(testInstances.numAttributes() - 1);
for (Enumeration e = testInstances.enumerateInstances();
e.hasMoreElements(); ) {
Instance i = e.nextElement();
classifyInstance(c, i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
/* create classifier from training data: */
/* OR load classifier from file: */
Classifier c = createJ48Classifier(TRAINING_FILENAME);
//Classifier c = loadClassifier(CLASSIFIER_FILENAME);
/* classify the samples in the test data and output the results one-by-one */
classifyFile(c, TEST_FILENAME);
/* evaluate classifier with given test data: */
evaluate(c);
/* store classifier to disk */
saveClassifier(c, CLASSIFIER_FILENAME);
}
}