Scikit-learn predict_proba donne de mauvaises réponses

C'est une question de suivi à partir de Comment savoir ce que les classes sont représentées dans le tableau de predict_proba dans Scikit-learn

Dans cette question, j'ai cité le code suivant:

>>> import sklearn
>>> sklearn.__version__
'0.13.1'
>>> from sklearn import svm
>>> model = svm.SVC(probability=True)
>>> X = [[1,2,3], [2,3,4]] # feature vectors
>>> Y = ['apple', 'orange'] # classes
>>> model.fit(X, Y)
>>> model.predict_proba([1,2,3])
array([[ 0.39097541,  0.60902459]])

J'ai découvert à cette question, ce résultat représente la probabilité de le point appartenant à chaque classe, dans l'ordre donné par le modèle.classes_

>>> zip(model.classes_, model.predict_proba([1,2,3])[0])
[('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]

Donc... cette réponse, si on l'interprète correctement, dit que le point est probablement un "orange" (avec un assez faible niveau de confiance, en raison de la petite quantité de données). Mais intuitivement, ce résultat est manifestement inexact, puisque le point donné est identique à la formation des données pour 'pomme'. Juste pour être sûr, j'ai testé le sens inverse:

>>> zip(model.classes_, model.predict_proba([2,3,4])[0])
[('apple', 0.60705475211840931), ('orange', 0.39294524788159074)]

De nouveau, manifestement incorrect, mais dans l'autre sens.

Enfin, j'ai essayé avec des points qui ont été beaucoup plus loin.

>>> X = [[1,1,1], [20,20,20]] # feature vectors
>>> model.fit(X, Y)
>>> zip(model.classes_, model.predict_proba([1,1,1])[0])
[('apple', 0.33333332048410247), ('orange', 0.66666667951589786)]

Encore une fois, le modèle prédit la mauvaise probabilités. MAIS, le modèle.prédire la fonction se à droite!

>>> model.predict([1,1,1])[0]
'apple'

Maintenant, je me souviens avoir lu quelque chose dans les docs sur predict_proba inexacte pour les petits jeux de données, mais je n'arrive pas à le retrouver. Est-ce le comportement attendu, ou suis-je en train de faire quelque chose de mal? Si c'EST le comportement attendu, alors pourquoi ne le prédire et predict_proba fonction de désaccord de la sortie? Et surtout, quelle taille fait le jeu de données doivent être avant que je puisse avoir confiance dans les résultats de predict_proba?

-------- Mise à JOUR --------

Ok, donc j'ai fait un peu plus d'expériences dans ce: le comportement de predict_proba est fortement dépendante de 'n', mais pas en aucune façon prévisible!

>>> def train_test(n):
...     X = [[1,2,3], [2,3,4]] * n
...     Y = ['apple', 'orange'] * n
...     model.fit(X, Y)
...     print "n =", n, zip(model.classes_, model.predict_proba([1,2,3])[0])
... 
>>> train_test(1)
n = 1 [('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]
>>> for n in range(1,10):
...     train_test(n)
... 
n = 1 [('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]
n = 2 [('apple', 0.98437355278112448), ('orange', 0.015626447218875527)]
n = 3 [('apple', 0.90235408180319321), ('orange', 0.097645918196806694)]
n = 4 [('apple', 0.83333299908143665), ('orange', 0.16666700091856332)]
n = 5 [('apple', 0.85714254878984497), ('orange', 0.14285745121015511)]
n = 6 [('apple', 0.87499969631893626), ('orange', 0.1250003036810636)]
n = 7 [('apple', 0.88888844127886335), ('orange', 0.11111155872113669)]
n = 8 [('apple', 0.89999988018127364), ('orange', 0.10000011981872642)]
n = 9 [('apple', 0.90909082368682159), ('orange', 0.090909176313178491)]

Comment dois-je utiliser cette fonction en toute sécurité dans mon code? À tout le moins, est-il une valeur de n pour laquelle il sera garanti d'accord avec le résultat du modèle.prévoir?

InformationsquelleAutor Alex | 2013-06-10