Wie interpretiert man SVM-Feature-Gewichte?


42

Ich versuche, die variablen Gewichte zu interpretieren, die durch Anpassen einer linearen SVM gegeben sind.

(Ich benutze Scikit-Learn ):

from sklearn import svm

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

svm.fit(features, labels)
svm.coef_

Ich kann in der Dokumentation nichts finden, was genau angibt, wie diese Gewichte berechnet oder interpretiert werden.

Hat das Vorzeichen des Gewichts etwas mit der Klasse zu tun?

Antworten:


55

Für einen allgemeinen Kernel ist es schwierig, die SVM-Gewichte zu interpretieren, aber für die lineare SVM gibt es tatsächlich eine nützliche Interpretation:

1) Denken Sie daran, dass das Ergebnis in linearer SVM eine Hyperebene ist, die die Klassen so gut wie möglich voneinander trennt. Die Gewichte stellen diese Hyperebene dar, indem Sie die Koordinaten eines Vektors angeben, der orthogonal zur Hyperebene ist - dies sind die durch svm.coef_ angegebenen Koeffizienten. Nennen wir diesen Vektor w.

2) Was können wir mit diesem Vektor machen? Die Richtung gibt uns die vorhergesagte Klasse an. Wenn Sie also das Skalarprodukt eines beliebigen Punkts mit dem Vektor nehmen, können Sie erkennen, auf welcher Seite es liegt: Wenn das Skalarprodukt positiv ist, gehört es zur positiven Klasse, wenn es negativ ist, gehört es zur negativen Klasse gehört zur negativen Klasse.

3) Schließlich können Sie noch etwas über die Wichtigkeit der einzelnen Funktionen lernen. Dies ist meine eigene Interpretation, also überzeuge dich selbst zuerst. Nehmen wir an, das SVM würde nur ein Merkmal zum Trennen der Daten finden, dann wäre die Hyperebene orthogonal zu dieser Achse. Man kann also sagen, dass die absolute Größe des Koeffizienten im Verhältnis zu den anderen einen Hinweis darauf gibt, wie wichtig das Merkmal für die Trennung war. Wenn zum Beispiel nur die erste Koordinate für die Trennung verwendet wird, hat w die Form (x, 0), wobei x eine Zahl ungleich Null ist und dann | x |> 0.


3
Punkt 3 ist die Basis für den RFE-Algorithmus unter Verwendung des Gewichtsvektors eines linearen SVM für die Merkmals- (Gen-) Auswahl: Siehe Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner

1
@B_Miner danke! Ich hatte die Befürchtung, dass es falsch sein könnte, da ich alleine darüber nachgedacht habe (ich komme nicht aus "reinem" CS) - aber ich denke, es ist richtig.
Bitweise

1
Was bedeutet die Richtung des orthogonalen Vektors, wenn er beide Klassen trennt? Hat dies etwas mit dem Beitrag der trennenden Hyperebene zur Gesamtwahrscheinlichkeit der Klassenvorhersage zu tun?
Austin Richardson

Es hängt von den Merkmalen ab, ob sich das Vorzeichen des Gewichts auf die Klasse bezieht (im linearen Fall). Wenn die Vorhersagefunktionen beispielsweise nur nicht negative ( ) Werte annehmen , tragen negative Gewichtungen zu einer negativen Klassifizierung von Datenpunkten bei. 0
Kdawg

@B_Miner, ich denke, Sie wollten eher auf dieses Papier als auf das andere von Guyon verlinken .
ijoseph

11

Die Dokumentation ist ziemlich vollständig: Für den Fall mit mehreren Klassen verwendet SVC, das auf der libsvm-Bibliothek basiert, die Einstellung Eins-gegen-Eins. Im Falle eines linearen Kernels n_classes * (n_classes - 1) / 2werden für jedes mögliche Klassenpaar einzelne lineare Binärmodelle angepasst. Daher ist die Gesamtform aller miteinander verketteten Primärparameter [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2Abschnitte im intercept_Attribut).

Für das binäre lineare Problem coef_wird in diesem Beispiel die Trennung der Hyperebene vom Attribut dargestellt .

Wenn Sie Einzelheiten zur Bedeutung der angepassten Parameter, insbesondere für den nichtlinearen Kernel-Fall, wünschen, schauen Sie sich die mathematische Formulierung und die in der Dokumentation genannten Referenzen an.


1
In der Dokumentation von Sklearn ist das Attribut coef_ shape = [n_class-1, n_features]. Ich glaube es ist ein Fehler.
Naomi

6

Ich versuche, die variablen Gewichte zu interpretieren, die durch Anpassen einer linearen SVM gegeben sind.

Ein guter Weg, um zu verstehen, wie die Gewichte berechnet werden und wie sie im Falle einer linearen SVM interpretiert werden, besteht darin, die Berechnungen von Hand an einem sehr einfachen Beispiel durchzuführen.

Beispiel

Betrachten Sie den folgenden Datensatz, der linear trennbar ist

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 einfach

Lösen des SVM-Problems durch Inspektion

Bei der Prüfung können wir sehen, dass die Grenzlinie, die die Punkte mit dem größten "Rand" trennt, die Linie . Da die Gewichte der SVM proportional zur Gleichung dieser Entscheidungsgeraden sind (Hyperebene in höheren Dimensionen), die eine erste Schätzung der Parameterx2=x13wTx+b=0

w=[1,1]  b=3

Die SVM-Theorie besagt, dass die "Breite" des Randes durch . Mit der obigen Annahme erhalten wir eine Breite von . was durch Inspektion falsch ist. Die Breite beträgt2||w||222=242

Denken Sie daran, dass das Skalieren der Grenze um einen Faktor von die Grenzlinie nicht ändert, daher können wir die Gleichung verallgemeinern alsc

cx1cx23c=0
w=[c,c]  b=3c

Stecken Sie sich wieder in die Gleichung für die Breite, die wir bekommen

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

Daher sind die Parameter (oder Koeffizienten) tatsächlich

w=[14,14]  b=34


(Ich benutze Scikit-Learn)

Hier ist ein Code, um unsere manuellen Berechnungen zu überprüfen

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 of support vectors = [2 3]
  • Stützvektoren = [[2. 3.] [6. -1.]]
  • Anzahl der Unterstützungsvektoren für jede Klasse = [1 1]
  • Koeffizienten des Trägervektors in der Entscheidungsfunktion = [[0.0625 0.0625]]

Hat das Vorzeichen des Gewichts etwas mit der Klasse zu tun?

Nicht wirklich, das Vorzeichen der Gewichte hat mit der Gleichung der Grenzfläche zu tun.

 

Quelle

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


5

Überprüfen Sie dieses Papier zur Funktionsauswahl . Die Autoren verwenden ein Gewichtungsquadrat (von Attributen), wie es von einer linearen Kernel-SVM zugewiesen wurde, als Rangmetrik für die Entscheidung über die Relevanz eines bestimmten Attributs. Dies ist eine der am häufigsten genannten Methoden zur Auswahl von Genen aus Microarray-Daten.


3

Eine großartige Arbeit von Guyon und Elisseeff (2003). Eine Einführung in die Variablen- und Featureauswahl. Das Journal of Machine Learning Research, 1157-1182, schreibt: "Die Konstruktion und Auswahl von Teilmengen von Merkmalen, die zur Erstellung eines guten Prädiktors nützlich sind, steht im Gegensatz zum Problem, alle potenziell relevanten Variablen zu finden oder zu klassifizieren. Die Auswahl der relevantesten Variablen ist für die Erstellung von a in der Regel suboptimal Prädiktor, insbesondere wenn die Variablen redundant sind. Umgekehrt kann eine Teilmenge nützlicher Variablen viele redundante, aber relevante Variablen ausschließen. "

Daher empfehle ich Vorsicht bei der Interpretation der Gewichte von linearen Modellen im Allgemeinen (einschließlich logistischer Regression, linearer Regression und linearer Kernel-SVM). Die SVM-Gewichte könnten dies kompensieren, wenn die Eingabedaten nicht normalisiert würden. Die SVM-Gewichtung für ein bestimmtes Merkmal hängt auch von den anderen Merkmalen ab, insbesondere wenn die Merkmale korreliert sind. Um die Wichtigkeit einzelner Features zu bestimmen, sind Feature-Ranking-Methoden die bessere Wahl.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.