La salida de Scikit SVM en clasificación multiclase siempre da la misma etiqueta

10

Actualmente estoy usando Scikit learn con el siguiente código:

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

y luego ajusta y predice un conjunto de datos con 7 etiquetas diferentes. Tengo una salida extraña. No importa qué técnica de validación cruzada use, la etiqueta predicha en el conjunto de validación siempre será la etiqueta 7.

Intento algunos otros parámetros, incluido el predeterminado completo ( svm.SVC()), pero siempre que el método del núcleo que utilizo sea en rbflugar de polyo linearsimplemente no funcione, mientras que funciona realmente bien para polyy linear.

Además, ya he intentado la predicción en los datos del tren en lugar de los datos de validación y encaja perfectamente.

¿Alguien ve este tipo de problema antes y sabe lo que está pasando aquí?

Nunca miro la distribución de mi clase en detalle, pero sé que debería ser alrededor del 30% de ellos son 7, 14% son 4.

Incluso pruebo una implementación manual 1-vs-rest y todavía no es útil.

Tamaki Sakura
fuente
¿Cuáles son las proporciones de sus datos que se incluyen en cada una de las clases?
gung - Restablece a Monica
De hecho, hay más "7" en mis datos, pero no tanto. Alrededor del 30% de ellos son 7. @gung
Tamaki Sakura

Respuestas:

10

Una causa probable es el hecho de que no está ajustando su modelo. Necesita encontrar buenos valores para y . En su caso, los valores predeterminados resultan ser malos, lo que lleva a modelos triviales que siempre producen cierta clase. Esto es particularmente común si una clase tiene muchas más instancias que las otras. ¿Cuál es su distribución de clase?γCγ

scikit-learn tiene capacidades limitadas de búsqueda de hiperparámetros, pero puede usarlo junto con una biblioteca de ajuste como Optunity . Un ejemplo acerca de cómo ajustar scikit-learn SVC con Optunity está disponible aquí .

Descargo de responsabilidad: soy el desarrollador principal de Optunity.

Marc Claesen
fuente
De hecho, he probado de forma manual todas las combinaciones de C y gamma que tienen una potencia de 10 de 0 a 4, pero todas me dan un total de 7. Incluso he comenzado a dudar si compilo el scikit learn de la manera correcta.
Tamaki Sakura
8

El problema resulta ser la prueba de parámetros. No lo intenté cuando gammaestá entre 0.0 (que es 1 / n_feature) y 1. En mis datos gammadebería cambiar a algo1e-8

Tamaki Sakura
fuente
44
γ