找到Weka中分类实例的概率

时间:2015-04-18 02:33:56

标签: machine-learning nlp classification weka

我使用Weka进行分类,使用LibSVM分类器,并希望得到一些与我从评估模型得到的输出相关的帮助。

在下面的示例中,我的test.arff文件包含1000个实例,我想知道每个实例被分类为是/否的概率(这是一个简单的两类问题)。

例如,例如1,如果它被归类为“是”,那么它被分类的可能性是我正在寻找的东西。

以下是我目前的代码段:

            // Read and load the Training ARFF file 
        ArffLoader trainArffLoader = new ArffLoader();
        trainArffLoader.setFile(new File("train_clusters.arff"));
        Instances train = trainArffLoader.getDataSet();
        train.setClassIndex(train.numAttributes() - 1);
        System.out.println("Loaded Train File");

        // Read and load the Test ARFF file 
        ArffLoader testArffLoader = new ArffLoader();
        testArffLoader.setFile(new File("test_clusters.arff"));
        Instances test = testArffLoader.getDataSet();
        test.setClassIndex(test.numAttributes() - 1);
        System.out.println("Loaded Test File");


        LibSVM libsvm = new LibSVM();

        libsvm.buildClassifier(train);

        // Evaluation
        Evaluation evaluation = new Evaluation(train);
        evaluation.evaluateModel(libsvm, test);
        System.out.println(evaluation.toSummaryString("\nPrinting the Results\n=====================\n", true));
        System.out.println(evaluation.toClassDetailsString());

1 个答案:

答案 0 :(得分:1)

您应该使用libsvm.distributionForInstance方法。它返回每个类索引的概率估计值(在您的情况下为2)。

例如,要从测试集打印每个实例的所有估计值,请使用以下内容:

    for (Instance instance : test) {
        double[] distribution = libsvm.distributionForInstance(instance);
        for (int classIndex : classIndices) {
            System.out.print(distribution[classIndex] + " ");
        }
        System.out.println();
    }

请注意,这不是真实概率,而是普拉特方法的估计(见question)。