如何使用 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 库(Matlab)实现 1 对 1 多类分类?