3 votos

¿Cómo construir el vector de pesos de características (o límite de decisión) de un clasificador SVM lineal con scikit?

Utilizo el siguiente código para entrenar un clasificador SVM:

clf = svm.SVC(kernel='linear')
clf.fit(train_mat, train_labels)

Se ajusta a los datos y guarda la información en el clf objeto. Ahora sé que teóricamente el w El vector se construye con la fórmula Es una suma de todos los vectores de soporte multiplicados por sus etiquetas y los valores alfa correspondientes. El problema es que no puedo encontrar esta información en clf . Tengo un _coef atributo pero no estoy seguro de que sea lo que busco.

La documentación en scikit es simplemente escasa. No he podido encontrar la información allí. ¿Alguien sabe cómo hacerlo? Necesito la w vector para comprobar las ponderaciones dadas a cada una de las características y ver cuáles son las más valiosas.

7voto

lennon310 Puntos 1882

En su clf ,

coef_ son los pesos asignados a las características; (Nota: sólo funciona para SVM lineal)

support_vectors_ y support_ son los vectores de apoyo y el índice correspondiente;

dual_coef_ son los coeficientes del vector de apoyo en la función de decisión; y

intercept_ es el sesgo de la función de decisión.

En la SVM lineal, $w^Tx+b=0$ es el límite de decisión, y $w$ son los coeficientes de los vectores de apoyo, $b$ es el sesgo, todo ello definido anteriormente.

La referencia del documento: http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html


En el caso de una SVM RBF, el espacio de datos original se transforma en otro espacio de alta dimensión. Así que los coeficientes de los pesos no están directamente relacionados con el espacio de entrada. Creo que por eso coef_ no pueden ser vistos como los pesos en su espacio de entrada original. Por cierto, no estoy seguro de si coef_ es el peso en la característica del espacio transformado, supongo que no lo es, ya que el espacio RBF es en realidad de dimensión infinita.

Le sugiero que preprocese los datos antes de la implementación de la SVM, ya que ésta se ve muy influenciada por las variantes de la escala de características.

  1. Normalización estándar de los datos;

  2. Decoración sigma^(-1/2)*X donde sigma = cov(X) .


Sin embargo, es posible que tenga que hacer algunos cálculos por sí mismo para obtener la función de decisión.

  1. Calcular el vector de características v de su punto de datos bajo prueba. La longitud de v se supone que es la misma que las filas de support_vectors_.

  2. Para cada fila i en support_vectors_, calcular la distancia euclidiana d[i] = numpy.linalg.norm(support_vectors_[i,] - v) .

  3. t[i] = exp{-gamma *d[i].^2} donde gamma es el parámetro RBF.

  4. Resumir dual_coef_[i] * t[i] sobre todo i , entonces más intercept_ . Esta será la función de decisión.

1voto

Yuan Gao Puntos 387
from sklearn import datasets
from sklearn import svm
import numpy as np

data = datasets.load_digits(n_class=2)
clf = svm.SVC(kernel="linear")
clf = clf.fit(data.data,data.target)
print(np.matmul(clf.dual_coef_,clf.support_vectors_)) 
print(clf.intercept_)

Esto debería imprimir un array numpy con sus pesos y b.

Puede comprobarlo a través de la variable coef_ que sólo está disponible en el núcleo lineal:

print(clf.coef_)

Esto debería imprimir los pesos idénticos dos veces.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X