2012-07-10 20 views
7

Tengo un problema de tres clases con datos desequilibrados (90%, 5%, 5%). Ahora quiero entrenar un clasificador usando LIBSVM.¿Utilizando LIBSVM grid.py para datos no balanceados?

El problema es que LIBSVM optimiza su parámetro gamma y Cost para una precisión óptima, lo que significa que el 100% de los ejemplos se clasifican en la clase 1, que por supuesto no es lo que quiero.

He intentado modificar los parámetros de peso -w sin mucho éxito.

Lo que quiero es modificar grid.py de una manera que optimice el costo y la gamma para precisión y recuperación separados por clases en lugar de por la precisión general. ¿Hay alguna forma de hacer eso? ¿O hay otras secuencias de comandos que pueden hacer algo como esto?

Respuesta

8

El parámetro -w es lo que necesita para datos desequilibrados. ¿Qué has intentado hasta ahora?

Si las clases son:

  • clase 0: 90%
  • clase 1: 5%
  • clase 2: 5%

Usted debe pasar los siguientes parametros a SVM :

-w0 5 -w1 90 -w2 90 
+1

gracias, pero creo que debería ser al revés: -w0 5 -w1 90 -w2 90, ya que la clase más pequeña debería tener más costos asociados con ellos ... ¡esta ayudó! – Damnum

+0

sí, creo que tienes razón. Acabo de editar mi pregunta. ¡Gracias! –

+0

Y cuando tienes más de 3 clases, ¿cómo puedes atribuir el valor de cada w? – lilouch

4

Si quieres probar una alternativa, uno de los programas de la familia svmlight, http://www.cs.cornell.edu/people/tj/svm_light/svm_rank.html, minimiza directamente el área bajo la curva ROC.

Minimizar el AUC puede dar mejores resultados que los ejemplos de entrenamiento de ponderación.

+1

svmlight es comercialmente hostil; es solo gratis para uso académico. – JDonner

0

Puede optimizar cualquiera de la precisión, recuperación, F-score y AUC usando grid.py. El ajuste es que debe cambiar la medida de evaluación de validación cruzada utilizada por svm-train en LIBSVM. Siga el procedure given on LIBSVM website.

0

Si tiene datos desequilibrados, es probable que no deba optimizar la precisión. En su lugar, optimice el puntaje f (o recuerde, si eso es más importante para usted). Puede cambiar la función de evaluación como se describe en here.

Creo que también debería optimizar la gamma y el costo, al usar diferentes configuraciones de peso de clase. Modifiqué la función "get_cmd" en grid.py pasando diferentes pesos de clase para ese propósito (-wi peso). En mi experiencia, la ponderación de clases no siempre ayuda.

Cuestiones relacionadas