2013-09-30 21 views
6

Come devo impostare i parametri di gamma e costo in libSVM quando utilizzo un set di dati sbilanciato composto dal 75% di etichette "true" e 25% di "false" etichette? Sto ottenendo un errore costante di avere tutte le etichette previste impostate su "True" a causa dello squilibrio dei dati.squilibrio dei dati in SVM utilizzando libSVM

Se il problema non è con libSVM, ma con il mio set di dati, come dovrei gestire questo squilibrio dal punto di vista di Teoretical Machine Learning? * Il numero di funzioni che sto usando è tra 4-10 e ho un piccolo set di 250 punti dati.

+2

c'è una domanda simile nella pagina delle FAQ che può aiuta: Q: I miei dati sono sbilanciati. Potrebbe libsvm gestire questi problemi? http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f410 – McKelvin

risposta

6

Classi squilibrio non ha nulla a che fare con la selezione di C e gamma, per affrontare questo problema è necessario utilizzare il class weighting scheme che è Disponibile in per esempio scikit-learn pacchetto (costruito su libsvm)

Selezione dei migliori C e gamma viene eseguito utilizzando la ricerca della griglia con convalida incrociata. Si consiglia di provare un vasto intervallo di valori, per C è ragionevole scegliere valori tra 1 e 10^15 mentre un valore euristico semplice e buono dei valori di intervallo gamma consiste nel calcolare le distanze a coppie tra tutti i punti dati e selezionare la gamma in base ai percentili di questo distribuzione - pensare di inserire in ogni punto una distribuzione gaussiana con varianza uguale a 1/gamma - se si seleziona tale gamma che questa distribuzione si sovrappone a molti punti si otterrà il modello molto "liscio", mentre si utilizzano piccoli cavi di varianza per il sovradattamento.

+1

Lo schema di ponderazione della classe implica che 'C' viene modificato nel problema di addestramento SVM effettivo, quindi il bilancio di classe * fa * avere qualcosa a che fare con la selezione di 'C' anche se accade dietro le tende. –

+1

Questa è una questione puramente linguistica, poiché la mia intenzione era che la selezione di C non risolvesse il problema dello squilibrio. Le soluzioni di questo problema cambiano tuttavia la C, non vedo la vera contraddizione qui – lejlot

4

I set di dati sbilanciati possono essere affrontati in vari modi. Il bilanciamento della classe non ha alcun effetto sui parametri del kernel come gamma per il kernel RBF.

I due approcci più popolari sono:

  1. utilizzare diverse sanzioni di errata classificazione per classe, questo significa cambiare C. In genere la classe più piccola viene pesata più in alto, un approccio comune è npos * wpos = nneg * wneg. LIBSVM ti permette di farlo usando i suoi flag -wX.
  2. Sottocampione della classe sovrarappresentata per ottenere una quantità uguale di positivi e negativi e procedere con l'allenamento come si farebbe tradizionalmente per un set bilanciato. Prendi nota del fatto che in questo modo ignori sostanzialmente una grande porzione di dati, che è intuitivamente una cattiva idea.
+1

Perché non ** oversample ** il più piccolo invece? Questo non ignorerà alcuna informazione – lejlot

+0

@lejlot La maggior parte delle situazioni in cui viene utilizzata quest'ultima strategia sono problemi su larga scala (ad esempio milioni a miliardi di istanze), in cui l'ignorare parte dei dati viene effettivamente utilizzata come un hack per ridurre la complessità. Il sovracampionamento del set più piccolo è fondamentalmente il primo approccio in un modo inefficiente (il sovracampionamento è esattamente lo stesso del reweighing). –

+0

Ne sono pienamente consapevole, mi chiedo solo perché non hai incluso questa opzione. Il vantaggio principale del sovracampionamento è che si tratta di un approccio generico, che può essere utilizzato anche con i modelli (e le loro implementazioni) che non consentono di pesare campioni (a un costo di efficienza). – lejlot

2

So che è stato chiesto qualche tempo fa, ma mi piacerebbe rispondere perché potresti trovare utile la mia risposta.

Come altri hanno già detto, è possibile prendere in considerazione l'utilizzo di pesi diversi per le classi di minoranza o l'utilizzo di penalità di errata classificazione diverse. Tuttavia, esiste un modo più intelligente di gestire i set di dati sbilanciati.

È possibile utilizzare il percosse (S ynthetic M inority O ver-campionamento Te chnique ) algoritmo per generare i dati di sintesi per la classe di minoranza. È un algoritmo semplice che può gestire abbastanza bene alcuni set di dati di sbilanciamento.

In ogni iterazione dell'algoritmo, SMOTE considera due istanze casuali della classe di minoranza e aggiunge un esempio artificiale della stessa classe da qualche parte nel mezzo. L'algoritmo continua a iniettare il set di dati con i campioni fino a quando le due classi diventano equilibrate o altri criteri (ad esempio aggiungono un certo numero di esempi). Di seguito è possibile trovare un'immagine che descrive l'algoritmo per un semplice set di dati nello spazio delle funzionalità 2D.

L'associazione del peso con la classe di minoranza è un caso speciale di questo algoritmo. Quando si associa il peso $ w_i $ con l'istanza i, in pratica si aggiungono le istanze $ w_i - 1 $ in aggiunta all'istanza i!

SMOTE

  • Quello che dovete fare è quello di aumentare il vostro set di dati iniziale con i campioni creati da questo algoritmo, e formare la SVM con questo nuovo set di dati. Puoi anche trovare molte implementazioni online in diverse lingue come Python e Matlab.

  • Ci sono state altre estensioni di questo algoritmo, posso indicarti più materiali se vuoi.

  • Per testare il classificatore è necessario dividere l'insieme di dati in prova e in treno, aggiungere istanze di sintesi per il set di treno (non aggiungere al set TEST), il training del modello sul set treno, e, infine, testarlo sul set di test. Se si considerano le istanze generate durante il test, si otterrà una precisione e un richiamo prevenuti (e ridicolmente più alti).