Weka 的 SMO 分类器在 buildClassifier 上崩溃

Posted

技术标签:

【中文标题】Weka 的 SMO 分类器在 buildClassifier 上崩溃【英文标题】:SMO classifier from Weka crashes on buildClassifier 【发布时间】:2015-08-05 15:34:14 【问题描述】:

我正在尝试制作一个使用this tutorial 对推文的情绪进行分类的应用程序。我想比较朴素贝叶斯和 SMO 分类器的结果。虽然朴素贝叶斯工作正常,但 SMO 因以下错误而崩溃:

java.lang.ArrayIndexOutOfBoundsException: 6786
    at weka.core.SparseInstance.toDoubleArray(SparseInstance.java:425)
    at weka.filters.unsupervised.attribute.Normalize.batchFinished(Normalize.java:283)
    at weka.filters.Filter.useFilter(Filter.java:682)
    at weka.classifiers.functions.SMO.buildClassifier(SMO.java:1312)
    at machinelearning.WekaTutorial.trainClassifier(WekaTutorial.java:106)
    at machinelearning.WekaTutorial.main(WekaTutorial.java:219)

我的应用程序有点不同(它有 GUI 可以让您搜索推文并选择要分类的推文),但出于测试目的,我修改了教程中原始应用程序的代码,以确保它不是我的错误。我改变了这一行:

classifier = new NaiveBayes();

到这一行:

classifier = new SMO();

我没有碰任何其他东西,但我仍然遇到同样的错误。有谁知道为什么以及如何解决它?

【问题讨论】:

【参考方案1】:

即使一年过去了,它也可能与其他人有关:

首先提供的教程链接无效。

现在,对我来说,错误发生在以下情况:

Instances data1 = ... // something with 50 attributes
Instances data2 = ... // something with 30 attributes
Instances data3 = new Instances(data2, data2.numInstances()) // This constructor creates an empty Instances, with the properties of data2.

data3.add(data1.isntance(0));

smo.buildClassifier(data3);

我们刚刚所做的是将具有 50 个属性的实例添加到包含 30 个属性的数据集中。我们还在具有 30 个属性的数据集上训练了 SMO。

请注意,如果您查询 data3.numAttributes(),则输出为 30,但如果您查询 data3.instance(0).numAttributes(),则输出为 50。

SMO 分类器接受了 30 个属性的训练,它在内部某处查询 data3.instance(0).numAttributes(),得到 50(对我来说,它在 ReplaceMissingValues.class 中)。

所以我意识到错误与这种差异有关,并且我确保我从 data1 插入到 data3 中的各个实例具有正确数量的属性(例如 data2.numAttributes())。

这解决了问题。

【讨论】:

你是如何确定的?你有没有 deleteAttributeAt 直到它是一样的?

以上是关于Weka 的 SMO 分类器在 buildClassifier 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 Weka 中 SMO 分类器的性能?

使用 StringToWordVector 和 SMO 的 Weka 分类项目

weka中的SMO置信度测量

Weka 中 SMO、NaiveBayes 和 BayesNet 分类器的不同结果

Weka 分类器精度

weka中的一元类文本分类?