我正在尝试对以下格式的数据使用过滤分类器:
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_data
是m_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}}
看起来它期望设置类值。
答案 0 :(得分:0)
我认为您需要从unlabeledInstance
中删除类值(因此,不需要m_instances.setClassIndex(m_instances.numAttributes()-1)
)。当Weka对测试实例进行分类时,它只需要特性而不是类,所以如果你将类留在实例中,那么Weka得到的不是数组中的额外条目,而是给你ArrayIndexOutOfBoundsException
。
答案 1 :(得分:0)
我这样解决了:
删除discretize.setInputFormat(m_data);
。当您使用过滤分类器时,weka将调用SetUp方法为您执行此操作。
我正在使用naivebayesUpdate NaiveBayes