Come si interpretano i pesi delle funzioni SVM?


42

Sto cercando di interpretare i pesi variabili dati montando un SVM lineare.

(Sto usando Scikit-Learn ):

from sklearn import svm

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

svm.fit(features, labels)
svm.coef_

Non riesco a trovare nulla nella documentazione che specifichi specificamente come questi pesi vengono calcolati o interpretati.

Il segno del peso ha qualcosa a che fare con la classe?

Risposte:


55

Per un kernel generale è difficile interpretare i pesi SVM, tuttavia per SVM lineare esiste in realtà un'interpretazione utile:

1) Ricordiamo che in SVM lineare, il risultato è un iperpiano che separa le classi nel miglior modo possibile. I pesi rappresentano questo iperpiano, dandoti le coordinate di un vettore che è ortogonale all'iperpiano - questi sono i coefficienti dati da svm.coef_. Chiamiamo questo vettore w.

2) Cosa possiamo fare con questo vettore? La sua direzione ci dà la classe prevista, quindi se prendi il prodotto punto di qualsiasi punto con il vettore, puoi dire da che parte è: se il prodotto punto è positivo, appartiene alla classe positiva, se è negativo esso appartiene alla classe negativa.

3) Infine, puoi persino imparare qualcosa sull'importanza di ogni funzione. Questa è la mia interpretazione, quindi convinciti prima. Diciamo che svm troverebbe utile solo una funzione per separare i dati, quindi l'iperpiano sarebbe ortogonale a quell'asse. Quindi, si potrebbe dire che la dimensione assoluta del coefficiente rispetto agli altri fornisce un'indicazione dell'importanza della funzione per la separazione. Ad esempio, se per la separazione viene utilizzata solo la prima coordinata, w sarà della forma (x, 0) dove x è un numero diverso da zero e quindi | x |> 0.


3
Il punto 3 è la base dell'algoritmo RFE che utilizza il vettore di peso di un SVM lineare per la selezione della funzione (gene): vedi Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner

1
@B_Miner grazie! Ero preoccupato che da quando ho pensato a questo per conto mio potrebbe essere sbagliato (non provengo da un CS "puro") - ma immagino che sia corretto.
Bitwise,

1
Qual è il significato della direzione del vettore ortogonale se sta separando entrambe le classi? Ha qualcosa a che fare con il contributo dell'iperpiano di separazione alla probabilità complessiva di previsione della classe?
Austin Richardson,

Per capire se il segno del peso si riferisce alla classe (nel caso lineare) - dipende dalle caratteristiche. Ad esempio, se le funzioni predittive assumono solo valori non negativi ( ), i pesi negativi contribuiscono a una classificazione negativa dei punti dati. 0
Kdawg,

@B_Miner, penso che intendessi collegarti a questo documento piuttosto che all'altro di Guyon.
ijoseph,

11

La documentazione è piuttosto completa: per il caso multiclasse, SVC che si basa sulla libreria libsvm utilizza l'impostazione uno contro uno. Nel caso di un kernel n_classes * (n_classes - 1) / 2lineare, vengono montati singoli modelli binari lineari per ogni possibile coppia di classi. Quindi la forma aggregata di tutti i parametri primari concatenati insieme è [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2intercetta intercept_nell'attributo).

Per il problema lineare binario, coef_in questo esempio viene eseguita la stampa dell'iperpiano di separazione dall'attributo .

Se vuoi i dettagli sul significato dei parametri adattati, specialmente per il caso del kernel non lineare, dai un'occhiata alla formulazione matematica e ai riferimenti menzionati nella documentazione.


1
Nella documentazione di Sklearn, l'attributo coef_ è di forma = [n_class-1, n_features]. Credo sia un errore.
Naomi

6

Sto cercando di interpretare i pesi variabili dati montando un SVM lineare.

Un buon modo per capire come vengono calcolati i pesi e come interpretarli nel caso di SVM lineare è eseguire i calcoli a mano su un esempio molto semplice.

Esempio

Si consideri il seguente set di dati che è separabile linearmente

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 semplice

Risolvere il problema SVM mediante ispezione

X2=X1-3wTX+B=0

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

2||w||22=242

c

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

Ricollegando l'equazione per la larghezza che otteniamo

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

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


(Sto usando Scikit-Learn)

Anche io, ecco un po 'di codice per controllare i nostri calcoli manuali

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]
  • Indici dei vettori di supporto = [2 3]
  • Supporto vettori = [[2. 3.] [6. -1.]]
  • Numero di vettori di supporto per ogni classe = [1 1]
  • Coefficienti del vettore di supporto nella funzione decisionale = [[0.0625 0.0625]]

Il segno del peso ha qualcosa a che fare con la classe?

Non proprio, il segno dei pesi ha a che fare con l'equazione del piano perimetrale.

 

fonte

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


5

Controlla questo documento sulla selezione delle funzioni . Gli autori usano il quadrato dei pesi (degli attributi) assegnato da un kernel lineare SVM come metrica di classificazione per decidere la pertinenza di un particolare attributo. Questo è uno dei modi più citati per selezionare i geni dai dati di microarray.


3

Un grande articolo di Guyon ed Elisseeff (2003). Un'introduzione alla selezione di variabili e funzionalità. Diario della ricerca sull'apprendimento automatico, 1157-1182 afferma: "La costruzione e la selezione di sottoinsiemi di funzioni utili per costruire un buon predittore contrasta con il problema di trovare o classificare tutte le variabili potenzialmente rilevanti. La selezione delle variabili più rilevanti di solito non è ottimale per la costruzione di un predittore, in particolare se le variabili sono ridondanti. Al contrario, un sottoinsieme di variabili utili può escludere molte variabili ridondanti, ma pertinenti. "

Pertanto raccomando cautela nell'interpretazione dei pesi dei modelli lineari in generale (compresa la regressione logistica, regressione lineare e SVM del kernel lineare). I pesi SVM potrebbero compensare se i dati di input non sono stati normalizzati. Il peso SVM per una funzionalità specifica dipende anche dalle altre funzionalità, soprattutto se le funzionalità sono correlate. Per determinare l'importanza delle singole funzionalità, i metodi di classificazione delle funzionalità sono una scelta migliore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.