2

J48ツリーを使用しているときに奇妙な結果が出ます。48個の特徴のベクトルを分類する必要があります。これは非常にうまく機能しますが、「最適化」しようとすると、奇妙な結果に遭遇します。

私はメソッド分類を持っています:

    public boolean classify(double feature1, double feature2, double[] featureVec ) {
        Instance toBeClassified = new Instance(2+featureVec.length);
        toBeClassified.setValue(0, feature1);
        toBeClassified.setValue(1, feature2);
        for (int i = 2; i < f.length + 2; ++i) {
            toBeClassified.setValue(i, featureVec [i - 2]);
        }
        toBeClassified.setDataset(dataset);

        try {
            double _class = tree.classifyInstance(toBeClassified);
            return _class > 0;
        } catch (Exception e1) {
            if(Logging.active) { 
                logger.error(e1.getMessage(), e1.getCause());}
            }
        return false;
    }
}

それは非常にうまく機能します、そして私は私が物事を正しくやっていることを願っています。しかし、すべてのメソッド呼び出しで行われるインスタンスの作成を削除したかったので、インスタンスをBeClassified = new Instance(48);に移動しました。クラス本体に線を引きます-したがって、一度だけ作成されます。それは、他の結果と比べてわずかに異なる結果が得られるという事実にもかかわらず、うまく機能します。たとえば、400の分類から、1つが異なります(言うまでもなく、正しくありません)。しかし、その理由はわかりません...ここにwekaを使用している人がいることを願っています。そうすれば、何が起こっているのか、何が間違っているのかを理解できます。(はい、2 + featureVec.lengthは48です)。

ありがとう、よろしく。

4

1 に答える 1

3

J48に問題がある可能性はほとんどありません。分類子の作成と分類自体の両方が決定論的です。あなたのコードの大部分を投稿することをお勧めします。これは見栄えが良い(バギーがない)からです。

400ループテストの場合:これは、例外なく、毎回同じ結果を確実に生成するはずです。2つの考え:

  • インスタンスの値がモデルの値と同じであるかどうかをチェックするassertを配置します。これにより、インスタンスのバグが除外されます。

  • 分類はマルチスレッド方式で実行されますか?共有データオブジェクトはありますか?

于 2010-08-04T19:21:08.227 に答える