5

たとえば、モデル(J4.8ツリーなど)を作成し、相互検証で評価したとします。このモデルを使用して新しいデータセットを分類するにはどうすればよいですか?「提供されたテストセット」オプションで分類するデータを含むファイルを設定し、「その他のオプション」ウィンドウで「予測の出力」をマークして、分類を再度実行できます。ほぼ必要なものが生成されますが、非常に奇妙なワークフローのようです。また、すべてのモデルを再作成するため、不必要な時間がかかる可能性があります。すでに構築されたモデルで分類を行うためのより簡単な方法はありますか?

4

2 に答える 2

6

これにはいくつかの方法があります。

最初の1つ

コマンドラインを使用してモデルを保存およびロードできます。-lおよび-dコマンドラインスイッチを使用すると、これを実行できます。

wekaドキュメントから

-l
    モデル入力ファイルを設定します。ファイル名が「.xml」で終わる場合、
    PMMLファイルがロードされるか、それが失敗した場合はオプションがロードされます
    XMLファイルから。
-d
    モデル出力ファイルを設定します。ファイル名が「.xml」で終わる場合、
    モデルではなく、オプションのみがXMLファイルに保存されます。

二つ目

また、モデルを生成した後、2回目のクリックを使用してモデルを保存およびロードします。見る次の画像

三つ目

また、分類子のJavaコードを生成することもできます。このようにして、分類子を保存して再利用します。次の手順に従います。

  1. [その他のオプション]ボタンをクリックします。
  2. 開いた状態からダイアログ、出力ソースコードを選択します。
  3. 分類子名にもっと意味のある名前を付けます。

これらの手順により、j48分類子のJavaクラスが出力されます。以下のクラスWekaJ48ForIrisは、Irisデータセットで使用するためにwekaによって作成されています。より便利にするために、リファクタリングが必要になる場合があります。

class WekaJ48ForIris {

  public static double classify(Object[] i)
    throws Exception {

    double p = Double.NaN;
    p = WekaJ48ForIris.N26a305890(i);
    return p;
  }
  static double N26a305890(Object []i) {
    double p = Double.NaN;
    if (i[3] == null) {
      p = 0;
    } else if (((Double) i[3]).doubleValue() <= 0.6) {
      p = 0;
    } else if (((Double) i[3]).doubleValue() > 0.6) {
    p = WekaJ48ForIris.N18c079301(i);
    } 
    return p;
  }
  static double N18c079301(Object []i) {
    double p = Double.NaN;
    if (i[3] == null) {
      p = 1;
    } else if (((Double) i[3]).doubleValue() <= 1.7) {
    p = WekaJ48ForIris.N4544b022(i);
    } else if (((Double) i[3]).doubleValue() > 1.7) {
      p = 2;
    } 
    return p;
  }
  static double N4544b022(Object []i) {
    double p = Double.NaN;
    if (i[2] == null) {
      p = 1;
    } else if (((Double) i[2]).doubleValue() <= 4.9) {
      p = 1;
    } else if (((Double) i[2]).doubleValue() > 4.9) {
    p = WekaJ48ForIris.N3a0872863(i);
    } 
    return p;
  }
  static double N3a0872863(Object []i) {
    double p = Double.NaN;
    if (i[3] == null) {
      p = 2;
    } else if (((Double) i[3]).doubleValue() <= 1.5) {
      p = 2;
    } else if (((Double) i[3]).doubleValue() > 1.5) {
      p = 1;
    } 
    return p;
  }
}
于 2012-05-10T15:19:44.203 に答える
2

その他のパッケージには特別なクラスSerializedClassifierがあり、モデルファイルをパラメーターとして受け取り、模擬トレーニングフェーズがあります。

于 2011-03-17T11:15:28.990 に答える