weka.core.UnassignedDataset在创建未标记的实例时发生exception

我训练了一个IBK分类器,其中包含我手动创建的一些训练数据,如下所示:

ArrayList atts = new ArrayList(); ArrayList classVal = new ArrayList(); classVal.add("C1"); classVal.add("C2"); atts.add(new Attribute("a")); atts.add(new Attribute("b")); atts.add(new Attribute("c")); atts.add(new Attribute("d")); atts.add(new Attribute("@@class@@", classVal)); Instances dataRaw = new Instances("TestInstances", atts, 0); dataRaw.setClassIndex(dataRaw.numAttributes() - 1); double[] instanceValue1 = new double[]{3,0,1,0,0}; dataRaw.add(new DenseInstance(1.0, instanceValue1)); double[] instanceValue2 = new double[]{2,1,1,0,0}; dataRaw.add(new DenseInstance(1.0, instanceValue2)); double[] instanceValue3 = new double[]{2,0,2,0,0}; dataRaw.add(new DenseInstance(1.0, instanceValue3)); double[] instanceValue4 = new double[]{1,3,0,0,1}; dataRaw.add(new DenseInstance(1.0, instanceValue4)); double[] instanceValue5 = new double[]{0,3,1,0,1}; dataRaw.add(new DenseInstance(1.0, instanceValue5)); double[] instanceValue6 = new double[]{0,2,1,1,1}; dataRaw.add(new DenseInstance(1.0, instanceValue6)); 

然后我建立了分类器:

 IBk ibk = new IBk(); try { ibk.buildClassifier(dataRaw); } catch (Exception e) { e.printStackTrace(); } 

我想创建一个带有未标记类的新实例并对此实例进行分类,我尝试了下面没有运气。

 IBk ibk = new IBk(); try { ibk.buildClassifier(dataRaw); double[] values = new double[]{3,1,0,0,-1}; DenseInstance newInst = new DenseInstance(1.0,values); double classif = ibk.classifyInstance(newInst); System.out.println(classif); } catch (Exception e) { e.printStackTrace(); } 

我只是得到以下错误

 weka.core.UnassignedDatasetException: DenseInstance doesn't have access to a dataset! at weka.core.AbstractInstance.classAttribute(AbstractInstance.java:98) at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:74) at TextCategorizationTest.instancesWithDoubleValues(TextCategorizationTest.java:136) at TextCategorizationTest.main(TextCategorizationTest.java:33) 

看起来我在创建新实例时做错了什么。 如何准确创建未标记的实例?

提前致谢

问题出在这一行:

 double classif = ibk.classifyInstance(newInst); 

当您尝试对newInst进行分类newInst ,Weka会抛出exception,因为newInst没有与之关联的Instances对象(即数据集) – 因此它对类属性一无所知。

您应该首先创建一个类似于dataRaw的新Instances对象,向其添加未标记的实例,设置类索引,然后尝试对其进行分类,例如:

 Instances dataUnlabeled = new Instances("TestInstances", atts, 0); dataUnlabeled.add(newInst); dataUnlabeled.setClassIndex(dataUnlabeled.numAttributes() - 1); double classif = ibk.classifyInstance(dataUnlabeled.firstInstance()); 

当您对与数据集无关的新实例进行分类时,您将看到此错误。 您必须使用setDataset您创建的每个新实例关联到Instances对象。

 //Make a place holder Instances //If you already have access to one, you can skip this step Instances dataset = new Instances("testdata", attr, 1); dataset.setClassIndex(classIdx); DenseInstance newInst = new DenseInstance(1.0,values); //To associate your instance with Instances object, in this case dataset newInst.setDataset(dataset); 

在此之后,您可以对新创建的实例进行分类。

 double classif = ibk.classifyInstance(newInst); 

http://www.cs.tufts.edu/~ablumer/weka/doc/weka.core.Instance.html

详细的实施链接

请参阅WEKA文档的第203 – 204页。 这对我帮助很大! (Weka手册是一个pdf文件,位于你的weka安装文件夹中。只需打开doucmentation.html,它就会指向pdf手册。)

复制粘贴第17章(使用WEKA API /在内存中创建数据集)的代码清单的一些片段应该可以帮助您解决任务。