Skip to content

SVM can be tricked into running proba()  #4791

@kousu

Description

@kousu

It is possible to make svm.SVC run svm_predict_probability() without having been trained with probability=True. Example:

from sklearn import datasets, svm
I = datasets.load_iris()
X, Y = I.data, I.target

G = svm.SVC()
G.fit(X,Y)
G.predict_proba(X) #--->
"""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/sklearn/svm/base.py", line 542, in predict_proba
    self._check_proba()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/sklearn/svm/base.py", line 510, in _check_proba
    " probability=%r" % self.probability)
AttributeError: predict_proba is not available when probability=False
"""

#trick sklearn:
G.probability = True

# now it works:
G.predict_proba(X) #--->
"""
array([[  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   5.00000075e-08,   1.00000015e-07],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
       [  9.99999850e-01,   1.00000015e-07,   5.00000075e-08],
[...]
"""

(interestingly the probabilities do seem to correspond to reasonable predictions, but every class has a fixed set of probability values; I saw this when writing my own code against libsvm too; I don't know what to make of it, probably an upstream bug)

libsvm provides svm_check_probability_model() precisely to catch this case. It seems you aren't, but you could!

Metadata

Metadata

Assignees

No one assigned

    Labels

    EasyWell-defined and straightforward way to resolve

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions