在使用java的weka中,如何在交叉验证后将带有字符串ID的实例与来自Evaluation的预测相匹配?

时间:2014-07-06 11:17:39

标签: java weka

我想要这样做的原因是我有一个额外的编号文件数据集(让我们称之为编号文件'数据集),它们对应于实例上的字符串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();

1 个答案:

答案 0 :(得分:0)

很抱歉,但我不确定我是否完全理解您的需求,尤其是当您谈论String ID时。 RemoveType旨在删除指定类型的所有属性,因此如果指定" string"那之后你不会得到任何字符串。根据我的理解,你最好使用RemoveWithValues。

如果要在预测时访问完整数据集属性/功能,则不应使用评估,而应使用标准weka代码进行分类。请查看"对实例进行分类"在这里:http://weka.wikispaces.com/Use+Weka+in+your+Java+code