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.
@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.
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])
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=x1−3wTx+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√=2–√42–√
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
cx1−cx2−3c=0
w=[c,−c]b=−3c
Conectando novamente na equação para a largura que obtemos
2||w||22–√cc=14=42–√=42–√
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.
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.
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.
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) / 2
modelos 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) / 2
intercepta nointercept_
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.
fonte
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
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=x1−3 wTx+b=0
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√=2–√ 42–√
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
Conectando novamente na equação para a largura que obtemos
Portanto, os parâmetros (ou coeficientes) são de fatow=[14,−14] b=−34
Eu também, aqui estão alguns códigos para verificar nossos cálculos manuais
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
fonte
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.
fonte
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.
fonte