Come utilizzare smote per dati sbilanciati in r (con esempio)


Spesso quando si lavora conalgoritmi di classificazione dell’apprendimento automatico, le classi nel set di dati saranno sbilanciate.

Per esempio:

  • Un set di dati contenente informazioni sull’eventuale arruolamento o meno di giocatori universitari nell’NBA potrebbe avere il 98% dei giocatori non arruolati e il 2% in fase di arruolamento.
  • Un set di dati contenente informazioni sulla presenza o meno di cancro nei pazienti potrebbe contenere il 99% dei pazienti senza cancro e solo l’1% con cancro.
  • Un set di dati contenente informazioni sulle frodi bancarie potrebbe contenere il 96% di transazioni legittime e il 4% di transazioni fraudolente.

A causa di queste classi sbilanciate, il modello predittivo costruito potrebbe non funzionare bene sulla classe minoritaria.

Peggio ancora, la classe minoritaria è spesso quella che più desideriamo prevedere.

Un modo per risolvere questo problema di squilibrio è utilizzare la tecnica del sovracampionamento delle minoranze sintetiche , spesso abbreviata SMOTE .

Questa tecnica prevede la creazione di un nuovo set di dati sovracampionando le osservazioni della classe minoritaria, che produce un set di dati con classi più bilanciate.

Il modo più semplice per utilizzare SMOTE in R è utilizzare la funzione SMOTE() dal pacchetto DMwR .

Questa funzione utilizza la seguente sintassi di base:

 SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)

Oro:

  • form : una formula che descrive il modello che desideri adattare
  • data : nome del frame di dati
  • perc.over : numero che determina quanti casi aggiuntivi della classe minoritaria vengono generati
  • perc.under : numero che determina quanti casi aggiuntivi della classe maggioritaria vengono generati

L’esempio seguente mostra come utilizzare questa funzione nella pratica.

Esempio: come utilizzare SMOTE in R

Supponiamo di avere il seguente set di dati con 100 osservazioni in R in cui 90 hanno una classe “Sì” e 10 hanno una classe “No” per la variabile di risposta:

 #make this example reproducible
set. seed ( 0 )

#create data frame with one response variable and two predictor variables
df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )),
                 x1=rnorm( 100 ),
                 x2=rnorm( 100 ))

#view first six rows of data frame
head(df)

    y x1 x2
1 Yes 1.2629543 0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes 1.3297993 -0.6159899
4 Yes 1.2724293 0.0465803
5 Yes 0.4146414 -1.1303858
6 Yes -1.5399500 0.5767188
 
#view distribution of response variable
table(df$y)

 Drowned 
 10 90

Questo è un classico esempio di set di dati sbilanciato perché la variabile di risposta che stiamo prevedendo ha 90 osservazioni con una classe “Sì” e solo 10 osservazioni con una classe “No”.

Per creare un set di dati più bilanciato, possiamo utilizzare la funzione SMOTE() dal pacchetto DMwR :

 library ( DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 )

#view distribution of response variable in new dataset
table(new_df$y)

 Drowned 
210,800

Il set di dati risultante contiene 210 osservazioni con “No” come classe e 800 osservazioni con “Sì” come classe.

Ecco esattamente come la funzione SMOTE ha prodotto questo nuovo set di dati:

  • L’argomento perc.over specificava che volevamo aggiungere 2000/100 (o 20) volte il numero di osservazioni di minoranza esistenti al set di dati. Poiché nel set di dati originale esistevano 10 osservazioni, abbiamo aggiunto 20*10 = 200 ulteriori osservazioni minoritarie .
  • L’argomento perc.under specificava che volevamo rendere il numero di osservazioni della maggioranza pari a 400/100 (o 4) volte il numero di osservazioni di minoranza aggiunte alle osservazioni di minoranza esistenti. Poiché sono state aggiunte ulteriori 200 osservazioni minoritarie, abbiamo reso il numero di osservazioni maggioritarie pari a 200 * 4 = 800 osservazioni maggioritarie .

Il risultato finale è un set di dati che contiene ancora più classi maggioritarie, ma è comunque più equilibrato rispetto al set di dati originale.

Ora puoi adattare l’algoritmo di classificazione di tua scelta a questo nuovo set di dati, che dovrebbe funzionare meglio sulla classe di minoranza poiché ci sono più osservazioni dalla classe di minoranza in questo nuovo set di dati.

Nota : sentiti libero di giocare con gli argomenti perc.over e perc.under nella funzione SMOTE per ottenere un set di dati adatto alle tue esigenze.

Risorse addizionali

I seguenti tutorial spiegano come eseguire altre attività comuni in R:

Come creare tabelle di riepilogo in R
Come normalizzare i dati in R
Come rimuovere gli outlier in R

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *