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 - 过滤掉 MultiClassClassifer 中的类