Come classificare un set di dati non bilanciato da Convolutional Neural Networks (CNN)?


10

Ho un set di dati sbilanciato in un'attività di classificazione binaria, in cui l'importo positivo e negativo è dello 0,3% vs 99,7%. Il divario tra positivi e negativi è enorme. Quando alleno una CNN con la struttura utilizzata nel problema MNIST, il risultato del test mostra un alto tasso di falsi negativi. Inoltre, la curva dell'errore di allenamento scende rapidamente in un paio di epoche all'inizio, ma rimane lo stesso valore nelle epoche successive.

Potete per favore consigliarmi un modo per elaborare questo problema? Grazie!

Risposte:


10

Ciò accade perché quando prendi un mini-batch, è molto meno probabile (dato il rapporto delle proporzioni qui) che un mini batch conterrà campioni dei tuoi positivi. Quindi finirà per imparare il modello per la classe negativa e dopo un paio di epoche, tutto viene classificato come classe negativa.

Esistono due modi possibili per gestire una situazione del genere.

  1. Date le proporzioni dallo 0,3% al 99,7%, si tratta di un set di dati molto distorto. Difficilmente hai 3 campioni di classi positive per ogni 1000 campioni. Direi che dovresti cercare di bilanciare il set di dati ottenendo classi più positive. Vai a ottenere quanti più campioni positivi che puoi. Quindi, è possibile utilizzare un set di dati più bilanciato. Ad esempio, è possibile ottenere 1000 campioni positivi e quindi selezionare un set casuale di 1000 campioni negativi e creare il classificatore. Ora dovrebbe essere in grado di apprendere entrambe le classi.

  2. Utilizzare una misura di errore ponderata per l'aggiornamento dei pesi dopo un mini-batch. I pesi vengono aggiornati in proporzione al numero di campioni delle classi positive e negative durante qualsiasi mini-batch. Ora, nella situazione attuale date le proporzioni di 3: 1000, anche questo trucco potrebbe non funzionare. Quindi puoi provare a ottenere le proporzioni a qualcosa come 300: 1000 ottenendo 297 campioni più positivi e combinandoli con 1000 campioni negativi. Quindi, con un rapporto 300: 1000, è necessario ponderare l'errore durante i mini lotti in base al numero di campioni in ciascuna delle classi. Questo dovrebbe funzionare.


Sai qual è la proporzione ottimale qui? sono le 3:10 o qualcos'altro?
donlan,

4

Perché vuoi usare le CNN qui? Hai preso in considerazione altri modelli che gestiscono effettivamente i dati sbilanciati?

Ad esempio, ho scoperto che le seguenti due tecniche hanno funzionato davvero bene per me:

  • Foreste casuali con potenziamento SMOTE : utilizzare un ibrido SMOTEche sottocampiona la classe di maggioranza e sovracampiona la classe di minoranza con percentuali regolabili. Seleziona queste percentuali in base alla distribuzione della variabile di risposta nel set di addestramento. Invia questi dati al tuo modello RF. Convalida / esegui sempre la ricerca incrociata della griglia per trovare le migliori impostazioni dei parametri per le tue RF.

  • XGBoost con ottimizzazione dell'iper-parametro : ancora una volta, convalida incrociata o esegui gird-search per trovare le migliori impostazioni dei parametri per il modello. Inoltre, xgboostconsente di bilanciare pesi di classe positivi e negativi utilizzando scale_pos_weight. Vedere la documentazione dei parametri per un elenco completo.

Dovrei anche aggiungere che il set di dati su cui stavo lavorando aveva la stessa percentuale di inclinazione e sono stato in grado di ottenere il punteggio di Sensibilità di 0,941 e una Specificità di 0,71 con xgboost, il che significa che il modello sta predicendo i veri positivi in ​​modo abbastanza accurato e che promette bene per me.

(Mi dispiace, non posso lasciare un commento, non abbastanza reputazione e volevo davvero sapere perché hai scelto le CNN)


1

Il set di dati non bilanciato è un problema comune in tutte le aree e non riguarda specificamente la visione computerizzata e i problemi trattati dalle reti neurali convoluzionali (CNN).

Per affrontare questo problema, dovresti provare a bilanciare il tuo set di dati, eseguendo un campionamento eccessivo delle classi di minoranza o delle classi di maggioranza sottocampionamento (o entrambi). Probabilmente, una buona scelta sarebbe l'algoritmo SMOTE (Synthetic Minority Over-sampling Technique), come menzionato sopra. Qui puoi trovare un confronto tra diversi algoritmi di sovracampionamento. Se sei un utente Python, sbilanciato-impara è una bella libreria che implementa molte tecniche utili per bilanciare set di dati.

D'altra parte, se stai cercando di classificare le immagini, un buon modo per aumentare le dimensioni del tuo set di dati è quello di aumentarlo (cioè creando esempi sintetici ragionevoli, ad esempio immagini simili ma ruotate / spostate leggermente rispetto a quelle originali). A volte potresti trovare utile aumentare le classi minoritarie per raggiungere un migliore equilibrio.La classe Keras ImageDataGenerator è un buon strumento per questo scopo.

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.