Comment interpréter les poids des entités SVM?


42

J'essaie d'interpréter les poids variables donnés en ajustant un SVM linéaire.

(J'utilise scikit-learn ):

from sklearn import svm

svm = svm.SVC(kernel='linear')

svm.fit(features, labels)
svm.coef_

Je ne trouve rien dans la documentation qui indique spécifiquement comment ces poids sont calculés ou interprétés.

Le signe du poids a-t-il quelque chose à voir avec la classe?

Réponses:


55

Pour un noyau général, il est difficile d'interpréter les poids du SVM, mais il existe une interprétation utile pour le SVM linéaire:

1) Rappelons que dans SVM linéaire, le résultat est un hyperplan qui sépare le mieux possible les classes. Les poids représentent cet hyperplan, en vous donnant les coordonnées d'un vecteur orthogonal à l'hyperplan - ce sont les coefficients donnés par svm.coef_. Appelons ce vecteur w.

2) Que pouvons-nous faire avec ce vecteur? Sa direction nous donne la classe prédite, donc si vous prenez le produit scalaire d'un point quelconque avec le vecteur, vous pouvez dire de quel côté il est: si le produit scalaire est positif, il appartient à la classe positive, s'il est négatif appartient à la classe négative.

3) Enfin, vous pouvez même apprendre quelque chose sur l’importance de chaque fonctionnalité. C’est ma propre interprétation, alors persuadez-vous d’abord. Supposons que svm ne trouve qu'une seule fonctionnalité utile pour séparer les données, puis que l'hyperplan est orthogonal à cet axe. On pourrait donc dire que la taille absolue du coefficient par rapport aux autres donne une indication de l’importance de la caractéristique pour la séparation. Par exemple, si seule la première coordonnée est utilisée pour la séparation, w sera de la forme (x, 0) où x est un nombre non nul et ensuite | x |> 0.


3
Le point 3 constitue la base de l'algorithme RFE utilisant le vecteur de pondération d'un SVM linéaire pour la sélection de caractéristiques (gènes): voir Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner

1
@ B_Miner merci! J'avais peur que, puisque j'y pensais tout seul, cela puisse être erroné (je ne suis pas de "pur" CS) - mais je suppose que c'est correct.
Bitwise

1
Quelle est la signification de la direction du vecteur orthogonal s’il sépare les deux classes? Cela a-t-il quelque chose à voir avec la contribution de l'hyperplan séparateur à la probabilité globale de prédiction de classe?
Austin Richardson

Préciser si le signe du poids se rapporte à la classe (dans le cas linéaire) - cela dépend des caractéristiques. Par exemple, si les caractéristiques prédictives prennent uniquement des valeurs non négatives ( ), les pondérations négatives contribuent à une classification négative des points de données. 0
Kdawg

@B_Miner, je pense que vous vouliez créer un lien vers ce document plutôt que vers l'autre de Guyon.
ijoseph

11

La documentation est assez complète: pour le cas multiclass, SVC qui est basé sur la bibliothèque libsvm utilise le paramètre one-vs-one. Dans le cas d'un noyau linéaire, n_classes * (n_classes - 1) / 2des modèles binaires linéaires individuels sont adaptés pour chaque paire de classes possible. Par conséquent, la forme globale de tous les paramètres primaux concaténés est la suivante [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2intercepts dans l' intercept_attribut).

Pour le problème linéaire binaire, le tracé de l'hyperplan de séparation de l' coef_attribut est effectué dans cet exemple .

Si vous souhaitez obtenir des détails sur la signification des paramètres ajustés, en particulier pour le cas du noyau non linéaire, consultez la formulation mathématique et les références mentionnées dans la documentation.


1
Dans la documentation de Sklearn, l'attribut coef_ est de forme = [n_class-1, n_features]. Je crois que c'est une erreur.
Naomi

6

J'essaie d'interpréter les poids variables donnés en ajustant un SVM linéaire.

Un bon moyen de comprendre comment les poids sont calculés et comment les interpréter dans le cas d'un SVM linéaire consiste à effectuer les calculs à la main sur un exemple très simple.

Exemple

Considérez le jeu de données suivant qui est séparable linéairement

import numpy as np
X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])

SVM simple

Résoudre le problème SVM par inspection

X2=X1-3wTX+b=0

w=[1,-1]  b=-3

2||w||22=242

c

cX1-cX2-3c=0
w=[c,-c]  b=-3c

Rebrancher dans l'équation pour la largeur que nous obtenons

2||w||=4222c=42c=14

w=[14,-14]  b=-34


(J'utilise scikit-learn)

Moi aussi, voici du code pour vérifier nos calculs manuels

from sklearn.svm import SVC
clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y) 
print('w = ',clf.coef_)
print('b = ',clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
  • w = [[0.25 -0.25]] b = [-0.75]
  • Indices de vecteurs de support = [2 3]
  • Vecteurs de support = [[2. 3.] [6. -1.]]
  • Nombre de vecteurs de support pour chaque classe = [1 1]
  • Coefficients du vecteur support dans la fonction de décision = [[0.0625 0.0625]]

Le signe du poids a-t-il quelque chose à voir avec la classe?

Pas vraiment, le signe des poids a à voir avec l'équation du plan frontière.

 

La source

https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf


5

Vérifiez ce papier sur la sélection des fonctionnalités . Les auteurs utilisent des carrés de poids (d'attributs) attribués par une SVM à noyau linéaire comme métrique de classement pour décider de la pertinence d'un attribut particulier. C’est l’un des moyens les plus cités de sélectionner des gènes à partir de données de puces à ADN.


3

Un excellent article de Guyon et Elisseeff (2003). Une introduction à la sélection de variables et de fonctionnalités. Journal of machine learning research, 1157-1182, déclare: "La construction et la sélection de sous-ensembles de fonctionnalités utiles pour créer un bon prédicteur contraste avec le problème de recherche ou de classement de toutes les variables potentiellement pertinentes. La sélection des variables les plus pertinentes est généralement sous-optimale pour la facteur prédictif, en particulier si les variables sont redondantes. À l’inverse, un sous-ensemble de variables utiles peut exclure de nombreuses variables redondantes mais néanmoins pertinentes. "

Par conséquent, je recommande de faire preuve de prudence lors de l'interprétation des poids des modèles linéaires en général (y compris la régression logistique, la régression linéaire et la SVM à noyau linéaire). Les poids SVM peuvent compenser si les données d'entrée n'ont pas été normalisées. Le poids du SVM pour une fonctionnalité spécifique dépend également des autres fonctionnalités, en particulier si les fonctionnalités sont corrélées. Pour déterminer l'importance des fonctionnalités individuelles, les méthodes de classement des fonctionnalités constituent un meilleur choix.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.