Weka filteredClassifier arrayOutOfBoundsException

时间:2012-07-17 08:45:25

标签: machine-learning classification weka decision-tree

我正在尝试对以下格式的数据使用过滤分类器:

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)的{​​{1}}训练数据Instance unlabeledInstance = new DenseInstance(1.0,features); unlabeledInstance.setDataset(m_instances); m_classifier.classifyInstance(unlabeledInstance); 。这里没有问题(我可以看到)。 我序列化这个模型并稍后加载它。然后我用它来分类看不见/新数据,如下所示:

double[]

其中feature是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) 错误。任何人都可以对此有所了解吗?

跟踪是:

{{1}}

看起来它期望设置类值。

2 个答案:

答案 0 :(得分:0)

我认为您需要从unlabeledInstance中删除类值(因此,不需要m_instances.setClassIndex(m_instances.numAttributes()-1))。当Weka对测试实例进行分类时,它只需要特性而不是类,所以如果你将类留在实例中,那么Weka得到的不是数组中的额外条目,而是给你ArrayIndexOutOfBoundsException

答案 1 :(得分:0)

我这样解决了: 删除discretize.setInputFormat(m_data);。当您使用过滤分类器时,weka将调用SetUp方法为您执行此操作。 我正在使用naivebayesUpdate NaiveBayes