2010-05-03 124 views
4

我使用的是libsvm,文檔使我相信有一種方法可以輸出輸出分類精度的相信概率。這是嗎?如果是這樣,任何人都可以提供一個清晰的例子來說明如何在代碼中做到這一點?如何計算使用libsvm進行多類預測的概率?

目前,我使用的Java庫通過以下方式

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

回答

7

鑑於你的代碼片段,我會假設你希望使用libSVM打包的Java API,而不是更詳細的由jlibsvm提供。

爲了能夠與概率估計預測,與svm_parameter字段訓練模型probability設置爲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 2010-10-15 14:49:35

+0

@rohanbk - 可能是jlibsvm,因爲它看起來和感覺就像一個典型的Java API。 – dmcer 2010-10-15 23:20:13

+0

@dmcer您是否有使用WEKA進行SVM的經驗? – GobiasKoffi 2010-10-16 05:26:43

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;