Weka 过滤分类器 arrayOutOfBoundsException

Posted

技术标签:

【中文标题】Weka 过滤分类器 arrayOutOfBoundsException【英文标题】:Weka filteredClassifier arrayOutOfBoundsException 【发布时间】:2012-07-16 03:59:40 【问题描述】:

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

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) 集。这里没有问题(我可以看到)。 我序列化这个模型并稍后加载它。然后我用它来分类看不见的/新的数据,如下所示:

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

其中 features 是一个 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)

看起来它期望设置类值。

【问题讨论】:

【参考方案1】:

我认为您需要从unlabeledInstance 中删除类值(因此也不需要m_instances.setClassIndex(m_instances.numAttributes()-1))。当 Weka 对测试实例进行分类时,它只需要特征而不需要类,因此,如果您将类留在实例中,那么 Weka 不会期望数组中的额外条目并为您提供 ArrayIndexOutOfBoundsException

【讨论】:

我传入新 DenseInstance 的特征不包含任何类值。这是一个包含 138 个双打的列表。 啊对。然后你应该删除m_instances.setClassIndex(m_instances.numAttributes()-1),因为它将最后一个特性设置为类,而它应该只是一个特性/双精度。 这能回答你的问题吗?【参考方案2】:

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

【讨论】:

以上是关于Weka 过滤分类器 arrayOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章

Weka 分类器精度

Weka - 如何查找分类器的输入格式

WEKA - 过滤掉 MultiClassClassifer 中的类

我需要在 weka 中制作一个 SVM 来使用 Java 过滤文档

使用 Weka 进行文本分类

weka 3.7 explorer 无法对文本进行分类