【问题标题】:How to compute the probability of a multi-class prediction using libsvm?如何使用 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);

【问题讨论】:

    标签: java machine-learning probability svm libsvm


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 2015-02-01
      • 2021-05-31
      • 2014-08-11
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多