Scikit Learn SVC decision_function et de prédire
J'essaie de comprendre la relation entre decision_function et de prévoir, qui sont des méthodes d'instance de la SVC (http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html). Jusqu'à présent, j'ai compris que la décision de la fonction retourne deux à deux les scores entre les classes. J'étais sous l'impression que prédire choisit la classe qui maximise ses paires score, mais j'ai testé ce et a obtenu des résultats différents. Voici le code que j'utilisais pour essayer de bien comprendre la relation entre les deux. D'abord, j'ai généré le paires score de la matrice, et puis j'ai imprimé la classe qui a maximale par paires score qui était différente de celle de la classe prédite par la fcf.prédire.
result = clf.decision_function(vector)[0]
counter = 0
num_classes = len(clf.classes_)
pairwise_scores = np.zeros((num_classes, num_classes))
for r in xrange(num_classes):
for j in xrange(r + 1, num_classes):
pairwise_scores[r][j] = result[counter]
pairwise_scores[j][r] = -result[counter]
counter += 1
index = np.argmax(pairwise_scores)
class = index_star / num_classes
print class
print clf.predict(vector)[0]
Personne ne sait la relation entre ces prédire et decision_function?
- "la prise de fonction retourne deux à deux les scores entre les classes" est incorrecte. Il doit être le "score pour chaque classe" comme il est écrit dans la page de documentation pour
decision_function
partie: "la Distance des échantillons de X à la séparation hyperplane." - non, l'OP est correct.
sklearn.svm.SVC
utilise des paires (un contre un) décomposition par défaut et les retours des distances pour tous les n(n-1)/2 hyperplans pour chaque échantillon. - Oups, oui, j'ai souvenu d'avoir lu ça quelque part. mais il a été induit en erreur par la documentation. Désolé!
- Après une tentative de réponse, je pense que bcorso la réponse devrait être le seul. La relation est en fait basé sur le code, il a traduit de l'implémentation C++:
decision = decision_function(params, sv, nv, a, b, X); votes = [(i if decision[p] > 0 else j) for p,(i,j) in enumerate((i,j) for i in range(len(cs)) for j in range(i+1,len(cs)))]
. La majorité devotes
est essentiellement cepredict
n'.
Vous devez vous connecter pour publier un commentaire.
Je ne comprends pas tout ton code, mais nous allons à travers l'exemple de la page de documentation que vous l'avez mentionné:
Maintenant, nous allons appliquer à la fois la fonction de décision et de prédire les échantillons:
Le résultat que nous obtenons est:
Et qui est facile à interpréter: Les desion de la fonction nous indique de quel côté de la hyperplane généré par le classificateur nous sommes (et à quel point nous sommes loin de lui). Basé sur cette information, l'estimateur puis étiquetez les exemples avec l'étiquette correspondante.
SVC.decision_function
devient plus compliqué.Lorsque vous appelez
decision_function()
, vous obtenez la sortie de chacun des deux à deux classificateurs (n*(n-1)/2 numéros au total). Voir pages 127 et 128 de "Machines à Vecteurs de Support pour la Classification de Modèle".Chaque classificateur met dans un vote à ce que la bonne réponse est (basé sur le signe de la sortie de ce classificateur);
predict()
renvoie la classe avec le plus de votes.Pour ceux que cela intéresse, je posterai un exemple rapide de l'
predict
fonction traduit à partir de C++ (ici) pour python:Il y a beaucoup d'arguments en entrée pour
predict
etdecision_function
, mais note que ce sont tous utilisés à l'interne par le modèle lors de l'appel depredict(X)
. En fait, tous les arguments sont accessibles à l'intérieur du modèle après le montage:Il y a un vraiment sympa Q&A pour le multi-classe de un-contre-un scénario à la datascience.sx:
Question
Réponse
Ils ont probablement un peu compliqué relation mathématique. Mais si vous utilisez la
decision_function
dansLinearSVC
classificateur, la relation entre ces deux-là vont être plus clair! Car alorsdecision_function
vous donnera des scores pour chaque classe de l'étiquette (pas le même que SVC) et de prédire donnera la classe avec le meilleur score.