Il modo migliore per gestire un set di dati multiclasse non bilanciato con SVM


9

Sto cercando di costruire un modello di previsione con SVM su dati abbastanza sbilanciati. Le mie etichette / output hanno tre classi, positiva, neutra e negativa. Direi che l'esempio positivo rende circa il 10-20% dei miei dati, neutro circa il 50-60% e negativo circa il 30-40%. Sto cercando di bilanciare le classi poiché il costo associato a previsioni errate tra le classi non è lo stesso. Un metodo consisteva nel ricampionare i dati di addestramento e produrre un set di dati equamente bilanciato, che era più grande dell'originale. È interessante notare che, quando lo faccio, tendo a ottenere previsioni migliori per l'altra classe (ad esempio, quando ho bilanciato i dati, ho aumentato il numero di esempi per la classe positiva, ma fuori dalle previsioni del campione, la classe negativa ha fatto meglio). Chiunque può spiegare in generale perché questo accade? Se aumentassi il numero di esempio per la classe negativa, otterrei qualcosa di simile per la classe positiva in previsioni fuori campione (ad esempio, previsioni migliori)?

Inoltre sono molto aperti ad altri pensieri su come posso affrontare i dati sbilanciati imponendo costi diversi sulla classificazione errata o usando i pesi di classe in LibSVM (non sono sicuro di come selezionare / ottimizzare quelli correttamente però).

Risposte:


6

Avere penalità diverse per le variabili di margine debole per i modelli di ogni classe è un approccio migliore rispetto al ricampionamento dei dati. È asintoticamente equivalente al ricampionamento comunque, ma è più facile da implementare e continuo, piuttosto che discreto, quindi hai più controllo.

Tuttavia, la scelta dei pesi non è semplice. In linea di principio è possibile elaborare una ponderazione teorica che tenga conto dei costi di classificazione errata e delle differenze tra l'addestramento impostato su probabilità operative di classe precedente, ma non fornirà le prestazioni ottimali. La cosa migliore da fare è selezionare le penalità / pesi per ogni classe minimizzando la perdita (tenendo conto dei costi di errata classificazione) mediante validazione incrociata.


Esiste un modo automatizzato su come farlo o esistono studenti che hanno questa funzionalità incorporata?
Vam,

Di solito scrivo solo una funzione matlab per valutare la perdita per un determinato insieme di penalità e quindi minimizzarla usando l'algoritmo simplex Nelder-Mead. Non conosco nessuna biblioteca che lo abbia incorporato.
Dikran Marsupial

@DikranMarsupial Una ricerca in griglia delle due variabili di margine debole in un problema di due classi sarebbe equivalente a quello che stai facendo con l'algoritmo simplex?
Spacey,

@Tarantula sì, il preciso metodo di ottimizzazione è relativamente poco importante, il punto chiave è assicurarsi di ottimizzare la statistica di convalida incrociata a cui sei veramente interessato ai fini della tua applicazione (ovvero le stesse frequenze di classe incontrate nell'uso operativo e tenendo conto dei costi di errata classificazione, se noti).
Dikran Marsupial,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.