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 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 StringToWordVector 和 SMO 的 Weka 分类项目