Ultimo aggiornamento del 5 gennaio 2021
I dataset squilibrati sono quelli in cui c’è una forte asimmetria nella distribuzione delle classi, come 1:100 o 1:1000 esempi nella classe minoritaria rispetto alla classe maggioritaria.
Questa distorsione nel set di dati di allenamento può influenzare molti algoritmi di apprendimento automatico, portando alcuni a ignorare completamente la classe di minoranza. Questo è un problema perché è tipicamente la classe di minoranza su cui le previsioni sono più importanti.
Un approccio per affrontare il problema dello squilibrio di classe è quello di ricampionare in modo casuale il set di dati di allenamento. I due approcci principali al ricampionamento casuale di un set di dati sbilanciato sono la cancellazione di esempi dalla classe di maggioranza, chiamata sottocampionamento, e la duplicazione di esempi dalla classe di minoranza, chiamata sovracampionamento.
In questo tutorial, scoprirai il sovracampionamento e il sottocampionamento casuale per la classificazione squilibrata
Dopo aver completato questo tutorial, saprai:
- Il ricampionamento casuale fornisce una tecnica ingenua per riequilibrare la distribuzione delle classi per un set di dati squilibrato.
- Il sovracampionamento casuale duplica gli esempi della classe minoritaria nel set di dati di allenamento e può risultare in un overfitting per alcuni modelli.
- Il sottocampionamento casuale elimina gli esempi dalla classe maggioritaria e può portare alla perdita di informazioni preziose per un modello.
Inizia il tuo progetto con il mio nuovo libro Imbalanced Classification with Python, che include tutorial passo-passo e i file del codice sorgente Python per tutti gli esempi.
Iniziamo.
- Aggiornato gennaio/2021: Link aggiornati per la documentazione API.
Random Oversampling and Undersampling for Imbalanced Classification
Foto di RichardBH, alcuni diritti riservati.
- Panoramica del tutorial
- Random Resampling Imbalanced Datasets
- Libreria Imbalanced-Learn
- Vuoi iniziare con la classificazione degli squilibri?
- Campionamento casuale dei dataset squilibrati
- Sottocampionamento casuale dei dataset squilibrati
- Combinazione di sovracampionamento e sottocampionamento casuale
- Altre letture
- Libri
- Papers
- API
- Articoli
- Sommario
- Get a Handle on Imbalanced Classification!
- Develop Imbalanced Learning Models in Minutes
- Porta i metodi di classificazione sbilanciati ai tuoi progetti di apprendimento automatico
Panoramica del tutorial
Questo tutorial è diviso in cinque parti; esse sono:
- Raccampionamento casuale di set di dati sbilanciati
- Biblioteca di apprendimento
- Imbalanced-Learn Library
- Random Oversampling Imbalanced Datasets
- Random Undersampling Imbalanced Datasets
- Combinazione di Random Oversampling e Undersampling
Random Resampling Imbalanced Datasets
Resampling implica la creazione di una nuova versione trasformata del dataset di training in cui gli esempi selezionati hanno una diversa distribuzione di classe.
Questa è una strategia semplice ed efficace per i problemi di classificazione squilibrata.
Applicare strategie di ricampionamento per ottenere una distribuzione dei dati più equilibrata è una soluzione efficace al problema dello squilibrio
– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
La strategia più semplice è quella di scegliere gli esempi per il set di dati trasformato in modo casuale, chiamato ricampionamento casuale.
Ci sono due approcci principali al ricampionamento casuale per la classificazione squilibrata; sono l’oversampling e l’undersampling.
- Oversampling casuale: Duplica casualmente gli esempi nella classe di minoranza.
- Sottocampionamento casuale: Eliminare a caso gli esempi nella classe di maggioranza.
Il sovracampionamento casuale consiste nel selezionare a caso esempi dalla classe di minoranza, con sostituzione, e aggiungerli al set di dati di allenamento. Il sottocampionamento casuale comporta la selezione casuale di esempi dalla classe di maggioranza e la loro eliminazione dal set di dati di addestramento.
Nel sottocampionamento casuale, le istanze della classe di maggioranza sono scartate a caso fino a quando non si raggiunge una distribuzione più equilibrata.
– Pagina 45, Apprendimento squilibrato: Foundations, Algorithms, and Applications, 2013
Entrambi gli approcci possono essere ripetuti fino a quando la distribuzione di classe desiderata viene raggiunta nel set di dati di addestramento, come ad esempio una divisione equa tra le classi.
Si parla di metodi di “ricampionamento ingenuo” perché non assumono nulla sui dati e non vengono utilizzate euristiche. Questo li rende semplici da implementare e veloci da eseguire, il che è auspicabile per insiemi di dati molto grandi e complessi.
Entrambe le tecniche possono essere utilizzate per problemi di classificazione a due classi (binari) e per problemi di classificazione a più classi con una o più classi di maggioranza o minoranza.
Importante, la modifica della distribuzione delle classi viene applicata solo al set di dati di addestramento. L’intento è quello di influenzare l’adattamento dei modelli. Il ricampionamento non viene applicato al dataset di test o di holdout utilizzato per valutare le prestazioni di un modello.
Generalmente, questi metodi ingenui possono essere efficaci, anche se ciò dipende dalle specifiche del dataset e dei modelli coinvolti.
Diamo un’occhiata più da vicino a ciascun metodo e a come usarli in pratica.
Libreria Imbalanced-Learn
In questi esempi, useremo le implementazioni fornite dalla libreria Python imbalanced-learn, che può essere installata tramite pip come segue:
1
|
sudo pip install imbalanced-learn
|
Puoi confermare che l’installazione ha avuto successo stampando la versione della libreria installata:
1
2
3
|
# check version number
import imblearn
print(imblearn.__version__)
|
Eseguendo l’esempio verrà stampato il numero di versione della libreria installata; per esempio:
1
|
0.5.0
|
Vuoi iniziare con la classificazione degli squilibri?
Prendi ora il mio corso crash gratuito di 7 giorni via email (con codice campione).
Clicca per registrarti e ottenere anche una versione gratuita del corso in PDF Ebook.
Scarica il tuo mini-corso GRATUITO
Campionamento casuale dei dataset squilibrati
Il sovracampionamento casuale consiste nel duplicare a caso gli esempi della classe minoritaria e aggiungerli al dataset di allenamento.
Gli esempi del dataset di allenamento sono selezionati a caso con sostituzione. Questo significa che gli esempi dalla classe minoritaria possono essere scelti e aggiunti al nuovo set di dati di formazione “più equilibrato” più volte; sono selezionati dal set di dati di formazione originale, aggiunti al nuovo set di dati di formazione, e poi restituiti o “sostituiti” nel set di dati originale, permettendo loro di essere selezionati di nuovo.
Questa tecnica può essere efficace per quegli algoritmi di apprendimento automatico che sono affetti da una distribuzione asimmetrica e dove più esempi duplicati per una data classe possono influenzare l’adattamento del modello. Questo potrebbe includere algoritmi che imparano iterativamente i coefficienti, come le reti neurali artificiali che usano la discesa del gradiente stocastico. Può anche influenzare i modelli che cercano buone suddivisioni dei dati, come le macchine vettoriali di supporto e gli alberi di decisione.
Potrebbe essere utile sintonizzare la distribuzione della classe target. In alcuni casi, la ricerca di una distribuzione bilanciata per un set di dati gravemente squilibrato può indurre gli algoritmi interessati a sovraadattare la classe minoritaria, portando ad un aumento dell’errore di generalizzazione. L’effetto può essere una performance migliore sul set di dati di addestramento, ma una performance peggiore sul set di dati di test.
… il sovracampionamento casuale può aumentare la probabilità che si verifichi l’overfitting, poiché crea copie esatte degli esempi della classe minoritaria. In questo modo, un classificatore simbolico, ad esempio, potrebbe costruire regole che sono apparentemente accurate, ma in realtà coprono un esempio replicato.
– Page 83, Learning from Imbalanced Data Sets, 2018.
Come tale, per ottenere una visione dell’impatto del metodo, è una buona idea monitorare le prestazioni su entrambi i set di dati di treno e di prova dopo il sovracampionamento e confrontare i risultati con lo stesso algoritmo sul set di dati originale.
L’aumento del numero di esempi per la classe di minoranza, specialmente se la distorsione della classe era grave, può anche risultare in un marcato aumento del costo computazionale quando si adatta il modello, specialmente considerando che il modello vede sempre gli stessi esempi nel set di dati di addestramento.
… nel sovracampionamento casuale, viene aggiunto ai dati un set casuale di copie di esempi di classe minoritaria. Questo può aumentare la probabilità di overfitting, specialmente per tassi di sovracampionamento più alti. Inoltre, può diminuire le prestazioni del classificatore e aumentare lo sforzo di calcolo.
– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
Il sovracampionamento casuale può essere implementato utilizzando la classe RandomOverSampler.
La classe può essere definita e prende un argomento sampling_strategy che può essere impostato su “minority” per bilanciare automaticamente la classe minoritaria con la classe o le classi maggioritarie.
Per esempio:
1
2
3
|
…
# definire la strategia di oversampling
oversample = RandomOverSampler(sampling_strategy=’minority’)
|
Questo significa che se la classe di maggioranza ha 1.000 esempi e la classe di minoranza ne ha 100, questa strategia sovracampiona la classe di minoranza in modo che abbia 1.000 esempi.
Si può specificare un valore in virgola mobile per indicare il rapporto di esempi di maggioranza della classe di minoranza nel set di dati trasformato. Per esempio:
1
2
3
|
…
# definire la strategia di sovracampionamento
oversample = RandomOverSampler(sampling_strategy=0.5)
|
Questo assicurerebbe che la classe minoritaria sia sovracampionata per avere metà del numero di esempi della classe maggioritaria, per problemi di classificazione binaria. Questo significa che se la classe di maggioranza avesse 1.000 esempi e la classe di minoranza ne avesse 100, il dataset trasformato avrebbe 500 esempi della classe di minoranza.
La classe è come un oggetto di trasformazione di scikit-learn, in quanto viene adattata a un dataset, quindi utilizzata per generare un dataset nuovo o trasformato. A differenza delle trasformazioni di scikit-learn, cambierà il numero di esempi nel set di dati, non solo i valori (come uno scaler) o il numero di caratteristiche (come una proiezione).
Per esempio, può essere adattato e applicato in un solo passo chiamando la funzione fit_sample():
1
2
3
|
…
# adatta e applica la trasformazione
X_over, y_over = oversample.fit_resample(X, y)
|
Possiamo dimostrare questo su un semplice problema sintetico di classificazione binaria con uno squilibrio di classe 1:100.
1
2
3
|
…
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
|
L’esempio completo della definizione del dataset e dell’esecuzione di un oversampling casuale per bilanciare la distribuzione delle classi è elencato di seguito.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# esempio di sovracampionamento casuale per bilanciare la distribuzione delle classi
from collections import Counter
from sklearn.datasets import make_classification
> from imblearn.over_sampling import RandomOverSampler
# definire dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# riassumere la distribuzione delle classi
print(Counter(y))
# definire la strategia di sovracampionamento
oversample = RandomOverSampler(sampling_strategy=’minority’)
# adattare e applicare la trasformazione
X_over, y_over = oversample.fit_resample(X, y)
# riassumere la distribuzione di classe
print(Counter(y_over))
|
L’esecuzione dell’esempio crea prima il dataset, poi riassume la distribuzione delle classi. Possiamo vedere che ci sono quasi 10.000 esempi nella classe di maggioranza e 100 esempi nella classe di minoranza.
Poi viene definita la trasformazione casuale di oversample per bilanciare la classe di minoranza, poi adattata e applicata al dataset. La distribuzione di classe per il set di dati trasformato viene riportata mostrando che ora la classe di minoranza ha lo stesso numero di esempi della classe di maggioranza.
1
2
|
Conto ({0: 9900, 1: 100})
Conto ({0: 9900, 1: 9900})
|
Questa trasformazione può essere utilizzata come parte di una Pipeline per garantire che venga applicata solo al set di dati di allenamento come parte di ogni split in una validazione incrociata k-fold.
Non è possibile utilizzare una pipeline tradizionale di scikit-learn; invece, può essere utilizzata una pipeline dalla libreria imbalanced-learn. Per esempio:
1
2
3
4
|
…
# pipeline
steps =
pipeline = Pipeline(steps=steps)
|
L’esempio seguente fornisce un esempio completo di valutazione di un albero decisionale su un dataset squilibrato con una distribuzione di classi 1:100.
Il modello viene valutato utilizzando una convalida incrociata ripetuta di 10 volte con tre ripetizioni, e il sovracampionamento viene eseguito sul set di dati di addestramento all’interno di ogni piega separatamente, assicurando che non ci sia alcuna perdita di dati come potrebbe accadere se il sovracampionamento fosse eseguito prima della convalida incrociata.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# esempio di valutazione di un albero decisionale con oversampling casuale
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from imblearn.pipeline import Pipeline
da imblearn.over_sampling import RandomOverSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
# evaluate pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score: %.3f’ % score)
|
L’esecuzione dell’esempio valuta il modello di albero decisionale sul set di dati squilibrato con sovracampionamento.
Il modello scelto e la configurazione di ricampionamento sono arbitrari, progettati per fornire un modello che puoi usare per testare il sottocampionamento con il tuo dataset e algoritmo di apprendimento, piuttosto che risolvere in modo ottimale il dataset sintetico.
Nota: I tuoi risultati possono variare data la natura stocastica dell’algoritmo o della procedura di valutazione, o differenze nella precisione numerica. Considerate di eseguire l’esempio alcune volte e confrontate il risultato medio.
Si usa la strategia di sovracampionamento predefinita, che bilancia le classi minoritarie con la classe maggioritaria. Viene riportato il punteggio F1 medio per ogni piega e ogni ripetizione.
1
|
F1 Score: 0.990
|
Ora che abbiamo familiarità con il sovracampionamento, diamo un’occhiata al sottocampionamento.
Sottocampionamento casuale dei dataset squilibrati
Il sottocampionamento casuale consiste nel selezionare casualmente esempi dalla classe di maggioranza da eliminare dal dataset di allenamento.
Questo ha l’effetto di ridurre il numero di esempi nella classe di maggioranza nella versione trasformata del dataset di allenamento. Questo processo può essere ripetuto fino a quando la distribuzione di classe desiderata è raggiunto, come un numero uguale di esempi per ogni classe.
Questo approccio può essere più adatto per quei set di dati in cui vi è uno squilibrio di classe anche se un numero sufficiente di esempi nella classe di minoranza, tale un modello utile può essere adatto.
Un limite di undersampling è che gli esempi dalla classe di maggioranza vengono eliminati che può essere utile, importante, o forse critica per adattarsi un confine decisione robusta. Dato che gli esempi vengono eliminati casualmente, non c’è modo di rilevare o preservare esempi “buoni” o più ricchi di informazioni dalla classe di maggioranza.
… nel sottocampionamento casuale (potenzialmente), vengono scartate grandi quantità di dati. Questo può essere molto problematico, poiché la perdita di tali dati può rendere il confine decisionale tra le istanze di minoranza e di maggioranza più difficile da imparare, con una conseguente perdita nelle prestazioni di classificazione.
– Pagina 45, Apprendimento squilibrato: Foundations, Algorithms, and Applications, 2013
La tecnica di sottocampionamento casuale può essere implementata usando la classe RandomUnderSampler imbalanced-learn.
La classe può essere usata proprio come la classe RandomOverSampler nella sezione precedente, tranne che le strategie hanno un impatto sulla classe di maggioranza invece che sulla classe di minoranza. Per esempio, impostando l’argomento sampling_strategy a “majority” si sotto-campionerà la classe di maggioranza determinata dalla classe con il maggior numero di esempi.
1
2
3
|
…
# definire la strategia di sottocampionamento
undersample = RandomUnderSampler(sampling_strategy=’majority’)
|
Per esempio, un dataset con 1.000 esempi nella classe di maggioranza e 100 esempi nella classe di minoranza sarà sottocampionato in modo che entrambe le classi abbiano 100 esempi nel dataset di allenamento trasformato.
Possiamo anche impostare l’argomento sampling_strategy su un valore in virgola mobile che sarà una percentuale relativa alla classe di minoranza, in particolare il numero di esempi nella classe di minoranza diviso per il numero di esempi nella classe di maggioranza. Per esempio, se impostiamo sampling_strategy a 0,5 in un set di dati squilibrato con 1.000 esempi nella classe di maggioranza e 100 esempi nella classe di minoranza, allora ci saranno 200 esempi per la classe di maggioranza nel set di dati trasformato (o 100/200 = 0.5).
1
2
3
|
…
# definire la strategia del sottocampione
undersample = RandomUnderSampler(sampling_strategy=0.5)
|
Questo potrebbe essere preferito per assicurare che il set di dati risultante sia abbastanza grande da adattarsi a un modello ragionevole, e che non vengano scartate troppe informazioni utili dalla classe di maggioranza.
Nel sottocampionamento casuale, si potrebbe tentare di creare una distribuzione di classe bilanciata selezionando a caso 90 istanze della classe di maggioranza da rimuovere. Il set di dati risultante sarà quindi composto da 20 istanze: 10 istanze di classe maggioritaria (rimaste a caso) e (le originali) 10 istanze di classe minoritaria.
– Page 45, Imbalanced Learning: Foundations, Algorithms, and Applications, 2013
La trasformazione può quindi essere adattata e applicata a un set di dati in un solo passaggio chiamando la funzione fit_resample() e passando il set di dati non trasformato come argomento.
1
2
3
|
…
# adatta e applica la trasformazione
X_over, y_over = undersample.fit_resample(X, y)
|
Lo possiamo dimostrare su un set di dati con uno squilibrio di classe 1:100.
L’esempio completo è riportato di seguito.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# esempio di sottocampionamento casuale per bilanciare la distribuzione delle classi
from collections import Counter
from sklearn.datasets import make_classification
> from imblearn.under_sampling import RandomUnderSampler
# definire dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# riassumere la distribuzione delle classi
print(Counter(y))
# definire la strategia del sottocampione
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# adattare e applicare la trasformazione
X_over, y_over = undersample.fit_resample(X, y)
# riassumere la distribuzione di classe
print(Counter(y_over))
|
L’esecuzione dell’esempio crea prima il dataset e riporta la distribuzione di classe squilibrata.
La trasformazione viene adattata e applicata al dataset e viene riportata la nuova distribuzione di classe. Possiamo vedere che la classe di maggioranza è sottocampionata per avere lo stesso numero di esempi della classe di minoranza.
Il giudizio e i risultati empirici dovranno essere utilizzati per stabilire se un dataset di allenamento con soli 200 esempi sarebbe sufficiente per addestrare un modello.
1
2
|
Counter({0: 9900, 1: 100})
Counter({0: 100, 1: 100})
|
Questa trasformazione di sottocampionamento può anche essere usata in una Pipeline, come la trasformazione di sovracampionamento della sezione precedente.
Questo permette di applicare la trasformazione solo al set di dati di allenamento utilizzando schemi di valutazione come la cross-validazione k-fold, evitando qualsiasi perdita di dati nella valutazione di un modello.
1
2
3
4
|
…
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
|
Possiamo definire un esempio di adattamento di un albero decisionale su un dataset di classificazione squilibrato con la trasformazione di sottocampionamento applicata al dataset di allenamento su ogni split di una cross-validation ripetuta di 10 volte.
L’esempio completo è elencato di seguito.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# esempio di valutazione di un albero decisionale con undersampling casuale
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from imblearn.pipeline import Pipeline
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
# evaluate pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score: %.3f’ % score)
|
L’esecuzione dell’esempio valuta il modello di albero decisionale sul set di dati squilibrato con sottocampionamento.
Il modello scelto e la configurazione di ricampionamento sono arbitrari, progettati per fornire un modello che puoi usare per testare il sottocampionamento con il tuo set di dati e algoritmo di apprendimento piuttosto che risolvere in modo ottimale il set di dati sintetico.
Nota: I tuoi risultati possono variare data la natura stocastica dell’algoritmo o della procedura di valutazione, o differenze nella precisione numerica. Considerate di eseguire l’esempio alcune volte e confrontate il risultato medio.
Si usa la strategia di sottocampionamento predefinita, che bilancia le classi di maggioranza con quelle di minoranza. Viene riportato il punteggio F1 medio per ogni piega e ogni ripetizione.
1
|
F1 Score: 0.889
|
Combinazione di sovracampionamento e sottocampionamento casuale
Si possono ottenere risultati interessanti combinando sia il sovracampionamento che il sottocampionamento casuale.
Per esempio, una modesta quantità di sovracampionamento può essere applicata alla classe di minoranza per migliorare la distorsione verso questi esempi, mentre si applica anche una modesta quantità di sottocampionamento alla classe di maggioranza per ridurre la distorsione su quella classe.
Questo può risultare in un miglioramento delle prestazioni complessive rispetto all’esecuzione di una o dell’altra tecnica in modo isolato.
Per esempio, se avessimo un set di dati con una distribuzione di classe 1:100, potremmo prima applicare il sovracampionamento per aumentare il rapporto a 1:10 duplicando gli esempi dalla classe di minoranza, poi applicare il sottocampionamento per migliorare ulteriormente il rapporto a 1:2 eliminando gli esempi dalla classe di maggioranza.
Questo potrebbe essere implementato usando imbalanced-learn usando un RandomOverSampler con sampling_strategy impostato a 0.1 (10%), poi usando un RandomUnderSampler con sampling_strategy impostato a 0.5 (50%). Per esempio:
1
2
3
4
5
6
7
8
9
|
…
# definire la strategia di sovracampionamento
over = RandomOverSampler(sampling_strategy=0.1)
# adattare e applicare la trasformazione
X, y = over.fit_resample(X, y)
# definire la strategia di sottocampionamento
under = RandomUnderSampler(sampling_strategy=0.5)
# adatta e applica la trasformazione
X, y = under.fit_resample(X, y)
> |
Possiamo dimostrarlo su un dataset sintetico con una distribuzione di classi 1:100. L’esempio completo è elencato di seguito:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# esempio di combinazione di oversampling e undersampling casuale per dati squilibrati
da collections import Counter
da sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# definire la strategia di oversampling
over = RandomOverSampler(sampling_strategy=0.1)
# adattare e applicare la trasformazione
X, y = over.fit_resample(X, y)
# riassume la distribuzione di classe
print(Counter(y))
# definisce la strategia di sottocampionamento
under = RandomUnderSampler(sampling_strategy=0.5)
# adatta e applica la trasformazione
X, y = under.fit_resample(X, y)
# riassume la distribuzione di classe
print(Counter(y))
|
L’esecuzione dell’esempio crea prima il set di dati sintetico e riassume la distribuzione delle classi, mostrando una distribuzione delle classi approssimativamente 1:100.
Poi viene applicato l’oversampling, aumentando la distribuzione da circa 1:100 a circa 1:10. Infine, viene applicato il sottocampionamento, migliorando ulteriormente la distribuzione delle classi da 1:10 a circa 1:2
1
2
3
|
Counter({0: 9900, 1: 100})
Counter({0: 9900, 1: 990})
Counter({0: 1980, 1: 990})
|
Potremmo anche voler applicare questo stesso approccio ibrido quando valutiamo un modello usando la validazione incrociata k-fold.
Questo può essere ottenuto utilizzando una pipeline con una sequenza di trasformazioni e terminando con il modello che viene valutato; per esempio:
1
2
3
4
5
6
|
…
# define pipeline
over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
steps =
pipeline = Pipeline(steps=steps)
|
Possiamo dimostrarlo con un modello di albero decisionale sullo stesso dataset sintetico.
L’esempio completo è elencato di seguito.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# esempio di valutazione di un modello con oversampling e undersampling casuale
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
> over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
steps =
pipeline = Pipeline(steps=steps)
# evaluate pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score: %.3f’ % score)
|
L’esecuzione dell’esempio valuta un modello di albero decisionale utilizzando ripetute k-fold cross-validation dove il set di dati di allenamento viene trasformato, prima usando un oversampling, poi un undersampling, per ogni divisione e ripetizione eseguita. Viene riportato il punteggio F1 medio per ogni piega e ogni ripetizione.
Nota: I vostri risultati possono variare a causa della natura stocastica dell’algoritmo o della procedura di valutazione, o delle differenze nella precisione numerica. Considera di eseguire l’esempio alcune volte e confronta il risultato medio.
Il modello scelto e la configurazione di ricampionamento sono arbitrari, progettati per fornire un modello che puoi usare per testare il sottocampionamento con il tuo set di dati e algoritmo di apprendimento piuttosto che risolvere in modo ottimale il set di dati sintetico.
1
|
F1 Punteggio: 0.985
|
Altre letture
Questa sezione fornisce ulteriori risorse sull’argomento se si desidera approfondire.
Libri
- Capitolo 5 Metodi di pre-elaborazione a livello di dati, Apprendimento da set di dati squilibrati, 2018.
- Capitolo 3 Datasets squilibrati: From Sampling to Classifiers, Imbalanced Learning: Foundations, Algorithms, and Applications, 2013.
Papers
- A Study Of The Behavior Of Several Methods For Balancing Machine Learning Training Data, 2004.
- A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
API
- Imbalanced-Learn Documentation.
- imbalanced-learn, GitHub.
- imblearn.over_sampling.RandomOverSampler API.
- imblearn.pipeline.Pipeline API.
- imblearn.under_sampling.RandomUnderSampler API.
Articoli
- Sovracampionamento e sottocampionamento nell’analisi dei dati, Wikipedia.
Sommario
In questo tutorial, hai scoperto il sovracampionamento e il sottocampionamento casuale per la classificazione squilibrata
In particolare, hai imparato:
- Il ricampionamento casuale fornisce una tecnica ingenua per riequilibrare la distribuzione delle classi per un set di dati squilibrato.
- Il sovracampionamento casuale duplica gli esempi della classe minoritaria nel dataset di allenamento e può risultare in un overfitting per alcuni modelli.
- Il sottocampionamento casuale elimina gli esempi dalla classe di maggioranza e può far perdere informazioni preziose per un modello.
Hai qualche domanda?
Poni le tue domande nei commenti qui sotto e farò del mio meglio per rispondere.
Get a Handle on Imbalanced Classification!
Develop Imbalanced Learning Models in Minutes
…con poche righe di codice python
Scopri come nel mio nuovo Ebook:
Classificazione Squilibrata con Python
Fornisce tutorial di auto-apprendimento e progetti end-to-end su:
Metriche di Performance, Metodi di Sottocampionamento, SMOTE, Soglia in movimento, Calibrazione della Probabilità, Algoritmi sensibili ai costi
e molto altro…
Porta i metodi di classificazione sbilanciati ai tuoi progetti di apprendimento automatico
Guarda cosa c’è dentro