13

Nominalmente es un buen problema, pero estoy bastante seguro de que es algo gracioso que está pasando ...Ayuda - 100% de precisión con LibSVM?

Como contexto, estoy trabajando en un problema en el espacio de expresión/reconocimiento facial, por lo que El 100% de precisión parece increíblemente inverosímil (aunque no es plausible en la mayoría de las aplicaciones ...). Supongo que hay un sesgo constante en el conjunto de datos que hace que sea demasiado fácil para un SVM extraer la respuesta, = o =, más probablemente, he hecho algo mal en el lado de SVM.

Estoy buscando sugerencias para ayudar a entender lo que está sucediendo - ¿es yo (= mi uso de LibSVM)? ¿O son los datos?

Los detalles:

  • Acerca de ~ 2500 marcado vectores de datos/instancias (fotogramas de vídeo transformadas de individuos-- < 20 personas individuales en total), problema de clasificación binaria. ~ 900 características/instancia. Conjunto de datos desequilibrado en una proporción de 1: 4.
  • Ran subset.py para separar los datos en prueba (500 instancias) y en tren (restante).
  • Ran "svm-train -t 0". (Nota: aparentemente no es necesario '-w1 1 -w-1 4' ...)
  • Ejecutar svm-predict en el archivo de prueba. Exactitud = 100%!

Cosas trataron:

  • A cuadros alrededor de 10 veces más que yo no estoy entrenando & las pruebas en los mismos archivos de datos, a través de algunos de línea de comandos de error involuntario argumento
  • re-ran subconjunto. py (incluso con -s 1) varias veces y entrenó/probar solo múltiples conjuntos de datos diferentes (en caso de que aleatoriamente en el tren/prueba más mágico pa
  • ejecuté un simple cheque de tipo diff para confirmar que el archivo de prueba está no es un subconjunto de los datos de entrenamiento
  • svm-scale en los datos no tiene efecto en la precisión (precisión = 100%). (Aunque el número de vectores de soporte cae desde nSV = 127, bSV = 64 a nBSV = 72, bSV = 0)
  • ((raro)) utilizando el kernel RBF predeterminado (vice lineal - es decir, eliminando '- t 0 ') resultados en la precisión que va a la basura (?!)
  • (comprobación de cordura) ejecutar svm-predict utilizando un modelo entrenado en un conjunto de datos escalado contra un conjunto de datos sin escala resultados en la precisión = 80% (es decir, siempre adivina la clase dominante). Esto es estrictamente un control de cordura para asegurarse de que de alguna manera svm-predict esté actuando nominalmente en mi máquina.

conclusión provisional ?:

algo con los datos es wacked - de alguna manera, dentro del conjunto de datos, hay un efecto sutil, experimentador impulsada por la SVM que está recogiendo sucesivamente.

(Esto no significa, en la primera pasada, a explicar por qué el kernel RBF da resultados de basura, sin embargo.)

agradecería mucho cualquier sugerencia sobre: ​​a) cómo solucionar mi uso de LibSVM (si es que en realidad es el problema) o b) determinar qué sesgo sutil del experimentador en los datos LibSVM está tomando impulso.

+0

Mmmm, datos y análisis del modelo en condiciones de plena competencia. Posible, pero realmente, muy lento. Esto podría ser bastante desafiante. ¿Hay alguna posibilidad de que puedas publicar los datos? Es casi seguro que los datos, pero que alguien más lo reproduzca podría ser útil. Además, si dominas R, eso podría facilitar el asesoramiento. – Iterator

+0

Por "lento", quiero decir que es posible recomendar una variedad de pruebas, pasos para probar, cosas para investigar, etc., pero todo el proceso puede llevar algo de tiempo. Si has visto el episodio "House" "Frozen", la idea es similar. De lo contrario, el problema puede ser "demasiado local". – Iterator

+1

lo más probable -) es que ha incluido sus datos de prueba en el conjunto de entrenamiento. Sé que lo has controlado, pero mira un poco más. – bmargulies

Respuesta

11

dos ideas:

asegurarse de que no está entrenando y pruebas sobre los mismos datos. Esto suena un poco tonto, pero en aplicaciones de visión artificial debe tener cuidado de que: asegúrese de no repetir datos (digamos que dos cuadros del mismo video caen en pliegues diferentes), no está entrenando y probando en el mismo individuo , etc. Es más sutil de lo que parece.

Asegúrese de buscar los parámetros gamma y C para el kernel RBF. Hay buenos resultados teóricos (asintóticos) que justifican que un clasificador lineal sea simplemente un clasificador RBF degenerado. Entonces debería buscar un buen par (C, gamma).

+0

para RBF, gracias por indicar (lo que debería haber sido) lo obvio: olvidé buscar buenos parámetros. Tengo mucho entusiasmo una vez que el 100% de precisión comenzó a regresar (y por lo tanto porque sabía, con probabilidad, que algo estaba mal con lo que estaba haciendo o cómo se configuran los datos). – severian

+0

+1 ¡Buena captura en la interpolación! – Iterator

10

a pesar de que el diablo está en los detalles, aquí hay tres pruebas simples que usted podría intentar:

  1. Quickie (~ 2 minutos): Ejecutar los datos a través de un algoritmo de árbol de decisión. Esto está disponible en Matlab a través del classregtree, o puede cargar en R y usar rpart. Esto podría indicar si una o algunas características dan una separación perfecta.
  2. No tan rápido (~ 10-60 minutos, dependiendo de su infraestructura): divida iterativamente las funciones (es decir, de 900 a 2 conjuntos de 450), entrene y pruebe. Si uno de los subconjuntos le da una clasificación perfecta, divídalo de nuevo. Tomaría menos de 10 de estas divisiones para descubrir dónde están las variables problemáticas. Si se "rompe" con muchas variables restantes (o incluso en la primera división), seleccione un subconjunto aleatorio diferente de características, elimine menos variables a la vez, etc. No es posible que necesite todos los 900 para dividir los datos .
  3. Análisis más profundo (minutos a varias horas): pruebe las permutaciones de las etiquetas. Si puede permutarlos a todos y obtener una separación perfecta, tiene algún problema en la configuración de su tren/prueba. Si selecciona subconjuntos cada vez más grandes para permutar (o, si va en la otra dirección, para dejar estática), puede ver dónde comienza a perder separabilidad. Alternativamente, considere disminuir su tamaño de conjunto de entrenamiento y si obtiene la separabilidad incluso con un conjunto de entrenamiento muy pequeño, entonces algo es extraño.

Método # 1 es rápido & debe ser perspicaz. Hay algunos otros métodos que podría recomendar, pero los números 1 y 2 son fáciles y sería extraño si no proporcionan ninguna información. otros

+0

No estoy seguro de lo que quiere decir con etiquetas permutadas, pero si quiere decir permutando el orden de las variables de vectores, ¡esto nunca debería afectar los resultados de SVM! – ldog

+0

@Ite: ¿puede aclarar la declaración "permute" (# 3)? ¿Quiere decir que permuta aleatoriamente cierto número de variables en cada instancia/punto de datos? (¿De modo que diferentes instancias se permutan de forma ligeramente diferente?) Re: n. ° 1 y n. ° 2, empezarán en breve ... realmente aprecio las sugerencias. – severian

+0

La etiqueta es la variable de respuesta. En otras palabras, estás introduciendo ruido. En una clasificación binaria, esto no introduce una clasificación errónea per se, ya que se remuestrea a partir de la distribución de respuesta. La clave es que en algún momento hay un colapso. Puede etiquetar incorrectamente intencionalmente, pero el remuestreo de la distribución de respuesta o permutar las etiquetas son métodos útiles para la exploración de datos y modelos. – Iterator