Questa è una domanda di follow-up da How to know what classes are represented in return array from predict_proba in Scikit-learnscikit-learn predict_proba fornisce risposte sbagliate
In questa domanda, ho citato il seguente codice:
>>> 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]])
ho scoperto in che domanda a questo risultato rappresenta la probabilità del punto appartenenti a ciascuna classe, nell'ordine dato dal model.classes_
>>> zip(model.classes_, model.predict_proba([1,2,3])[0])
[('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]
Quindi ... questa risposta, se correttamente interpretato, dice che il punto è probabilmente un 'arancione' (con una fiducia abbastanza bassa, a causa della piccola quantità di dati). Ma intuitivamente, questo risultato è ovviamente errato, poiché il punto indicato era identico ai dati di allenamento per "mela". Per sicurezza, ho provato anche il retro:
>>> zip(model.classes_, model.predict_proba([2,3,4])[0])
[('apple', 0.60705475211840931), ('orange', 0.39294524788159074)]
Di nuovo, ovviamente errato, ma nella direzione opposta.
Infine, l'ho provato con punti che erano molto più lontani.
>>> 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)]
Ancora, il modello prevede le probabilità errate. MA, la funzione model.predict ha ragione!
>>> model.predict([1,1,1])[0]
'apple'
Ora, mi ricordo di aver letto qualcosa nella documentazione su predict_proba essere impreciso per piccoli insiemi di dati, anche se non riesco a trovare di nuovo. È questo il comportamento previsto o sto facendo qualcosa di sbagliato? Se questo è il comportamento previsto, allora perché la funzione predice e predict_proba non concorda con l'output? E, soprattutto, quanto deve essere grande il set di dati prima di potermi fidare dei risultati di predict_proba?
-------- -------- UPDATE
Ok, così ho fatto un altro po 'esperimenti' in questo: il comportamento di predict_proba è fortemente dipendente 'n ', ma non in alcun modo prevedibile!
>>> 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)]
Come si utilizza questa funzione in modo sicuro nel mio codice? Per lo meno, c'è qualche valore di n per il quale sarà garantito il consenso sul risultato di model.predict?
Questo è interessante Bilal ... Non ho davvero bisogno delle probabilità per il mio scopo, solo l'ordine. Penso che questa sia la risposta che sto cercando. – Alex
Sì interessante. Ho avuto lo stesso problema e ho usato questo metodo per ordinare. Mi ha dato risultati migliori di predict_proba() –
Si noti che 'LinearSVC()' produrrà previsioni simili a 'SVC (kernel =' linear ') 'ma non' SVC (kernel =' rbf ') 'che è il kernel predefinito per 'SVC'. – ogrisel