weka - 如何打印错误分类的实例

Posted

技术标签:

【中文标题】weka - 如何打印错误分类的实例【英文标题】:weka - how to print incorrectly classified instances 【发布时间】:2011-12-10 10:49:51 【问题描述】:

我的 weka 输出显示:

Correctly Classified Instances       32083               94.0244 %
Incorrectly Classified Instances      2039                5.9756 %

我希望能够打印出不正确的实例,以便我可以进行调整并了解它们被错误分类的原因。

我的打印方法如下。 我试图找到预测类值不等于实际类值的实例,然后打印其属性。 但是当我这样做时,属性枚举不打印任何东西。

有没有人建议如何打印出错误分类的实例?

非常感谢。

private void printSummary(Classifier base, Evaluation eval, Instances data) throws Exception

    // output evaluation
    System.out.println();
    System.out.println("=== Setup ===");
    System.out.println("Classifier: " + classifierName.getClass().getName() + " " + Utils.joinOptions(base.getOptions()));
    System.out.println("Dataset: " + data.relationName());
    System.out.println();

    // output predictions
    System.out.println("# - actual - predicted - error - distribution - token");
    for (int i = 0; i < data.numInstances(); i++) 
    
        double pred = base.classifyInstance(data.instance(i));
        double actual = data.instance(i).classValue();
        double[] dist = base.distributionForInstance(data.instance(i));

        if (pred != actual)
        
            System.out.print((i+1));
            System.out.print(" - ");
            System.out.print(data.instance(i).toString(data.classIndex()));
            System.out.print(" - ");
            System.out.print(data.classAttribute().value((int) pred));
            System.out.print(" - ");
            if (pred != data.instance(i).classValue())
                System.out.print("yes");
            else
                System.out.print("no");
            System.out.print(" - ");
            System.out.print(Utils.arrayToString(dist));
            System.out.print(" - ");
            data.instance(i).enumerateAttributes().toString();
            System.out.println();
        
    

    System.out.println(eval.toSummaryString());
    System.out.println(eval.toClassDetailsString());
    System.out.println(eval.toMatrixString());

【问题讨论】:

我刚刚意识到它是空的,因为我忘记将它包装在打印语句中。 不幸的是,将它添加到打印语句或迭代枚举的值只会向我显示所有属性的所有可能值。它实际上并没有告诉我错误分类实例的属性值是什么。非常感谢任何帮助。 我明白了,“Weka 输出”来自 Weka Explorer?如果是这样,这些结果用于交叉验证,您很可能以其他方式进行测试。在深入研究代码之前,您能否做一个简单的测试 - 将 else 子句添加到您的 if 并计算实际上有多少实例被正确分类(pred == actual)? 【参考方案1】:

我就是这样做的:

    训练分类器。 对于每个实例,我都会调用“classifier.explain” 如果分类不正确,我会按错误概率(从最差错误到最不可信错误)存储它们 最自信的错误让我知道应该向分类器添加哪些特征。

【讨论】:

我没有看到 classifier.explain 方法可用。不过,您的评论确实帮助我指出了一些事情。以前我使用 eval 对象打印出汇总数据和混淆矩阵,但我也调用了分类器.classifyInstance。重要的区别在于 eval 数据基于 10 倍交叉验证,并且分类实例试图使用经过训练的分类器再次对实例进行分类。 我能够通过像这样打印实例来获得所需的打印:System.out.print(data.instance(i)); 我很抱歉在 weka 它是 double[] distributionForInstance(Instance instance) Predicts the class memberships for a given instance. 但它并不适用于所有分类器,对于贝叶斯和树它总是返回 1,0。它适用于 LibSVM 和 Logistic 以及其他一些支持预测概率的工具,【参考方案2】:

这是旧帖子,但我遇到了同样的问题并以不同的方式解决了它。也许像我这样的人会需要它。

我所做的是评估具有返回预测对象的 ArrayList 的 predictions 方法。

每个 Prediction 对象都有实际值和预测值,我只是打印了每个实例,表明他的实际值与预测值不同。

我的代码:

ArrayList<Prediction> predictions = evaluation.predictions();
for (int i = 0, trainDataSize = trainData.size(); i < trainDataSize; i++) 
        Instance instance = trainData.get(i);
        Prediction prediction = predictions.get(i);

        if (prediction.actual() != prediction.predicted()) 

            System.out.println(instance);;

        

    

希望对某人有所帮助。

【讨论】:

以上是关于weka - 如何打印错误分类的实例的主要内容,如果未能解决你的问题,请参考以下文章

Weka分类:错误+正确<总实例数,怎么来的?

Weka中决策树和混淆矩阵中正确/错误分类实例之间的差异

如何在 WEKA 中打印出交叉验证后的预测类

在 weka 中识别错误分类的元组

如何使用 MATLAB 从 WEKA 检索类值

为啥决策树显示正确分类而某些实例被错误分类