Disuguaglianza di classe e sovracampionamento Un’introduzione formale

Disuguaglianza di classe e sovracampionamento Un'introduzione formale

Esploriamo il problema dello sbilanciamento di classe e come i metodi di campionamento come il sovracampionamento casuale tentano di risolverlo.

Ultimamente, ho sviluppato un pacchetto in Julia chiamato Imbalance.jl per affrontare lo sbilanciamento di classe. Ci sono voluti molti sforzi in termini di lettura di articoli e analisi di implementazioni durante lo sviluppo del pacchetto, quindi ho pensato che potrebbe essere utile condividere ciò che ho imparato sul problema dello sbilanciamento di classe in generale, insieme ad alcuni degli algoritmi più popolari utilizzati per affrontarlo. Questo include sovracampionamento casuale ingenuo, sovracampionamento casuale degli esempi (ROSE), sovracampionamento casuale a passo casuale (RWO), tecnica di sovracampionamento delle minoranze sintetiche (SMOTE), SMOTE-Nominal, e SMOTE-Nominal Continuo e molti approcci di sottocampionamento. In questo articolo, definiremo formalmente il problema dello sbilanciamento di classe e discuteremo come il sovracampionamento casuale sia una soluzione valida. In articoli successivi, giungeremo razionalmente a ulteriori soluzioni considerando altre tecniche.

Foto di Artem Kniaz su Unsplash

Il Problema dello Sbilanciamento di Classe

Maggior parte, se non tutti, gli algoritmi di machine learning possono essere visti come una forma di minimizzazione del rischio empirico in cui l’obiettivo è trovare i parametri θ che minimizzano una funzione di perdita L:

Ad esempio, la regressione lineare usa la perdita quadratica, la regressione logistica usa la perdita di entropia incrociata, il SVM usa la perdita di cerniera, il boosting adattivo usa la perdita esponenziale.

L’assunzione sottostante è che se i parametri di f_θ consentono di minimizzare questo rischio empirico sul dataset, che può essere considerato come un campione casuale dalla popolazione, allora dovrebbe essere sufficientemente vicino alla funzione obiettivo f che cerchiamo, che minimizza la stessa quantità sul dataset e sulla popolazione intera.

In un contesto multiclasse con K classi, possiamo esprimere il rischio empirico come

Lo sbilanciamento di classe si verifica quando alcune classi hanno molti meno esempi rispetto ad altre classi. In questo caso, i termini corrispondenti a tali classi contribuiscono minimamente alla somma, il che rende possibile per qualsiasi algoritmo di apprendimento trovare una soluzione approssimata per minimizzare il rischio empirico che si concentra principalmente sulle somme significative. Ciò porta a un’ipotesi f_θ che può essere molto diversa dalla vera funzione obiettivo f per le classi di minoranza, che possono essere le più importanti per l’applicazione in questione.

Concludendo, le seguenti sono le condizioni in cui abbiamo un problema di sbilanciamento di classe:

1 – I punti nel set di addestramento non sono distribuiti “equamente” tra le classi; alcune classi hanno molti meno punti che le rappresentano rispetto ad altre.

2 – Il modello non si comporta bene su punti che appartengono a tali classi di minoranza dopo l’addestramento. Cioè, l’algoritmo di apprendimento non ha minimizzato adeguatamente la perdita per le classi di minoranza come spiegato in precedenza.

Il grado in cui questo problema è avverso dipende da quanto siano importanti tali classi di minoranza per l’applicazione. Spesso, queste classi sono molto più importanti della classe maggioritaria (ad esempio, classificazione di transazioni fraudolente o malattie rare).

Risolvere il Problema dello Sbilanciamento di Classe

Dalla descrizione del problema diventa evidente che un rimedio è pesare le somme più piccole (cioè quelle appartenenti alle classi di minoranza) in modo che un algoritmo di apprendimento eviti più facilmente soluzioni approssimate che sfruttano la loro insignificanza. Spesso è possibile modificare gli algoritmi di machine learning a tale scopo, specialmente quando sono esplicitamente una forma di minimizzazione del rischio empirico e non solo equivalenti a essa per qualche funzione di perdita.

Un altro approccio che tenta di risolvere il problema senza richiedere modifiche all’algoritmo di apprendimento consiste nel campionare nuovamente i dati. Nella sua forma più semplice, può essere considerato equivalente all’approccio di assegnazione dei pesi sensibili al costo. Considera il seguente algoritmo:

Given: Un dataset sbilanciato con K classi e un intero per ogni classeRisultato desiderato: Un dataset in cui i dati di ogni classe vengono replicati secondo l’interoOperazione: Ripetere ciascun punto della classe k, c volte, dove c è l’intero associato a quella classe

Dovrebbe essere ovvio inserendo nella somma che questo è equivalente all’approccio cost-sensitive; ricorda che minimizzare una funzione è equivalente a minimizzare un suo multiplo scalare positivo.

Random Oversampling

L’algoritmo sopra menzionato presenta un piccolo problema; se la classe A ha 900 esempi e la classe B ne ha 600, allora non esiste un multiplo intero che possiamo usare per sovracampionare la classe B e portare il dataset a un bilanciamento esatto. Possiamo estendere l’algoritmo per gestire rapporti di replicazione che non sono interi scegliendo punti da replicare casualmente. Ad esempio, se vogliamo sovracampionare 300 esempi per la classe B in modo che il sistema sia portato in equilibrio (equivalente a un rapporto di 1.5) possiamo farlo…

1 — Scegliere casualmente 300 punti dalla classe B2 — Replicare quei punti

Questo algoritmo è chiamato sovracampionamento casuale ingenuo e formalmente fa:

1 — Calcola il numero necessario di punti da generare per ogni classe (calcolato da alcuni rapporti dati)2 — Supponiamo che per la classe k quel numero sia N_k, quindi scegli N_k punti casualmente con sostituzione tra i punti appartenenti a quella classe e aggiungili al nuovo dataset

Dovrebbe essere ovvio che questo equivale in media all’algoritmo sopra menzionato e quindi anche al class-weighting. Se il rapporto per la classe k è 2.0, allora in media ogni punto verrà selezionato una sola volta in modo casuale.

Ecco un dataset sbilanciato casuale che ho generato per tre classi (0, 1, 2) che mostra un istogramma delle classi e un grafico a dispersione dei punti prima e dopo il sovracampionamento.

Figura dell'autore

Si noti che non c’è differenza visiva tra le due figure nella parte inferiore perché tutti i punti generati sono replicati di quelli già esistenti.

Perché il sovracampionamento?

Finora potresti non essere così convinto del fatto che il campionamento sia più prominente del peso delle classi per risolvere il problema dello sbilanciamento delle classi; dopo tutto, abbiamo dimostrato che il sovracampionamento casuale ingenuo può essere considerato in media equivalente al weight della classe con tempi di addestramento più lunghi (a causa di più dati). L’unico punto debole in questo argomento è che non è generalmente possibile utilizzare il weight delle classi, soprattutto se il modello di apprendimento automatico non minimizza esplicitamente la perdita.

Ha senso ottenere risultati migliori rispetto al sovracampionamento casuale ingenuo (o al weight delle classi) se invece aggiungiamo naturalmente i punti per ogni classe raccogliendo più dati nel nostro dataset. Ad esempio, supponiamo che…

  • Vogliamo rilevare se una transazione è fraudolenta
  • Abbiamo raccolto un dataset di 1K transazioni fraudolente e 999K transazioni valide

Dovrebbe essere ovvio che risolvere il problema dello sbilanciamento raccogliendo altre 998K transazioni fraudolente è molto più vantaggioso rispetto a ripetere le esistenti 1K volte. In particolare, si corre un alto rischio di sovradattamento dei dati specifici nel secondo caso.

La realtà è ovviamente che non è generalmente possibile raccogliere ulteriori dati per le classi minoritarie; tuttavia, potrebbe essere possibile simulare l’effetto facendo così. Forse, se generiamo sinteticamente dati per le classi minoritarie che siano sufficientemente rappresentativi di nuovi esempi reali, idealmente ciò è molto meglio rispetto a ripetere esempi o dare peso alle classi. Questa è la forma più comune di sovracampionamento e la sua relazione con la raccolta di dati reali potrebbe essere la giustificazione più plausibile del motivo per cui può superare il sovracampionamento casuale e il weight delle classi; quindi, un approccio valido per risolvere il problema dello sbilanciamento delle classi.

Undersampling

Infine, notare che se anziché scegliere casualmente gli esempi da replicare nelle classi minoritarie, scegliessimo casualmente i punti da rimuovere nelle classi maggioritarie, allora l’algoritmo diventerebbe un sottocampionamento casuale ingenuo. Questo ovviamente ha lo svantaggio di perdere dati utili, ma talvolta eliminare dati dalle classi maggioritarie “non così utili” risolve il problema dello sbilanciamento e porta a prestazioni molto migliori per le classi minoritarie “molto più utili”. Esistono anche altri approcci di sottocampionamento che scelgono con più attenzione quali punti escludere, ad esempio per preservare la struttura dei dati o consentire migliori confini decisionali.

In ulteriori storie spieghiamo tutti gli algoritmi inizialmente implementati in Imbalance.jl e come risolvono il problema dell’imbilanciamento di classe.