如何使用 libsvm 计算多类预测的概率?

Posted

技术标签:

【中文标题】如何使用 libsvm 计算多类预测的概率?【英文标题】:How to compute the probability of a multi-class prediction using libsvm? 【发布时间】:2011-02-15 05:41:57 【问题描述】:

我正在使用libsvm,文档让我相信有一种方法可以输出输出分类准确性的可信概率。是这样吗?如果是这样,谁能提供一个清晰的例子来说明如何在代码中做到这一点?

目前,我正在以下列方式使用 Java 库

    SvmModel model = Svm.svm_train(problem, parameters);
    SvmNode x[] = getAnArrayOfSvmNodesForProblem();
    double predictedValue = Svm.svm_predict(model, x);

【问题讨论】:

【参考方案1】:

鉴于您的 code-sn-p,我假设您想使用与 libSVM 打包的 Java API,而不是 jlibsvm 提供的更详细的 API。

要使用概率估计进行预测,请使用 svm_parameter 字段 probability 设置为 1 训练模型。然后,只需更改您的代码,使其调用 svm 方法 svm_predict_probability 而不是 svm_predict

修改你的 sn-p,我们有:

parameters.probability = 1;
svm_model model = svm.svm_train(problem, parameters);

svm_node x[] = problem.x[0]; // let's try the first data pt in problem
double[] prob_estimates = new double[NUM_LABEL_CLASSES]; 
svm.svm_predict_probability(model, x, prob_estimates);

值得了解的是,使用多类概率估计进行训练可以改变分类器所做的预测。有关这方面的更多信息,请参阅问题Calculating Nearest Match to Mean/Stddev Pair With LibSVM。

【讨论】:

@dmcer 哪个包的学习曲线更小(与 libSVM 或 jlibsvm 一起打包的 Java API)?一般来说,我是 SVM 的新手。 @rohanbk - 可能是 jlibsvm,因为它看起来和感觉就像一个典型的 Java API。 @dmcer 你有使用 WEKA 支持 SVM 的经验吗? @rohanbk - 不多。但是,这将是一个相当不错的选择,因为它可以让您轻松地在数据上对其他分类器进行基准测试。 @rohanbk - 我知道的唯一好的示例代码是“legacyexec”命令行工具:dev.davidsoergel.com/trac/jlibsvm/browser/trunk/src/main/java/…【参考方案2】:

接受的答案就像一个魅力。确保在训练期间设置probability = 1

如果您在置信度未达到阈值时尝试放弃预测,以下是代码示例:

double confidenceScores[] = new double[model.nr_class];
svm.svm_predict_probability(model, svmVector, confidenceScores);

/*System.out.println("text="+ text);
for (int i = 0; i < model.nr_class; i++) 
    System.out.println("i=" + i + ", labelNum:" + model.label[i] + ", name=" + classLoadMap.get(model.label[i]) + ", score="+confidenceScores[i]);
*/

//finding max confidence; 
int maxConfidenceIndex = 0;
double maxConfidence = confidenceScores[maxConfidenceIndex];
for (int i = 1; i < confidenceScores.length; i++) 
    if(confidenceScores[i] > maxConfidence)
        maxConfidenceIndex = i;
        maxConfidence = confidenceScores[i];
    


double threshold = 0.3; // set this based data & no. of classes
int labelNum = model.label[maxConfidenceIndex];
// reverse map number to name
String targetClassLabel = classLoadMap.get(labelNum); 
LOG.info("classNumber:, className:; confidence:; for text:",
        labelNum, targetClassLabel, (maxConfidence), text);
if (maxConfidence < threshold ) 
    LOG.info("Not enough confidence; threshold=", threshold);
    targetClassLabel = null;

return targetClassLabel;

【讨论】:

以上是关于如何使用 libsvm 计算多类预测的概率?的主要内容,如果未能解决你的问题,请参考以下文章

LibSVM for MATLAB中多类分类概率估计的解释

使用 libsvm 训练多类时的数据要求是啥?

如何使用 libsvm 库(Matlab)实现 1 对 1 多类分类?

matlab中用svm如何做多类别分类(R2013a)?

如何将具有多类的 LibSVM 文件转换为 RDD [labelPoint]

解释多类逻辑回归中的预测概率