14

モデルを作成して保存するためのコードを作成しました。正常に動作します。私の理解では、データはデフォルトで10倍に分割されています。モデルを作成するときに、データを2つのセット(トレーニングとテスト)に分割したいと思います。Weka UIでは、「パーセンテージ分割」ラジオボタンを使用してそれを行うことができます。コードでそれを行う方法を知りたいです。80%がトレーニングで、20%がテストである2つの部分に分割したいと思います。これが私のコードです。

        FilteredClassifier model = new FilteredClassifier();
        model.setFilter(new StringToWordVector());
        model.setClassifier(new NaiveBayesMultinomial());
        try {
            model.buildClassifier(trainingSet);
        } catch (Exception e1) { // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(
                        "/Users/me/models/MyModel.model"));
        oos.writeObject(model);
        oos.flush();
        oos.close();

ここのtrainingSetは、すでにインスタンスオブジェクトに入力されています。誰かがこれを手伝ってくれますか?

前もって感謝します!

4

2 に答える 2

23

UIクラスClassifierPanelのメソッドstartClassifier()で、次のコードを見つけました。

// Percent split

int trainSize = (int) Math.round(inst.numInstances() * percent
    / 100);
int testSize = inst.numInstances() - trainSize;
Instances train = new Instances(inst, 0, trainSize);
Instances test = new Instances(inst, trainSize, testSize);

したがって、データセットをランダム化した後...

trainingSet.randomize(new java.util.Random(0));

...trainingSet同じ方法で分割することをお勧めします:

int trainSize = (int) Math.round(trainingSet.numInstances() * 0.8);
int testSize = trainingSet.numInstances() - trainSize;
Instances train = new Instances(trainingSet, 0, trainSize);
Instances test = new Instances(trainingSet, trainSize, testSize);

次にClassifier#buildClassifier(Instances data)、セットインスタンスの80%で分類器をトレーニングするために使用します。

model.buildClassifier(train);

更新:@ChengkunWuの回答のおかげで、上記のランダム化ステップを追加しました。

于 2013-02-05T15:35:15.613 に答える
8

分割をラ​​ンダム化することもできます。

data.randomize(new java.util.Random(0));
于 2014-02-20T18:52:57.517 に答える