2012-07-10 10 views
7

Ho un problema di tre classi con dati sbilanciati (90%, 5%, 5%). Ora voglio allenare un classificatore usando LIBSVM.Utilizzo di LIBSVM grid.py per dati non bilanciati?

Il problema è che LIBSVM ottimizza il suo parametro gamma e Costo per l'accuratezza ottimale, il che significa che il 100% degli esempi sono classificati come classe 1, che ovviamente non è quello che voglio.

Ho provato a modificare i parametri di peso -w senza molto successo.

Quindi, quello che voglio è modificare griglia.py in modo da ottimizzare Costo e gamma per precisione e richiamo separato da classi piuttosto che per precisione generale. C'è un modo per farlo? O ci sono altri script là fuori che possono fare qualcosa di simile?

risposta

8

Il parametro -w è ciò che è necessario per i dati sbilanciati. Cosa hai provato fino ad ora?

Se le classi sono:

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

Si dovrebbe passare i seguenti params a SVM :

-w0 5 -w1 90 -w2 90 
+1

grazie, ma penso che dovrebbe essere il contrario: -w0 5 -w1 90 -w2 90, poiché la classe più piccola dovrebbe avere più costi associati a loro .. questo ha aiutato! – Damnum

+0

sì, penso che tu abbia ragione. Ho appena modificato la mia domanda. Grazie! –

+0

E quando hai più di 3 classi, come puoi attribuire il valore di ogni w? – lilouch

4

Se si desidera provare un'alternativa, uno dei programmi della famiglia svmlight, http://www.cs.cornell.edu/people/tj/svm_light/svm_rank.html, riduce direttamente l'area sotto la curva ROC.

Ridurre al minimo l'AUC può dare risultati migliori rispetto agli esempi di ripetizione della ponderazione.

+1

svmlight è commerciale-ostile; è gratuito solo per uso accademico. – JDonner

0

È possibile ottimizzare qualsiasi precisione, richiamo, F-score e AUC utilizzando grid.py. Tweak è che devi cambiare la misura di valutazione della validazione incrociata usata da svm-train in LIBSVM. Segui lo procedure given on LIBSVM website.

0

Se si dispone di dati sbilanciati, probabilmente non si dovrebbe ottimizzare la precisione. Ottimizza invece il punteggio F (o richiama, se è più importante per te). È possibile modificare la funzione di valutazione come descritto in here.

Penso che dovresti anche ottimizzare la gamma e il costo, mentre utilizzi diverse configurazioni di peso della classe. Ho modificato la funzione "get_cmd" in grid.py passando pesi di classe diversi per quello scopo (-peso in peso). Nella mia esperienza, la ponderazione della classe non sempre aiuta.