查找在 Weka 中分类实例的概率
Finding the probability with which an instance in classified in Weka
我正在使用 Weka 使用 LibSVM classifier 进行 classification,并且需要一些与我从评估模型获得的输出相关的帮助。
在下面的示例中,我的 test.arff 文件包含 1000 个实例,我想知道每个实例被 class 确定为是/否的概率(这是一个简单的两个 class问题)。
比如1,如果class化为'yes',那么class化的概率是多少,就是我要找的东西。
下面是我目前的代码片段:
// 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());
你应该使用libsvm.distributionForInstance
方法。它 returns 每个 class 索引的概率估计(在您的情况下为 2)。
例如,要打印测试集中每个实例的所有估计值,请使用如下内容:
for (Instance instance : test) {
double[] distribution = libsvm.distributionForInstance(instance);
for (int classIndex : classIndices) {
System.out.print(distribution[classIndex] + " ");
}
System.out.println();
}
请注意,这不是真实概率,而是 Platt 方法做出的估计(参见 question)。
我正在使用 Weka 使用 LibSVM classifier 进行 classification,并且需要一些与我从评估模型获得的输出相关的帮助。
在下面的示例中,我的 test.arff 文件包含 1000 个实例,我想知道每个实例被 class 确定为是/否的概率(这是一个简单的两个 class问题)。
比如1,如果class化为'yes',那么class化的概率是多少,就是我要找的东西。
下面是我目前的代码片段:
// 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());
你应该使用libsvm.distributionForInstance
方法。它 returns 每个 class 索引的概率估计(在您的情况下为 2)。
例如,要打印测试集中每个实例的所有估计值,请使用如下内容:
for (Instance instance : test) {
double[] distribution = libsvm.distributionForInstance(instance);
for (int classIndex : classIndices) {
System.out.print(distribution[classIndex] + " ");
}
System.out.println();
}
请注意,这不是真实概率,而是 Platt 方法做出的估计(参见 question)。