4

私はlibsvmを使用しており、ドキュメントは、出力分類の精度の信じられている確率を出力する方法があると私に信じさせます。これはそうですか?もしそうなら、誰かがコードでそれを行う方法の明確な例を提供できますか?

現在、私は次のようにJavaライブラリを使用しています

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

2 に答える 2

8

コードスニペットを前提として、jlibsvmによって提供されるより冗長なものではなく、libSVMにパッケージ化されたJavaAPIを使用することを想定ます

確率推定による予測を有効にするには、svm_parameterフィールドの 確率 を1に設定してモデルをトレーニングします。次に、コードを変更して、ではなくsvmメソッドsvm_predict_probabilitysvm_predictを呼び出すようにします。

スニペットを変更すると、次のようになります。

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);

マルチクラス確率推定を使用したトレーニングは、分類器によって行われる予測を変更する可能性があることを知っておく価値があります。詳細については、LibSVMを使用した平均/標準偏差ペアへの最も近い一致の計算の質問を参照してください。

于 2010-05-04T01:22:39.217 に答える
1

受け入れられた答えは魅力のように機能しました。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;
于 2015-02-03T07:54:03.043 に答える