我训练了一个IBK分类器,其中包含我手动创建的一些训练数据,如下所示:
ArrayList<Attribute> atts = new ArrayList<Attribute>();
ArrayList<String> classVal = new ArrayList<String>();
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)
在创建新实例时看起来我做错了什么。如何准确创建未标记的实例?
先谢谢
答案 0 :(得分:14)
当您对与数据集无关的新实例进行分类时,您将看到此错误。您必须使用Instances
将您创建的每个新实例与setDataset
对象相关联。
//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
答案 1 :(得分:13)
问题在于这一行:
double classif = ibk.classifyInstance(newInst);
当您尝试对newInst
进行分类时,Weka会抛出异常,因为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());
答案 2 :(得分:-1)
参见WEKA文档的第203-204页。这对我帮助很大! (Weka手册是一个pdf文件,位于你的weka安装文件夹中。只需打开doucmentation.html,它就会指向pdf手册。)
复制粘贴第17章代码清单的一些片段(在内存中使用WEKA API /创建数据集)可以帮助您解决任务。