我在使用Weka进行分类,使用的是LibSVM分类器,关于评估模型的输出结果,我希望得到一些帮助。
在下面的例子中,我的test.arff文件包含1000个实例,我希望知道每个实例被分类为“是”或“否”的概率(这是一个简单的两类问题)。
例如,对于实例1,如果它被分类为“是”,那么它被分类为“是”的概率是多少,这是我想要知道的。
以下是我目前使用的代码片段:
// 读取并加载训练ARFF文件 ArffLoader trainArffLoader = new ArffLoader(); trainArffLoader.setFile(new File("train_clusters.arff")); Instances train = trainArffLoader.getDataSet(); train.setClassIndex(train.numAttributes() - 1); System.out.println("已加载训练文件"); // 读取并加载测试ARFF文件 ArffLoader testArffLoader = new ArffLoader(); testArffLoader.setFile(new File("test_clusters.arff")); Instances test = testArffLoader.getDataSet(); test.setClassIndex(test.numAttributes() - 1); System.out.println("已加载测试文件"); LibSVM libsvm = new LibSVM(); libsvm.buildClassifier(train); // 评估 Evaluation evaluation = new Evaluation(train); evaluation.evaluateModel(libsvm, test); System.out.println(evaluation.toSummaryString("\n打印结果\n=====================\n", true)); System.out.println(evaluation.toClassDetailsString());
回答:
你应该使用libsvm.distributionForInstance
方法。它会返回每个类别索引的概率估计(在你的情况下是2个类别)。
例如,要打印测试集中每个实例的所有估计值,可以使用如下代码:
for (Instance instance : test) { double[] distribution = libsvm.distributionForInstance(instance); for (int classIndex : classIndices) { System.out.print(distribution[classIndex] + " "); } System.out.println(); }
请注意,这不是真正的概率,而是通过Platt方法进行的估计(参见问题)。