Jak interpretować wagi funkcji SVM?


42

Próbuję zinterpretować zmienne wagi podane przez dopasowanie liniowego SVM.

(Używam scikit-learn ):

from sklearn import svm

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

svm.fit(features, labels)
svm.coef_

Nie mogę znaleźć w dokumentacji niczego, co wyraźnie określa sposób obliczania lub interpretowania tych wag.

Czy znak wagi ma coś wspólnego z klasą?

Odpowiedzi:


55

W przypadku ogólnego jądra trudno jest zinterpretować wagi SVM, jednak w przypadku liniowego SVM istnieje przydatna interpretacja:

1) Przypomnij sobie, że w liniowej SVM wynikiem jest hiperpłaszczyzna, która najlepiej oddziela klasy. Wagi reprezentują tę hiperpłaszczyznę, podając współrzędne wektora prostopadłego do hiperpłaszczyzny - są to współczynniki podane przez svm.coef_. Nazwijmy ten wektor w.

2) Co możemy zrobić z tym wektorem? Jego kierunek daje nam przewidywaną klasę, więc jeśli weźmiesz iloczyn punktowy dowolnego punktu z wektorem, możesz powiedzieć, po której stronie jest: jeśli iloczyn iloczynu jest dodatni, należy do klasy dodatniej, jeśli jest ujemny należy do klasy negatywnej.

3) Na koniec możesz nawet dowiedzieć się czegoś o znaczeniu każdej funkcji. To moja interpretacja, więc najpierw przekonaj się. Powiedzmy, że svm znalazłby tylko jedną cechę przydatną do rozdzielenia danych, a wówczas hiperpłaszczyzna byłaby prostopadła do tej osi. Można więc powiedzieć, że bezwzględna wielkość współczynnika w stosunku do pozostałych daje wskazanie, jak ważna była ta cecha dla separacji. Na przykład, jeśli do rozdzielenia zostanie użyta tylko pierwsza współrzędna, w będzie miało postać (x, 0), gdzie x jest liczbą niezerową, a następnie | x |> 0.


3
Punkt 3 jest podstawą algorytmu RFE wykorzystującego wektor masy liniowej SVM do wyboru cech (genów): Patrz Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner

1
@B_Miner dzięki! Martwiłem się, że skoro sam o tym pomyślałem, to może być źle (nie jestem z „czystego” CS) - ale myślę, że to prawda.
Bitowy

1
Jakie jest znaczenie kierunku wektora ortogonalnego, jeśli oddziela on obie klasy? Czy ma to coś wspólnego z udziałem hiperpłaszczyzny oddzielającej w ogólnym prawdopodobieństwie przewidywania klas?
Austin Richardson

Aby wyjaśnić, czy znak wagi odnosi się do klasy (w przypadku liniowym) - zależy od cech. Na przykład, jeśli funkcje predykcyjne przyjmują tylko wartości nieujemne ( ), wówczas ujemne wagi przyczyniają się do ujemnej klasyfikacji punktów danych. 0
Kdawg

@B_Miner, myślę, że miałeś na myśli link do tego artykułu, a nie innego autorstwa Guyona.
ijoseph

11

Dokumentacja jest całkiem kompletny: dla multiclass przypadku SVC, który jest oparty na bibliotece libsvm wykorzystuje ustawienie jednego vs jeden. W przypadku jądra liniowego n_classes * (n_classes - 1) / 2indywidualne liniowe modele binarne są dopasowywane dla każdej możliwej pary klas. Zatem łączny kształt wszystkich podstawowych parametrów połączonych razem to [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2przechwytuje w intercept_atrybucie).

W przypadku binarnego problemu liniowego wykreślanie oddzielającej hiperpłaszczyzny od coef_atrybutu odbywa się w tym przykładzie .

Jeśli chcesz uzyskać szczegółowe informacje na temat znaczenia dopasowanych parametrów, szczególnie w przypadku nieliniowego przypadku jądra, zajrzyj do sformułowania matematycznego i odniesień wymienionych w dokumentacji.


1
W dokumentacji Sklearn atrybut coef_ ma kształt = [n_klasa-1, n_funkcje]. Uważam, że to pomyłka.
Naomi

6

Próbuję zinterpretować zmienne wagi podane przez dopasowanie liniowego SVM.

Dobrym sposobem na zrozumienie, w jaki sposób obliczane są wagi i jak je interpretować w przypadku liniowej SVM, jest wykonanie obliczeń ręcznie na bardzo prostym przykładzie.

Przykład

Rozważ następujący zestaw danych, który można liniowo oddzielić

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 prosty

Rozwiązanie problemu SVM przez inspekcję

Po inspekcji możemy zobaczyć, że linią graniczną oddzielającą punkty o największym „marginesie” jest linia . Ponieważ wagi SVM są proporcjonalne do równania tej linii decyzyjnej (hiperpłaszczyzna w wyższych wymiarach) przy użyciu pierwsze przypuszczenie parametrów byłobyx2=x13wTx+b=0

w=[1,1]  b=3

Teoria SVM mówi nam, że „szerokość” marginesu jest wyrażona przez . Stosując powyższą przypuszczenie chcemy uzyskać szerokość o . co przez kontrolę jest nieprawidłowe. Szerokość wynosi2||w||22=242

Przypomnijmy, że skalowanie granicy przez współczynnik nie zmienia linii granicznej, dlatego możemy uogólnić równanie jakoc

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

Wracając do równania dla szerokości, którą otrzymujemy

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

Zatem parametry (lub współczynniki) są w rzeczywistości

w=[14,14]  b=34


(Używam scikit-learn)

Oto ja, oto kod do sprawdzenia naszych ręcznych obliczeń

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]
  • Wskaźniki wektorów wsparcia = [2 3]
  • Wektory wsparcia = [[2. 3.] [6. -1.]]
  • Liczba wektorów pomocniczych dla każdej klasy = [1 1]
  • Współczynniki wektora podporowego w funkcji decyzyjnej = [[0,0625 0,0625]]

Czy znak wagi ma coś wspólnego z klasą?

Nie bardzo, znak wag ma związek z równaniem płaszczyzny granicznej.

 

Źródło

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


5

Sprawdź ten artykuł na temat wyboru funkcji . Autorzy używają kwadratu wag (atrybutów) przypisanego przez liniowy SVM jądra jako metryki rankingowej przy podejmowaniu decyzji o przydatności konkretnego atrybutu. Jest to jeden z najczęściej cytowanych sposobów wyboru genów z danych mikromacierzy.


3

Świetny artykuł Guyona i Elisseeff (2003). Wprowadzenie do wyboru zmiennych i funkcji. Journal of machine learning research, 1157-1182 mówi: „Konstruowanie i wybieranie podzbiorów funkcji przydatnych do budowy dobrego predyktora kontrastuje z problemem znalezienia lub uszeregowania wszystkich potencjalnie istotnych zmiennych. Wybór najbardziej odpowiednich zmiennych jest zwykle nieoptymalny do zbudowania predyktor, szczególnie jeśli zmienne są redundantne. Odwrotnie, podzbiór użytecznych zmiennych może wykluczać wiele redundantnych, ale istotnych zmiennych. "

Dlatego zalecam ostrożność przy interpretacji wag modeli liniowych w ogóle (w tym regresji logistycznej, regresji liniowej i SVM jądra liniowego). Wagi SVM mogą kompensować, jeśli dane wejściowe nie zostaną znormalizowane. Waga SVM dla określonej operacji zależy również od innych operacji, zwłaszcza jeśli są one skorelowane. Aby określić znaczenie poszczególnych funkcji, lepszym wyborem są metody rankingu cech.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.