如何在java应用程序中使用序列化分类器对新实例进行分类

时间:2011-05-09 22:01:00

标签: java weka

我想使用序列化分类器对新实例进行分类。我找到了这门课,但我不明白。

arg[2] =类属性名称和arg[3] =从原始数据集预测的实例索引

以下是此课程的代码:

import weka.core.*;
import weka.classifiers.*;

import java.io.*;

/**
 * A little class for testing deserialization and prediction.
 * 
 * @author FracPete (fracpet at waikat dot ac dot nz)
 */
public class Blah {

   /**
    * Takes 4 arguments:
    * <ol>
    *   <li>serialized model</li>
    *   <li>ARFF file</li>
    *   <li>class attribute name</li>
    *   <li>1-based index of an instance to predict from original dataset</li>
    * </ol>
    */
   public static void main(String[] args) throws Exception {
      // read the arff training file
      BufferedReader reader = new BufferedReader(new FileReader(args[1]));
      Instances in = new Instances(reader);
      in.setClass(in.attribute(args[2]));

      // instance to classify
      int index = Integer.parseInt(args[3]) - 1;
      Instance toClassifyInstance = (Instance) in.instance(index).copy();
      toClassifyInstance.setClassValue(Instance.missingValue());

      // deserialize model
      Classifier cls = null;
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream(args[0]));
      cls = (Classifier) ois.readObject();
      ois.close();

      // PREDICTION
      double clsLabel = cls.classifyInstance(toClassifyInstance);
      String classLabel = in.classAttribute().value((int) clsLabel);

      System.out.println(classLabel + " =?= " + in.instance(index).stringValue(in.classIndex()));
   }
}

提前致谢。

2 个答案:

答案 0 :(得分:4)

第一个参数args [0]是将用于分类的序列化分类器的路径名。下一个参数是Instances构造函数期望在arff文件中的数据集路径。此集必须具有与创建序列化分类器时使用的训练数据中的功能兼容的功能(因此,相同顺序的完全相同的功能)。 args [2]是属性的名称,它是来自arff的数据集中的class属性,args [3]是索引加上一个实例,它将自己的副本分类在类的值之后标签已被设置为缺失。

如果您尝试对“外部”实例进行分类,例如。如果你已经内置了一些代码,那么实例在分类之前仍然必须有一些指向兼容数据集的链接。这可以使用实例上的方法setDataset(Instances)来完成。没有完成兼容性检查,因此您可能希望检查实例上的checkInstance(Instance)。

答案 1 :(得分:0)

大多数分类器在预测之前需要一组训练数据。该训练数据用于创建模型,然后可以使用该模型进行分类。看起来这里发生的一切就是他们正在读取已被序列化的模型,然后对其进行预测。也就是说,在通过一些训练数据来创建分类器之后,可能会使用ObjectOutputStream(http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html)。

如果这不能解决您的困惑,请澄清您要求的内容。