2

テスト用とトレーニング用の 2 つの異なるデータセットから 2 つの異なる .arff ファイルを用意しました。それぞれに等しいインスタンスがありますが、各ファイルの特徴ベクトルの次元を変更する異なる特徴があります。これらの各ファイルで相互検証を行ったところ、完全に機能しています。これは、.arff ファイルが適切に準備され、エラーがないことを示しています。

ここで、評価用のテスト ファイルと比較して次元数の少ないトレーニング ファイルを使用するとします。次のエラーが表示されます。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5986
at  weka.classifiers.bayes.NaiveBayesMultinomial.probOfDocGivenClass(NaiveBayesMultinomial.java:295)
at weka.classifiers.bayes.NaiveBayesMultinomial.distributionForInstance(NaiveBayesMultinomial.java:254)
at weka.classifiers.Evaluation.evaluationForSingleInstance(Evaluation.java:1657)
at weka.classifiers.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1694)
at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1574)
at TrainCrossValidateARFF.main(TrainCrossValidateARFF.java:44)

weka のテスト ファイルには、 train と同じかそれより少ない数の機能が必要ですか? 評価用コード

public class TrainCrossValidateARFF{
    private static DecimalFormat df = new DecimalFormat("#.##");
    public static void main(String args[]) throws Exception
    {
            if (args.length != 1 && args.length != 2) {
                    System.out.println("USAGE: CrossValidateARFF <arff_file> [<stop_words_file>]");
                    System.exit(-1);
            }
            String TrainarffFilePath = args[0];
            DataSource ds = new DataSource(TrainarffFilePath);
            Instances Train = ds.getDataSet();
            Train.setClassIndex(Train.numAttributes() - 1);

            String TestarffFilePath = args[1];
            DataSource ds1 = new DataSource(TestarffFilePath);
            Instances Test  = ds1.getDataSet();
            // setting class attribute
            Test.setClassIndex(Test.numAttributes() - 1);

            System.out.println("-----------"+TrainarffFilePath+"--------------");
            System.out.println("-----------"+TestarffFilePath+"--------------");
            NaiveBayesMultinomial naiveBayes = new NaiveBayesMultinomial();
            naiveBayes.buildClassifier(Train);

            Evaluation eval = new Evaluation(Train);
            eval.evaluateModel(naiveBayes,Test);
            System.out.println(eval.toSummaryString("\nResults\n======\n", false));
}
}
4

3 に答える 3

5

weka のテスト ファイルには、 train と同じかそれより少ない数の機能が必要ですか? 評価用コード

同じ数の機能が必要です。? を挿入する必要があるかもしれません。クラス属性についても。

Weka Architect Mark Hallによると

互換性を保つには、インスタンスの 2 つのセットのヘッダー情報が同じである必要があります。つまり、属性の数が同じで、名前が同じで、順序が同じである必要があります。さらに、すべての名義属性は、インスタンスの両方のセットで同じ順序で宣言された同じ値を持つ必要があります。テスト セット内の不明なクラス値については、それぞれの値を欠落に設定するだけです。つまり、"?" です。

于 2012-06-08T10:42:02.263 に答える
1

Weka のwikiによると、機能の数はトレーニング セットとテスト セットの両方で同じである必要があります。また、これらの機能のタイプ (名義、数値など) も同じである必要があります。

また、どちらのデータセットにも Weka フィルターを適用していないと仮定します。各データセットに個別にフィルターを適用すると (同じフィルターであっても)、データセットに互換性がなくなることがよくあります。

于 2012-06-08T12:32:37.177 に答える
0

データセットをトレーニング セットとテスト セットに分割するにはどうすればよいですか?

RemovePercentage フィルター (パッケージ weka.filters.unsupervised.instance) を使用できます。

エクスプローラーで次の操作を行うだけです。

トレーニング セット:

-完全なデータセットをロードする

-前処理パネルでRemovePercentageフィルターを選択します

-分割の正しいパーセンテージを設定します

-フィルターを適用する

-生成されたデータを新しいファイルとして保存します

テストセット:

- データセット全体をロードします (または、元に戻すを使用してデータセットへの変更を元に戻します)。

-まだ選択されていない場合は、RemovePercentage フィルターを選択します

-invertSelection プロパティを true に設定します

-フィルターを適用する

-生成されたデータを新しいファイルとして保存します

于 2015-06-04T13:46:07.627 に答える