Search code examples
matlabmachine-learningclassificationsvmlibsvm

libsvm output prediction probability for multi-label classification


I am trying to use libsvm (with Matlab interface) to run some multi-label classification problem. Here is some toy problem using IRIS data:

load fisheriris;

featuresTraining                        = [meas(1:30,:); meas(51:80,:); meas(101:130,:)];
featureSelectedTraining                 = featuresTraining(:,1:3);

groundTruthGroupTraining                = [species(1:30,:); species(51:80,:); species(101:130,:)];
[~, ~, groundTruthGroupNumTraining]     = unique(groundTruthGroupTraining);

featuresTesting                         = [meas(31:50,:); meas(81:100,:); meas(131:150,:)];
featureSelectedTesting                  = featuresTesting(:,1:3);

groundTruthGroupTesting                 = [species(31:50,:); species(81:100,:); species(131:150,:)];
[~, ~, groundTruthGroupNumTesting]      = unique(groundTruthGroupTesting);

% Train the classifier
optsStruct                              = ['-c ', num2str(2), ' -g ', num2str(4), '-b ', 1];
SVMClassifierObject                     = svmtrain(groundTruthGroupNumTraining, featureSelectedTraining, optsStruct);

optsStruct                              = ['-b ', 1];
[predLabelTesting, predictAccuracyTesting, ...
    predictScoresTesting]               = svmpredict(groundTruthGroupNumTesting, featureSelectedTesting, SVMClassifierObject, optsStruct);

However, for the predict probabilities I have got (the first 12 rows of results showed here)

1.08812899093155    1.09025554950852    -0.0140009056912001
0.948911671379753   0.947899227815959   -0.0140009056926024
0.521486301840914   0.509673405799383   -0.0140009056926027
0.914684487894784   0.912534150299246   -0.0140009056926027
1.17426551505833    1.17855350325579    -0.0140009056925103
0.567801459258613   0.557077025701113   -0.0140009056926027
0.506405203427106   0.494342606399178   -0.0140009056926027
0.930191457490471   0.928343421250020   -0.0140009056926027
1.16990617214906    1.17412523596840    -0.0140009056926026
1.16558843984163    1.16986137054312    -0.0140009056926015
0.879648874624610   0.876614924593740   -0.0140009056926027
-0.151223818963057  -0.179682730685229  -0.0140009056925999

I am confused that how some of the probabilities are larger than 1 and some of them are negative?

However, the predicted label seems quite accurate:

1
1
1
1
1
1
1
1
1
1
1
3

with final output of

Accuracy = 93.3333% (56/60) (classification)

Then how to interpret the results of the predicted probabilities? Thanks a lot. A.


Solution

  • The output of an svm are not probabilities!

    The score's sign indicates whether it belongs to class A or class B. And if the score is 1 or -1 it is on the margin, although that is not particularly useful to know.

    If you really need probabilities, you can convert them using Platt scaling. You basically apply a sigmoid function to them.