3

シリアル化された分類子を使用して新しいインスタンスを分類したいと考えています。このクラスを見つけましたが、理解できません。

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

前もって感謝します。

4

2 に答える 2

4

最初のパラメーター args[0] は、分類に使用されるシリアライズされた分類子のパス名です。次のパラメーターは、インスタンス コンストラクターが arff ファイルにあると想定するデータ セットのパスです。このセットには、シリアル化された分類子を作成するときに使用されるトレーニング データ内の機能と互換性のある機能が必要です (したがって、まったく同じ機能が同じ順序で提供されます)。args[2] は、arff からのデータ セット内のクラス属性である属性の名前であり、args[3] は、クラスの値の後に分類される自身のコピーを持つインスタンスのインデックスと 1 つです。ラベルが欠落に設定されています。

「外部」インスタンスを分類しようとしている場合。いくつかのコードを組み込んだ場合でも、インスタンスは分類する前に互換性のあるデータ セットへのリンクを持っている必要があります。これは、インスタンスでメソッド setDataset(Instances) を使用して実行できます。互換性チェックは行われていないため、インスタンスで checkInstance(Instance) を使用してチェックすることをお勧めします。

于 2011-05-14T22:02:33.553 に答える
0

ほとんどの分類器は、予測の前に一連のトレーニング データを必要とします。このトレーニング データは、分類に使用できるモデルの作成に使用されます。ここで起こっていることは、シリアル化されたモデルを読み込んで、それから予測を行っていることだけのようです。つまり、分類子を作成するためにいくつかのトレーニング データをかき回した後、ObjectOutputStream (http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html) を使用した可能性があります。

混乱していることがこれで解決しない場合は、探しているものをもう少し明確にしてください。

于 2011-05-09T22:45:55.867 に答える