2012-07-17 41 views
2

我試圖使用過濾分類下列格式的數據:Weka的filteredClassifier arrayOutOfBoundsException

real,real,real,...,nominal

在那裏我有138個真正的價值和表示該類單一的公稱字符串。 我使用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_datam_data.setClassIndex(m_data.numAttributes()-1)集我的(標記)的訓練數據。這裏沒有問題(我可以看到)。 我序列化此模型並稍後加載。然後我用它來看不見/新數據進行分類,像這樣:

Instance unlabeledInstance = new DenseInstance(1.0,features); 
unlabeledInstance.setDataset(m_instances); 
m_classifier.classifyInstance(unlabeledInstance); 

其中設有一個跟隨的輸入數據的格式的double[],但沒有標稱類值。這裏m_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) 

它看起來像它期待類值進行設置。

回答

0

我認爲您需要從unlabeledInstance中刪除類別值(同樣,因此不需要m_instances.setClassIndex(m_instances.numAttributes()-1))。當Weka對測試實例進行分類時,它只需要特徵而不需要類,所以如果您將該類留在實例中,那麼Weka將不會期望數組中出現額外的條目,併爲您提供ArrayIndexOutOfBoundsException

+0

我傳入新DenseInstance的功能不包含任何類值。這是一個138雙打的名單。 – user1531177 2012-07-17 10:22:03

+0

對吧。那麼你應該刪除'm_instances.setClassIndex(m_instances.numAttributes() - 1)',因爲它將最後一個特性設置爲類,而它應該只是一個特性/雙精度。 – Sicco 2012-07-17 13:52:31

+0

這是否回答你的問題? – Sicco 2012-08-15 15:51:49

0

我這樣解決: 刪除discretize.setInputFormat(m_data);。當您使用過濾分類器時,weka會調用SetUp方法來爲您做。 我正在使用naivebayesUpdate NaiveBayes