次の形式のデータでフィルター処理された分類子を使用しようとしています。
real,real,real,...,nominal
ここで、138個の実際の値と、クラスを表す1つの名目上の文字列があります。次のように、基本分類器と教師あり離散化フィルターとしてJ48を使用しています。
Filter discretize = new weka.filters.supervised.attribute.Discretize();
FilteredClassifier fc = new FilteredClassifier();
discretize.setInputFormat(m_data);
J48 ft = new J48();
ft.setOptions(wekaOptions);
fc.setFilter(discretize);
fc.setClassifier(ft);
fc.buildClassifier(m_data);
m_data
セット付きの(ラベル付きの)トレーニングデータはどこにありますかm_data.setClassIndex(m_data.numAttributes()-1)
。ここでは問題はありません(私が見ることができます)。このモデルをシリアル化し、後でロードします。次に、それを使用して、次のように未表示/新しいデータを分類します。
Instance unlabeledInstance = new DenseInstance(1.0,features);
unlabeledInstance.setDataset(m_instances);
m_classifier.classifyInstance(unlabeledInstance);
ここで、featuresはdouble[]
入力データの形式に従いますが、名目上のクラス値はありません。これは、 setm_instances
を使用してトレーニングデータファイルからロードされたもの
m_instances.setClassIndex(m_instances.numAttributes()-1)
です。
ただし、実行m_classifier.classifyInstance(unlabeledInstance)
するとarrayOutOfBoundsException
エラーが発生します。誰かがこれに光を当てることができますか?
トレースは次のとおりです。
07-13 15:15:35.383: W/System.err(30659): java.lang.ArrayIndexOutOfBoundsException: length=138; index=138
07-13 15:15:35.383: W/System.err(30659): at weka.core.DenseInstance.value(DenseInstance.java:309)
07-13 15:15:35.383: W/System.err(30659): at weka.filters.unsupervised.attribute.Discretize.convertInstance(Discretize.java:1047)
07-13 15:15:35.383: W/System.err(30659): at weka.filters.unsupervised.attribute.Discretize.input(Discretize.java:389)
07-13 15:15:35.383: W/System.err(30659): at weka.classifiers.meta.FilteredClassifier.distributionForInstance(FilteredClassifier.java:425)
07-13 15:15:35.383: W/System.err(30659): at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:72)
クラス値が設定されることを期待しているようです。