Как классифицировать новый экземпляр, используя сериализованный классификатор в Java-приложении - PullRequest
3 голосов
/ 10 мая 2011

Я хочу классифицировать новый экземпляр, используя сериализованный классификатор.Я нашел этот класс, но не понимаю его.

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

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 15 мая 2011

Первый параметр, args [0], - это путь сериализованного классификатора, который будет использоваться для классификации. Следующий параметр - это путь к набору данных, который конструктор Instances ожидает в файле arff. Этот набор должен иметь функции, совместимые с теми, которые содержатся в данных обучения, использованных при создании сериализованного классификатора (то есть точно такие же функции в том же порядке). args [2] - это имя атрибута, который является атрибутом класса в наборе данных из arff, а args [3] - это индекс плюс один экземпляр, который будет иметь свою собственную копию, классифицированную после значения класса ярлык установлен как отсутствующий.

Если вы пытаетесь классифицировать «внешний» экземпляр, например. после того как вы встроили некоторый код, экземпляр все еще должен иметь ссылку на некоторый совместимый набор данных перед классификацией. Это можно сделать с помощью метода setDataset (Instances) в экземпляре. Проверка совместимости не выполняется, поэтому вы можете проверить с помощью экземпляра checkInstance (Instance).

0 голосов
/ 10 мая 2011

Большинству классификаторов требуется набор обучающих данных перед прогнозированием. Эти данные обучения используются для создания модели, которую затем можно использовать для классификации. Похоже, что все, что здесь происходит, это то, что они читают в сериализованной модели, а затем делают из нее прогноз. То есть, скорее всего, используется ObjectOutputStream (http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html) после обработки некоторых обучающих данных для создания классификатора.

Если это не отвечает тому, что вас смущает, уточните, что вы ищете, чуть дальше.

...