【问题标题】:how classify a new instance using serialized classifier in java application如何在 Java 应用程序中使用序列化分类器对新实例进行分类
【发布时间】:2011-05-15 06:02:33
【问题描述】:

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

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

这是这个类的代码:

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

提前致谢。

【问题讨论】:

    标签: java weka


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你uuuuuuu正是我要找的东西:)
    【解决方案2】:

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

    如果这没有回答您的困惑,请进一步说明您在寻找什么。

    【讨论】:

    • 谢谢你的回复,是的,我有一个模型,我想在这个模型上公开一个实例来影响类我应该做什么来分类这个实例,我不明白包含的参数
    • 貌似 args[2] 是 item 的 class,它查找 index args[3] 的 item。
    猜你喜欢
    • 2014-03-02
    • 2015-01-21
    • 2012-02-14
    • 1970-01-01
    • 2020-06-16
    • 2014-02-22
    • 2020-08-14
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多