2010-05-03 3 views
4

Я использую libsvm, и документация заставляет меня думать, что есть способ вывести предполагаемую вероятность точности классификации выпуска. Это так? И если да, может ли кто-нибудь дать ясный пример того, как это сделать в коде?Как вычислить вероятность многоклассового прогнозирования с использованием libsvm?

В настоящее время я использую библиотеку Java следующего образом

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

ответ

7

Учитывая код-фрагмент, я предполагаю, что вы хотите использовать API Java упакованный с libSVM, а не более подробный, предоставленный jlibsvm.

Чтобы включить предсказание с оценками вероятности, тренировать модель с полем svm_parameterprobabilityустановлен на 1. Затем просто измените свой код так, чтобы он вызывал метод svm svm_predict_probability, а не svm_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); 

Стоит знать, что обучение с мультиклассируют вероятностью оценивает может изменить прогнозы сделал классификатором. Подробнее об этом см. На вопрос Calculating Nearest Match to Mean/Stddev Pair With LibSVM.

+0

@dmcer Какого пакет имеет меньший кривое обучение (на Java API упакованный с libSVM или jlibsvm)? Я новичок в SVM в целом. – GobiasKoffi

+0

@rohanbk - возможно, jlibsvm, поскольку он выглядит и похож на типичный Java API. – dmcer

+0

@dmcer Есть ли у вас опыт использования WEKA для SVM? – GobiasKoffi

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^