Como interpretar pesos de recurso SVM?

42

Eu estou tentando interpretar os pesos variáveis ​​dados ajustando um SVM linear.

(Estou usando o scikit-learn ):

from sklearn import svm

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

svm.fit(features, labels)
svm.coef_

Não consigo encontrar nada na documentação que indique especificamente como esses pesos são calculados ou interpretados.

O sinal do peso tem algo a ver com a classe?

Austin Richardson
fonte

Respostas:

55

Para um kernel geral, é difícil interpretar os pesos do SVM, no entanto, para o SVM linear, na verdade há uma interpretação útil:

1) Lembre-se de que no SVM linear, o resultado é um hiperplano que separa as classes da melhor forma possível. Os pesos representam esse hiperplano, fornecendo as coordenadas de um vetor ortogonal ao hiperplano - esses são os coeficientes fornecidos por svm.coef_. Vamos chamar esse vetor de w.

2) O que podemos fazer com esse vetor? Sua direção nos dá a classe prevista; portanto, se você pegar o produto escalar de qualquer ponto com o vetor, poderá dizer de que lado ele está: se o produto escalar for positivo, pertence à classe positiva; se for negativo, será pertence à classe negativa.

3) Finalmente, você pode até aprender algo sobre a importância de cada recurso. Esta é a minha própria interpretação, então convença-se primeiro. Digamos que o svm encontraria apenas um recurso útil para separar os dados, então o hiperplano seria ortogonal a esse eixo. Portanto, você poderia dizer que o tamanho absoluto do coeficiente em relação aos outros fornece uma indicação de quão importante o recurso foi para a separação. Por exemplo, se apenas a primeira coordenada for usada para separação, w será da forma (x, 0) em que x é um número diferente de zero e, em seguida, | x |> 0.

Bit a bit
fonte
3
O ponto 3 é a base para o algoritmo RFE usando o vetor de peso de um SVM linear para seleção de recurso (gene): Veja Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner
11
@B_Miner thanks! Eu estava preocupado que, uma vez que pensei nisso sozinho, poderia estar errado (não sou do CS "puro") - mas acho que está correto.
Bitwise
11
Qual é o significado da direção do vetor ortogonal se ele estiver separando as duas classes? Tem algo a ver com a contribuição do hiperplano separador para a probabilidade geral de previsão de classe?
Austin Richardson
Para elaborar se o sinal do peso está relacionado à classe (no caso linear) - depende dos recursos. Por exemplo, se os recursos preditivos tiverem apenas valores não negativos ( ), os pesos negativos contribuirão para uma classificação negativa dos pontos de dados. 0
precisa saber é
@B_Miner, acho que você pretendia criar um link para este artigo em vez do outro de Guyon.
ijoseph
11

A documentação é bastante completa: para o caso de várias classes, o SVC, que é baseado na biblioteca libsvm, usa a configuração um contra um. No caso de um núcleo linear, n_classes * (n_classes - 1) / 2modelos binários lineares individuais são ajustados para cada par de classes possível. Portanto, a forma agregada de todos os parâmetros primários concatenados juntos é [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2intercepta no intercept_atributo).

Para o problema linear binário, a plotagem do hiperplano de separação do coef_atributo é feita neste exemplo .

Se você deseja obter detalhes sobre o significado dos parâmetros ajustados, especialmente para o caso do kernel não linear, consulte a formulação matemática e as referências mencionadas na documentação.

ogrisel
fonte
11
Na documentação do Sklearn, o atributo coef_ tem a forma = [n_class-1, n_features]. Eu acredito que é um erro.
Naomi
6

Eu estou tentando interpretar os pesos variáveis ​​dados ajustando um SVM linear.

Uma boa maneira de entender como os pesos são calculados e como interpretá-los no caso de SVM linear é executar os cálculos manualmente em um exemplo muito simples.

Exemplo

Considere o seguinte conjunto de dados que é separável 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 simples

Resolvendo o problema SVM por inspeção

Por inspeção, podemos ver que a linha de fronteira que separa os pontos com a maior "margem" é a linha . Como os pesos do SVM são proporcionais à equação desta linha de decisão (hiperplano em dimensões mais altas) usando uma primeira estimativa dos parâmetros seriax2=x13wTx+b=0

w=[1,1]  b=3

A teoria SVM nos diz que a "largura" da margem é dada por . Usando o palpite acima, obteríamos uma largura de . que, por inspeção, está incorreto. A largura é de2||w||22=242

Lembre-se de que escalar o limite por um fator de não altera a linha do limite; portanto, podemos generalizar a equação comoc

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

Conectando novamente na equação para a largura que obtemos

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

Portanto, os parâmetros (ou coeficientes) são de fato

w=[14,14]  b=34


(Estou usando o scikit-learn)

Eu também, aqui estão alguns códigos para verificar nossos cálculos manuais

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]
  • Índices de vetores de suporte = [2 3]
  • Vetores de suporte = [[2. 3.] [6. -1.]]
  • Número de vetores de suporte para cada classe = [1 1]
  • Coeficientes do vetor de suporte na função de decisão = [[0,0625 0,0625]]

O sinal do peso tem algo a ver com a classe?

Na verdade, o sinal dos pesos tem a ver com a equação do plano de fronteira.

 

Fonte

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

Xavier Bourret Sicotte
fonte
5

Verifique este documento na seleção de recursos . Os autores usam o quadrado de pesos (de atributos) atribuído por um SVM linear do kernel como métrica de classificação para decidir a relevância de um atributo específico. Essa é uma das maneiras mais citadas de selecionar genes a partir de dados de microarranjos.

abhinna11
fonte
3

Um ótimo artigo de Guyon e Elisseeff (2003). Uma introdução à seleção de variáveis ​​e recursos. O Journal of Machine Learning Research, 1157-1182 diz: "A construção e seleção de subconjuntos de recursos úteis para criar um bom preditor contrasta com o problema de encontrar ou classificar todas as variáveis ​​potencialmente relevantes. A seleção das variáveis ​​mais relevantes geralmente é subótima para a construção de um preditor. preditor, principalmente se as variáveis ​​forem redundantes. Por outro lado, um subconjunto de variáveis ​​úteis pode excluir muitas variáveis ​​redundantes, mas relevantes. "

Portanto, recomendo cautela ao interpretar pesos de modelos lineares em geral (incluindo regressão logística, regressão linear e SVM linear do kernel). Os pesos do SVM podem compensar se os dados de entrada não forem normalizados. O peso do SVM para um recurso específico depende também dos outros recursos, especialmente se os recursos estiverem correlacionados. Para determinar a importância dos recursos individuais, os métodos de classificação de recursos são uma escolha melhor.

petra
fonte