Frage

Ich bin mit LIBSVM und die Dokumentation führt mich zu glauben, dass ein Weg, um Ausgangsgenauigkeit der glaubte Wahrscheinlichkeit eines Ausgangs Einstufung der dort ist. Ist das so? Und wenn ja, kann jemand ein klares Beispiel dafür, wie es im Code zu tun?

Derzeit bin ich mit den Java-Bibliotheken in der folgenden Weise

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

Lösung

Bei der Code-Schnipsel, ich werde Sie davon ausgehen, wollen den Java-API verwenden, verpackt mit libSVM , anstatt die ausführlichere eine zur Verfügung gestellt von jlibsvm .

Zur Vorhersage mit Wahrscheinlichkeitsschätzungen zu ermöglichen, bildet ein Modell mit dem svm_parameter Feld Wahrscheinlichkeit auf 1 gesetzt . Dann einfach den Code ändern, so dass es die SVM-Methode ruft svm_predict_probability , anstatt svm_predict.

Ändern Ihres Schnipsel, die wir haben:

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

Es ist erwähnenswert, dass das Training mit mehrklassige Wahrscheinlichkeitsschätzungen zu wissen, kann die Vorhersagen ändern durch den Klassifikator gemacht. Denn auf diese mehr finden Sie in der Frage Nächste Berechnung Wer passt zu Mittelwert / STDDEV-Paare mit LibSVM .

Andere Tipps

Die akzeptierte Antwort arbeitete wie ein Charme. Achten Sie darauf, Satz probability = 1 während des Trainings.

Wenn Sie versuchen, Vorhersage fallen, wenn das Vertrauen nicht mit Schwellenwert erreicht wird, hier ist das Code-Beispiel:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top