我想要这样做的原因是我有一个额外的编号文件数据集(让我们称之为编号文件'数据集),它们对应于实例上的字符串ID,我想使用预测标签作为过滤器来获取numberedFiles数据集的子集。为了提供更多背景信息,我想分别对误报和漏报进行细分(这是带标签的二元分类'是'和' no')。
因此,理论工作流程将是这样的:
1)在java中加载.arff文件,使用RemoveType过滤器设置FilteredClassifier,用于字符串ID。
2)使用评估类执行交叉验证。
3)以某种方式使用新的预测标签访问实例。
4)使用新的预测标签循环所有实例。如果预测=='否'和实际=='是',将与样本关联的字符串ID写入文本文件中以显示漏报。如果预测=='是'和实际==' no',将与样本相关联的字符串ID写入文本文件中以获得误报。
正如您所看到的,问题在于第3步。到目前为止,我只能使用' eval.predictions()'获得NominalPrediction元素的FastVector。这些元素包含预测标签,实际标签,重量,分布。但它们不包含有关与实例关联的功能的任何信息(即我需要的字符串ID)。我知道在weka Explorer中你可以输出每个实例的附加属性(在这种情况下我需要的字符串ID),但我无法弄清楚如何在java中访问它。
顺便说一下,这是参考的代码片段
Instances trainingData = DataSource.read("my_data_file.arff");
trainingData.setClassIndex(trainingData.numAttributes()-1);
// build classifier
J48 classifier = new J48();
RemoveType removeID = new RemoveType();
removeID.setAttributeType(new SelectedTag("Delete string attributes", RemoveType.TAGS_ATTRIBUTETYPE));
FilteredClassifier meta = new FilteredClassifier();
meta.setClassifier(classifier);
meta.setFilter(removeID);
Evaluation eval = new Evaluation(trainingData);
Random r = new Random(1);
// 10-fold
eval.crossValidateModel(meta, trainingData, 10, r);
System.out.println(eval.toSummaryString("=== Cross-Validation Summary ===\n", false));
System.out.println(eval.toClassDetailsString("=== Detailed Accuracy By Class ===\n"));
System.out.println(eval.toMatrixString("=== Confusion Matrix ===\n"));
FastVector predictions = eval.predictions();
答案 0 :(得分:0)
很抱歉,但我不确定我是否完全理解您的需求,尤其是当您谈论String ID时。 RemoveType旨在删除指定类型的所有属性,因此如果指定" string"那之后你不会得到任何字符串。根据我的理解,你最好使用RemoveWithValues。
如果要在预测时访问完整数据集属性/功能,则不应使用评估,而应使用标准weka代码进行分类。请查看"对实例进行分类"在这里:http://weka.wikispaces.com/Use+Weka+in+your+Java+code