Vai al contenuto principale

Approfondimento sui dati sbilanciati

Scopri le tecniche per gestire un dataset sbilanciato.
Aggiornato 29 set 2026  · 14 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Considera la seguente situazione -

Stai lavorando sul tuo dataset. Crei un modello di classificazione e ottieni subito un'accuratezza del 90%. I risultati ti sembrano fantastici. Approfondisci un po' e scopri che quasi tutti i dati appartengono a una sola classe. Accidenti! I dati sbilanciati possono causare molta frustrazione.

Ti senti molto frustrato quando scopri che i tuoi dati hanno classi sbilanciate e che tutti i grandi risultati che pensavi di ottenere si rivelano una bugia. Ancora più frustrante è che i buoni libri non trattano nemmeno questo argomento in modo olistico.

Questo è un esempio di una situazione causata da un dataset sbilanciato e dei risultati frustranti che può provocare.

In questo tutorial scoprirai le tecniche che puoi usare per ottenere ottimi risultati su dataset con dati sbilanciati. In particolare, vedrai:

  • Cosa si intende per dati sbilanciati?
  • Perché i dataset sbilanciati sono un problema serio da affrontare?
  • Paradosso dell'accuratezza
  • Diverse metriche per la valutazione dei classificatori
  • Vari approcci per gestire i dati sbilanciati
  • Letture di approfondimento sull'argomento

Vediamo prima cosa sono i dati sbilanciati.

target distribution Fonte: KDNuggets

Cosa sono i dati sbilanciati?

Per dati sbilanciati si intendono in genere compiti di classificazione in cui le classi non sono rappresentate in modo equo.

Ad esempio, potresti avere un problema di classificazione binaria con 100 istanze, di cui 80 etichettate come Classe-1 e le restanti 20 come Classe-2.

Questo è essenzialmente un esempio di dataset sbilanciato, e il rapporto tra le istanze di Classe-1 e Classe-2 è 4:1.

Sia in una competizione Kaggle che in un dataset reale di test, il problema dello sbilanciamento delle classi è tra i più comuni.

La maggior parte dei problemi di classificazione nel mondo reale mostra un certo livello di sbilanciamento delle classi, che si verifica quando non ci sono abbastanza istanze di dati che corrispondono a una delle etichette di classe. Perciò è fondamentale scegliere correttamente la metrica di valutazione del tuo modello. Se non lo fai, potresti finire per regolare/ottimizzare un parametro inutile. In un contesto business-first reale, questo può portare a uno spreco totale.

Ci sono problemi in cui uno sbilanciamento di classe non è solo comune; è inevitabile. Ad esempio, nei dataset che trattano transazioni fraudolente e non fraudolente, è molto probabile che il numero di transazioni fraudolente sia molto inferiore rispetto a quello delle non fraudolente. Ed è qui che nasce il problema. Vedrai perché.

Perché i dataset sbilanciati sono un problema serio da affrontare?

Sebbene molti algoritmi di machine learning (sia deep che statistici) abbiano mostrato grande successo in molte applicazioni reali, il problema dell'apprendimento da dati sbilanciati non è ancora allo stato dell'arte. Spesso, questo apprendimento da dati sbilanciati è chiamato Imbalanced learning.

Di seguito i principali problemi dell'imbalanced learning:

  • Quando il dataset ha dati sotto-rappresentati, la distribuzione delle classi inizia a essere distorta.
  • A causa delle caratteristiche intrinsecamente complesse del dataset, imparare da tali dati richiede nuove comprensioni, nuovi approcci, nuovi principi e nuovi strumenti per trasformare i dati. Inoltre, questo non può in alcun modo garantire una soluzione efficiente al tuo problema di business. Nei casi peggiori, può rivelarsi uno spreco completo senza nulla da riutilizzare.

A questo punto una domanda ovvia che ti sarà venuta in mente è: perché, nell'era di GPU e TPU, gli algoritmi di machine learning falliscono nell'affrontare in modo efficiente i dati sbilanciati? Domanda più che legittima, e ora ne troverai la risposta.

La valutazione degli algoritmi di machine learning ha molto a che fare con il motivo per cui un particolare algoritmo non performa quando viene alimentato con dati sbilanciati.

"È il caso in cui le misure di accuratezza raccontano che hai un'eccellente accuratezza (ad esempio 90%), ma tale accuratezza riflette solo la distribuzione sottostante delle classi." - Machine Learning Mastery

Supponi di avere un dataset (associato a un compito di classificazione) con due classi in rapporto di distribuzione 9:1. Il numero totale di istanze presenti nel dataset è 1000, e le etichette di classe sono Classe-1 e Classe-2. Pertanto, rispetto al rapporto di distribuzione, il numero di istanze che corrispondono a Classe-1 è 900 mentre quelle di Classe-2 sono 100. Ora applichi un classificatore standard (per esempio la Regressione Logistica) e ne misuri le prestazioni in termini di accuratezza di classificazione, che indica il numero di istanze classificate correttamente dal classificatore. Ora, guarda più da vicino e pensa a fondo.

Il tuo modello di Regressione Logistica non deve essere molto complicato per classificare tutte le 1000 istanze come Classe-1. In tal caso, otterresti un'accuratezza di classificazione del 90%, che però non basta davvero a testare la qualità effettiva del classificatore. Chiaramente, ti serve un'altra metrica per valutare le prestazioni del sistema. Lo vedrai tra un attimo. Il fenomeno che hai appena visto si chiama Paradosso dell'accuratezza.

Approcci per gestire i dati sbilanciati:

Inizierai questa sezione studiando alcune metriche diverse dalla accuratezza di classificazione per giudicare davvero un classificatore quando si confronta con dati sbilanciati.

Per prima cosa, definiamo quattro termini fondamentali:

  • Vero Positivo (TP) – Un'istanza che è positiva ed è classificata correttamente come positiva
  • Vero Negativo (TN) – Un'istanza che è negativa ed è classificata correttamente come negativa
  • Falso Positivo (FP) – Un'istanza che è negativa ma viene classificata erroneamente come positiva
  • Falso Negativo (FN) – Un'istanza che è positiva ma viene classificata erroneamente come negativa

L'immagine seguente giustifica da sola i termini di cui sopra:

terms table Fonte

Ora, supponi di aver addestrato un altro classificatore sul dataset di esempio che hai appena visto e stavolta hai applicato una Random Forest. E hai ottenuto un'accuratezza di classificazione del 70%. Ora che conosci Tassi di Veri Positivi e Negativi e Tassi di Falsi Positivi e Negativi, indagherai le prestazioni della precedente Regressione Logistica e della Random Forest in modo un po' più dettagliato.

Supponi di aver ottenuto i seguenti Tassi di Veri Positivi e Negativi e Tassi di Falsi Positivi e Negativi per la Regressione Logistica:

logistic regression rates

Ora, supponi che i Tassi di Veri Positivi e Negativi e i Tassi di Falsi Positivi e Negativi per la Random Forest siano i seguenti:

random forest rates

Guarda il numero di classi negative correttamente previste (Veri Negativi) da entrambi i classificatori. Poiché stai lavorando con un dataset sbilanciato, devi dare la massima priorità a questo numero (perché la Classe-1 è dominante nel dataset). Quindi, considerando ciò, la Random Forest supera facilmente la Regressione Logistica.

Ora sei in un'ottima posizione per studiare gli approcci per combattere il problema dei dataset sbilanciati.

(Ricorda, la rappresentazione sopra è conosciuta come Matrice di confusione.)

Di seguito due termini derivati dalla matrice di confusione e molto usati quando valuti un classificatore.

Precision: la precision è il numero di Veri Positivi diviso per la somma di Veri Positivi e Falsi Positivi. In altre parole, è il numero di previsioni positive diviso per il numero totale di valori della classe positiva previsti. È anche chiamata Valore Predittivo Positivo (PPV).

La precision può essere vista come una misura dell'esattezza di un classificatore. Una bassa precision può anche indicare un gran numero di Falsi Positivi.

Recall: il recall è il numero di Veri Positivi diviso per la somma di Veri Positivi e Falsi Negativi. In altre parole è il numero di previsioni positive diviso per il numero di valori della classe positiva nei dati di test. È anche chiamato Sensibilità o Tasso di Veri Positivi.

Il recall può essere visto come una misura della completezza di un classificatore. Un basso recall indica molti Falsi Negativi.

Altre metriche utili in questo contesto:

Prima di iniziare a studiare gli approcci per affrontare il problema dello sbilanciamento delle classi, vediamo un esempio molto reale in cui scegliere solo l'accuratezza di classificazione come metrica di valutazione può produrre risultati disastrosi. (Lo fai per assicurarti di non considerare solo l'accuratezza di classificazione quando alleni il tuo prossimo classificatore.)

Il dataset sul cancro al seno è un dataset standard di machine learning. Contiene 9 attributi che descrivono 286 donne che hanno sofferto e sono sopravvissute al cancro al seno e indica se il cancro al seno è recidivato entro 5 anni. Indaghiamo questo dataset per farti percepire concretamente il problema.

Il dataset riguarda un problema di classificazione binaria. Delle 286 donne, 201 non hanno avuto una recidiva di cancro al seno, mentre le restanti 85 sì.

Esploriamo il dataset in modo più visivo.

import numpy as np
import pandas as pd

# Load the dataset into a pandas dataframe
data = pd.read_csv("breast-cancer.data",header=None)

# See the data
print(data.head(10))
                      0      1        2      3    4   5  6      7          8  \
0  no-recurrence-events  30-39  premeno  30-34  0-2  no  3   left   left_low   
1  no-recurrence-events  40-49  premeno  20-24  0-2  no  2  right   right_up   
2  no-recurrence-events  40-49  premeno  20-24  0-2  no  2   left   left_low   
3  no-recurrence-events  60-69     ge40  15-19  0-2  no  2  right    left_up   
4  no-recurrence-events  40-49  premeno    0-4  0-2  no  2  right  right_low   
5  no-recurrence-events  60-69     ge40  15-19  0-2  no  2   left   left_low   
6  no-recurrence-events  50-59  premeno  25-29  0-2  no  2   left   left_low   
7  no-recurrence-events  60-69     ge40  20-24  0-2  no  1   left   left_low   
8  no-recurrence-events  40-49  premeno  50-54  0-2  no  2   left   left_low   
9  no-recurrence-events  40-49  premeno  20-24  0-2  no  2  right    left_up   

    9  
0  no  
1  no  
2  no  
3  no  
4  no  
5  no  
6  no  
7  no  
8  no  
9  no  

I nomi delle colonne sono numerici perché stai usando un dataset parzialmente preprocessato. Ma se ti interessa puoi fare riferimento alla seguente immagine:

Fonte

Vediamo un grafico a barre delle distribuzioni di classe.

import matplotlib.pyplot as plt

classes = data[9].values
unique, counts = np.unique(classes, return_counts=True)

plt.bar(unique,counts)
plt.title('Class Frequency')
plt.xlabel('Class')
plt.ylabel('Frequency')
plt.show()
class frequency chart

Qui puoi vedere chiaramente lo sbilanciamento delle classi. yes indica le istanze con tumore ed è ovvio che il numero di queste istanze è minimo rispetto a quelle corrispondenti all'altra classe.

Definiamo gli eventi "No Recurrences" e "Recurrences" presenti nel dataset, il che renderà le cose ancora più chiare.

  • All No Recurrence: un modello che prevede solo l'assenza di recidiva del cancro al seno raggiungerebbe un'accuratezza di (201/286) * 100 ossia 70,28%. Questo è chiamato All No Recurrence. È un'accuratezza alta, ma un modello pessimo. Se questo modello venisse interpretato male, manderebbe a casa 85 donne pensando erroneamente che il loro cancro al seno non sarebbe recidivato (Alti Falsi Negativi).

  • All recurrence: un modello che prevede solo la recidiva del cancro al seno raggiungerebbe un'accuratezza di (85/286) * 100 ossia 29,72%. Questo è noto come All Recurrence. Questo modello non riesce a produrre una buona accuratezza e manderebbe a casa 201 donne pensando di avere una recidiva del cancro al seno, cosa non vera (Alti Falsi Positivi).

Questo concetto dovrebbe averti già acceso una scintilla. Andiamo avanti.

Bene! Ora hai ragioni sufficienti per capire perché considerare solo l'accuratezza di classificazione per valutare il tuo modello di classificazione non è una buona scelta.

Vediamo ora alcuni approcci.

Ri-campionare il dataset:

Gestire i dataset sbilanciati include varie strategie, come migliorare gli algoritmi di classificazione o bilanciare le classi nei dati di training (essenzialmente un passaggio di preprocessing) prima di fornire i dati in input all'algoritmo di machine learning. La seconda tecnica è preferita perché ha un'applicazione e un'adozione più ampie. Inoltre, il tempo necessario per migliorare un algoritmo è spesso superiore a quello per generare i campioni necessari. Ma per scopi di ricerca, entrambe sono preferite.

L'idea principale del campionamento delle classi è aumentare i campioni della classe minoritaria o ridurre quelli della classe maggioritaria. Questo per ottenere un equilibrio equo nel numero di istanze per entrambe le classi.

Possono esserci due tipi principali di campionamento:

  • Puoi aggiungere copie di istanze dalla classe minoritaria, chiamato over-sampling (o più formalmente campionamento con reinserimento), oppure
  • Puoi eliminare istanze dalla classe maggioritaria, chiamato under-sampling.

Sembra persino semplice anche dal punto di vista dell'implementazione, vero? Più avanti in questo post conoscerai una libreria dedicata al campionamento.

Under-sampling casuale:

Quando elimini casualmente istanze dalla classe maggioritaria di un dataset e le assegni alla classe minoritaria (senza colmare il vuoto creato nella classe maggioritaria), si parla di under-sampling casuale. Il vuoto che si crea nel dataset della classe maggioritaria rende il processo casuale.

Vantaggi di questo approccio:

  • Può aiutare a migliorare il tempo di esecuzione del modello e risolvere problemi di memoria riducendo il numero di campioni di training quando il set di training è enorme.

Svantaggi:

  • Può scartare informazioni utili sui dati stessi che potrebbero essere necessarie per costruire classificatori basati su regole come le Random Forest.
  • Il campione scelto tramite under-sampling casuale può essere un campione distorto. In tal caso non sarebbe una rappresentazione accurata della popolazione. Di conseguenza, può portare il classificatore a performare male su dati reali non visti.

Over-sampling casuale:

Così come l'under-sampling casuale, puoi eseguire anche l'over-sampling casuale. Ma in questo caso, senza prendere aiuto dalla classe maggioritaria, aumenti le istanze corrispondenti alla classe minoritaria replicandole fino a un certo grado. In questo caso, non diminuisci il numero di istanze assegnate alla classe maggioritaria. Mettiamo che tu abbia un dataset con 1000 istanze, dove 980 corrispondono alla classe maggioritaria e le restanti 20 alla classe minoritaria. Ora esegui l'over-sampling replicando le 20 istanze fino a 20 volte. Di conseguenza, dopo l'over-sampling il numero totale di istanze nella classe minoritaria sarà 400.

Vantaggi dell'over-sampling casuale:

  • A differenza dell'under-sampling, questo metodo non comporta perdita di informazione.

Svantaggi:

  • Aumenta la probabilità di overfitting poiché replica gli eventi della classe minoritaria.

Puoi considerare i seguenti fattori quando pensi di applicare under-sampling e over-sampling:

  • Considera l'under-sampling quando hai molti dati
  • Considera l'over-sampling quando non hai molti dati
  • Valuta schemi di campionamento casuali e non casuali (ad es. stratificati).
  • Prova rapporti diversi tra le etichette di classe (ad es., non devi puntare a un rapporto 1:1 in un problema di classificazione binaria, prova altri rapporti)

Se vuoi implementare under-sampling e over-sampling in Python, dai un'occhiata a scikit-learn-contrib.

Ora studierai il prossimo approccio per gestire i dati sbilanciati.

Prova a generare campioni sintetici:

Un modo semplice per creare campioni sintetici è campionare casualmente gli attributi dalle istanze della classe minoritaria.

Esistono algoritmi sistematici che puoi usare per generare campioni sintetici. Il più popolare è chiamato SMOTE, ovvero la Synthetic Minority Over-sampling Technique. È stato proposto nel 2002 e puoi dare un'occhiata al . L'infografica seguente ti darà un'idea chiara dei campioni sintetici:

synthetic samples

Fonte

SMOTE è un metodo di oversampling che crea esempi “sintetici” invece di fare oversampling con reinserimento. La classe minoritaria viene sovracampionata prendendo ciascun campione della classe minoritaria e introducendo esempi sintetici lungo i segmenti che uniscono uno o tutti i k vicini più prossimi della classe minoritaria. A seconda della quantità di oversampling richiesta, i vicini tra i k più prossimi vengono scelti casualmente.

Il cuore di SMOTE è la costruzione delle classi minoritarie. L'intuizione dietro l'algoritmo di costruzione è semplice. Hai già visto che l'oversampling causa overfitting e, a causa delle istanze ripetute, il confine decisionale si irrigidisce. E se potessi generare campioni simili invece di ripeterli? Nell'articolo originale su SMOTE (collegato sopra) è stato mostrato che, per un algoritmo di machine learning, queste istanze di nuova costruzione non sono copie esatte, e quindi ammorbidiscono il confine decisionale, aiutando l'algoritmo ad approssimare l'ipotesi in modo più accurato.

Tuttavia, SMOTE presenta alcuni vantaggi e svantaggi -

Vantaggi -

  • Attenua l'overfitting causato dall'oversampling casuale poiché vengono generati esempi sintetici invece di replicare istanze.
  • Nessuna perdita di informazione.
  • È semplice da implementare e interpretare.

Svantaggi -

  • Nella generazione di esempi sintetici, SMOTE non considera che i vicini possano appartenere ad altre classi. Questo può aumentare la sovrapposizione tra classi e introdurre ulteriore rumore.
  • SMOTE non è molto pratico per dati ad alta dimensionalità.

Esistono alcune varianti di SMOTE come safe-level SMOTE, border-line SMOTE, OSSLDDD-SMOTE, ecc. Se vuoi usare SMOTE e le sue varianti puoi consultare il modulo scikit-learn-contrib menzionato prima. Se vuoi saperne di più su SMOTE, dovresti leggere questi articoli questo e questo.

Passiamo all'ultimo approccio di questo tutorial.

Provare prospettive diverse:

Esistono campi di studio dedicati alla gestione dei dataset sbilanciati. Hanno i propri algoritmi, misure e terminologia.

Spesso creatività e spirito innovativo possono offrirti nuove prospettive quando affronti dati sbilanciati. Il seguente approccio può darti una spinta iniziale:

Cost-Sensitive Learning: in genere si usa la regolarizzazione (se vuoi saperne di più sulla regolarizzazione puoi leggere questo articolo di DataCamp) per penalizzare i coefficienti grandi che spesso compaiono nei Modelli Lineari Generalizzati (GLM). Sebbene questa applicazione vari da modello a modello. Per il momento consideriamo solo i GLM. Se riesci a escogitare un meccanismo che penalizzi il classificatore ogni volta che commette una misclassificazione, ciò può aiutare il classificatore a imparare l'ipotesi in modo molto più dettagliato.

Di seguito alcuni approcci che dovresti considerare:

  • Usa la K-fold Cross-Validation nel modo giusto
  • Fai ensemble di diversi dataset ricampionati
  • Ricampiona con rapporti diversi
  • Clustra la classe abbondante

Ricapitolando!

Finora ti sei fatto un'idea del concetto di dati sbilanciati e del tipo di problemi che creano nella progettazione e nello sviluppo di modelli di machine learning. Hai anche visto diversi motivi per cui è cruciale affrontare i dati sbilanciati. Dopodiché, hai studiato diversi approcci che possono aiutarti a gestire efficacemente dataset sbilanciati. L'elaborazione di dati sbilanciati è un'area di ricerca attiva e può aprirti nuovi orizzonti per considerare nuovi problemi di ricerca.

Tanti concetti essenziali in un colpo solo! Assolutamente fantastico!

Questo è tutto per questo tutorial.

Di seguito alcuni link a paper se sei molto interessato a studiare ancora di più il tema dei dati sbilanciati:

Riferimenti:

Se vuoi saperne di più sulla visualizzazione dei dati, segui il corso di DataCamp "Interactive Data Visualization with Bokeh" tenuto da Bryan Van de Ven, uno degli sviluppatori di Bokeh.

Argomenti
Machine Learning
Python
Analisi dei dati

Scopri di più sul Machine Learning

{count, plural, one {Corso} other {Corsi}}

Capire il Machine Learning

{hours} ore
312.2K
Un'introduzione all'apprendimento automatico senza bisogno di programmare.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

{count, plural, one {blog} other {blogs}}

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

{count, plural, one {blog} other {blogs}}

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

{count, plural, one {blog} other {blogs}}

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro