Domanda

libsvm e la documentazione mi porta a credere che ci sia un modo per uscita la probabilità creduto di accuratezza di una classificazione di uscita. È così? E se è così, qualcuno può fornire un chiaro esempio di come farlo in codice?

Al momento, sto usando le librerie Java nel modo seguente

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

Soluzione

Dato il codice-frammento di, ho intenzione di assumere che si desidera utilizzare l'API Java confezionato con libSVM , piuttosto che il più dettagliato quello fornito da jlibsvm .

Per abilitare la previsione con stime di probabilità, addestrare un modello con la svm_parameter probabilità insieme a 1 . Poi, basta modificare il codice in modo che chiama il svm_predict_probability , piuttosto che svm_predict.

Modifica il tuo frammento, abbiamo:

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

vale la pena di sapere che la formazione con le stime di probabilità multiclasse possono cambiare le previsioni da parte del classificatore. Per ulteriori informazioni, consultare la domanda Calcolo più vicina abbinare a significare / stdDev Coppia Con LibSVM .

Altri suggerimenti

La risposta accettata funzionato come un fascino. Assicurati di probability = 1 set durante l'allenamento.

Se si sta cercando di eliminare la previsione quando la fiducia non è soddisfatta con soglia, ecco il codice di esempio:

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top