Guida per principianti alla creazione di dataset di alta qualità per il machine learning

Guida essenziale per principianti alla creazione di dataset di alta qualità per il machine learning

Strumenti e tecniche per la pulizia dei dati, la visualizzazione, l’aumento e la generazione di dati sintetici

Dati intelligenti invece di Big Data. Questo è il postulato del paradigma “Data-Centric AI”.

Oltre a “semplicemente elaborare” i dati, gli scienziati dei dati dovrebbero sviluppare una pratica continua e sistemica di comprensione e miglioramento dei loro dataset.

Ciò ci guiderà verso una comprensione approfondita del motivo per cui i risultati delle classificazioni sono ciò che sono, quali sono in effetti le fonti di complessità del problema e come possiamo regolare i dati in modo che i classificatori possano imparare meglio il problema, aumentandone così le prestazioni.

Se sei nuovo nel machine learning, ciò potrebbe sembrare un po’ intimidatorio: “Quali sono le migliori pratiche per la costruzione di dataset di alta qualità e come metterli in pratica?”

In questo tutorial, affronteremo un semplice caso di sfruttamento del paradigma Data-Centric AI per ottenere dati di alta qualità e migliorare i risultati di classificazione del machine learning.

Seguendo il mantra di Data-Centric AI – si tratta dei dati – in nessun momento ci addentreremo nel modello stesso (onestamente, sarà un semplice albero decisionale).

Utilizzeremo il Dataset dei Diabetici Pima Indians, liberamente disponibile su Kaggle (Licenza: CC0: Public Domain). Potrai trovare tutto il codice e i materiali aggiuntivi su Data-Centric AI Community GitHub.

Cominciamo?

Step 1: Eseguire il profiling dei dati per la comprensione dei dati

Prima di iniziare a curare il nostro dataset, dobbiamo comprendere il problema che stiamo cercando di risolvere e le particolarità dei dati con cui stiamo lavorando. Comprendere a fondo le caratteristiche dei dati, la complessità del problema e il dominio del caso d’uso è uno dei primi principi di Data-Centric AI.

Ciò ci aiuterà a determinare i passaggi successivi nel nostro flusso di lavoro di machine learning.

Per quanto riguarda il profiling dei dati, ci sono diversi strumenti open-source interessanti che puoi esplorare: ho fatto una recensione di alcuni di essi, tra cui ydata-profiling, dataprep, sweetviz, autoviz e lux.

Attualmente utilizzo principalmente ydata-profiling: lo trovo uno strumento di prima classe per i professionisti dei dati che, anziché farci saltare attraverso gli anelli di pandas per ottenere il massimo delle caratteristiche e delle visualizzazioni dei nostri dati, ci consente di fare tutto in poche righe di codice.

Innanzitutto, dovrai installare ydata-profiling (meglio utilizzare un ambiente virtuale per questo – se non sai come fare, puoi vedere questo video di 2 minuti, o questo tutorial completo se non hai mai lavorato in ambienti conda prima):

In seguito, possiamo ottenere una panoramica completa dei dati salvando un report .html di tutte le caratteristiche e visualizzazioni necessarie per iniziare:

Il report dati ci permette di conoscere immediatamente le caratteristiche generali dei dati e evidenzia alcuni avvertimenti che potremmo dover prendere in considerazione:

YData Profiling Report: Trovare le statistiche di base del dataset, le visualizzazioni e gli avvertimenti sulla qualità.

Il dataset contiene 768 osservazioni e 9 variabili/caratteristiche. Mentre 8 sono numeriche, 1 è identificata come categorica (Outcome sembra essere il nostro obiettivo). Non ci sono righe duplicate e apparentemente non ci sono valori mancanti. Infine, sono stati trovati alcuni avvertimenti di Alta Correlazione tra le caratteristiche. Inoltre, diverse caratteristiche hanno un grande numero di Zeri.

Ora è tempo di fare l’investigatore dei dati. Le Alte Correlazioni sono piuttosto attese nelle caratteristiche biologiche, ma cosa dire di questi valori Zero?

Osservando alcune delle caratteristiche evidenziate (ad esempio, BMI), possiamo vedere che questi valori sono piuttosto distanti dalla distribuzione complessiva. E ricorrendo alla conoscenza di dominio, questi valori “0” sono in realtà privi di senso: un valore 0 va bene per Gravidanze, ma per BMI, Glucosio, Insulina, Pressione Sanguigna o Spessore della Pelle è invalido.

YData Profiling Report: Caratteristica BMI, indicante che i valori zero sono piuttosto

Ci rendiamo rapidamente conto di cosa stanno codificando questi zeri: dati mancanti.

Per ora risolveremo questo problema, ma un processo approfondito di EDA (Exploratory Data Analysis) può comprendere molto di più. Controlla questa Guida Essenziale all’Esplorazione dei Dati per vedere cosa altro potresti scoprire dai tuoi dati.

Passo 2: Investigazione dei Problemi di Qualità dei Dati

Ora che abbiamo scoperto che alcune colonne hanno valori zero non validi, possiamo iniziare a gestire il problema dei dati mancanti nel nostro dataset.

Molti modelli di machine learning ed estimatori di scikit-learn non supportano nativamente i valori mancanti, quindi dobbiamo gestire in qualche modo questi NaN (Not a Number) prima di alimentare il nostro dataset all’estimatore.

Prima di tutto, segniamo questi valori 0 come valori NaN:

Ora possiamo utilizzare l’imputazione dei dati per sostituire le osservazioni NaN con valori di sostituzione plausibili.

Il teorema del “pranzo gratuito” ci dice che non esiste una soluzione migliore per ogni situazione – dovremmo investigare come diverse soluzioni influenzano la complessità dei nostri dati di addestramento e determinare cosa migliora il nostro modello di machine learning al meglio. Questo è in realtà un altro principio dell’IA centrata sui dati: iterazione costante e miglioramento.

Per ora utilizzeremo un metodo molto semplice – SimpleImputer – per sostituire i valori zero con il valore medio di ciascuna caratteristica. Questo è un approccio molto ingenuo che probabilmente creerà alcune “sporgenze” indesiderate nelle nostre distribuzioni, ma l’obiettivo è semplicemente mostrare come evidenziare e imputare dati mancanti, possiamo provare approcci migliori in seguito:

Ora possiamo provare un classificatore ad albero decisionale molto semplice e vedere quale sarebbe la base dei nostri risultati di classificazione. Come nota aggiuntiva, gli alberi decisionali possono essere estesi per supportare i valori mancanti in modo naturale, tramite split sostitutivi o altri metodi. Infatti, nella documentazione di scikit-learn sembra che gli alberi decisionali abbiano il supporto integrato per i valori mancanti in alcune condizioni nella versione attuale (1.3.2). Tuttavia, poiché stavo utilizzando la versione 1.2.2, sono incappato in questo errore:

Tuttavia, anche se i valori NaN vengono gestiti internamente, addestrare i modelli con dati mancanti non è una buona pratica, in quanto metterà a repentaglio i concetti che il modello apprende da informazioni disordinate e limitate.

Ecco la matrice di confusione:

I risultati della classificazione non sono eccezionali. Tieni presente che stiamo utilizzando un semplice albero decisionale, ma comunque… c’è una differenza significativa tra la previsione per le nostre categorie target. Perché il classificatore si comporta meglio per la classe “0” rispetto alla classe “1”?

Passaggio 3: Aumentare le Classi Sottorappresentate

Se avessimo prestato attenzione al Passaggio 1 (forse lo hai già scoperto), la nostra classe target, Outcome, è sbilanciata. Forse non al punto da far scattare un avviso nelle impostazioni predefinite (la soglia predefinita è 0.5), ma abbastanza da influenzare il classificatore in favore della classe maggioritaria, trascurando quella minoritaria. Questo è evidente dalla visualizzazione dei dati presentata nel Rapporto Profiling:

YData Profiling Report: Le classi Outcome “0” e “1” non sono rappresentate in modo equo. I classificatori naturalmente saranno più tendenti verso la classe ben rappresentata, “0”, trascurando la classe “1”.

Nota che sebbene i dati mancanti possano essere causati da diversi errori durante la raccolta, la trasmissione o la memorizzazione dei dati, lo sbilanciamento delle classi può riflettere una caratteristica naturale del dominio: ad esempio, ci sono semplicemente meno pazienti diagnosticati con diabete in questo centro medico.

Tuttavia, è comunque importante agire sui dati di addestramento per garantire che il modello non trascuri i casi minoritari: infatti, è ciò che stiamo cercando di prevedere in modo più accurato.

Un falso positivo è sbagliato perché fornirà informazioni errate a un paziente sano dicendogli che ha il diabete. Ma quando vengono effettuati ulteriori test, sarà solo una “paura”.

Tuttavia, in questo caso, un falso negativo è peggio. Stiamo dicendo a un paziente con diabete che tutto va bene, che passa inosservato e la malattia progredisce.

Un modo per aumentare questi numeri è utilizzare tecniche di oversampling dei dati. L’oversampling dei dati è una tecnica popolare tra i professionisti dei dati per adattare le distribuzioni di un set di dati, ovvero il rapporto tra le classi o le categorie esistenti nei dati, mitigando così il problema dei dati sbilanciati.

E ne è solo una delle molte applicazioni interessanti e utili dei dati sintetici.

Mentre i dati sintetici possono avere diverse interpretazioni – ad esempio, “dati falsi”, “dati di prova”, “dati simulati” – qui ci riferiamo alla generazione di dati sintetici “data-driven”.

In questo senso, i dati sintetici vengono generati artificialmente e preservano le caratteristiche dei dati reali: la loro struttura, le proprietà statistiche, le dipendenze e le correlazioni.

Esistono una moltitudine di metodi e strumenti open-source per generare dati sintetici – ydata-synthetic, sdv, gretel-synthetics, nbsynthetic e synthcity sono solo alcuni con cui ho sperimentato in passato.

E ancora una volta… non esistono pasti gratis: la scelta del metodo più appropriato dipenderà inevitabilmente dall’obiettivo per cui sono necessari i dati sintetici.

Per avere una rapida comprensione di come i dati sintetici possano essere utilizzati per l’aumento, sfrutteremo il pacchetto ydata-synthetic e sperimentiamo con i loro modelli di miscuglio gaussiano.

Prima di tutto, sarà necessario installare il pacchetto:

E una volta fatto ciò, la creazione di dati sintetici è molto semplice:

Dopo aver ottenuto i nostri dati sintetici, possiamo semplicemente estrarre un sottoinsieme dei campioni della classe minoritaria appena generati campionando i dati sintetici e aggiungerli ai dati di allenamento per creare una distribuzione equilibrata (cioè 50%-50%):

Vediamo come ciò influisce sull’apprendimento del nostro albero decisionale e sui relativi risultati successivi:

E la matrice di confusione:

Nota come una così semplice modifica del nostro set di dati di allenamento abbia comportato un miglioramento delle prestazioni del nostro punteggio F del 10% e un miglioramento significativo dei risultati di sensibilità della classe minoritaria (dal 53% al 73%).

Ecco la bellezza del paradigma AI basato sui dati: senza mai toccare la parametrizzazione del nostro modello, abbiamo migliorato significativamente la qualità del nostro set di dati di allenamento con euristici molto semplici e tecniche standard – immagina cosa potremmo fare con strategie più avanzate e pipeline specializzate di preparazione dei dati!

Certo, il richiamo della classe 0 ha subito un po’ di perdita, ma in definitiva, abbiamo bisogno che questo modello sia più sensibile che specifico (cioè rilevi meglio la classe positiva rispetto a quella negativa) a causa dei vincoli particolari con cui stiamo operando: la diagnosi delle malattie – ancora una volta, un altro principio dell’AI basata sui dati: i metodi e i risultati devono essere valutati in base alle esigenze e ai vincoli del dominio.

Considerazioni Finali e Direzioni Future

In tutto questo articolo, abbiamo sperimentato il paradigma dell’AI basata sui dati con un caso d’uso molto pratico e pratico.

Abbiamo iniziato, come sempre, comprendendo i nostri dati. Abbiamo scoperto, indagato e risolto particolari problemi di qualità dei dati come dati mancanti, e migliorando i nostri dati di allenamento con dati sintetici per superare la natura sbilanciata del dominio. Ovviamente, per uno studio di caso così rapido e semplice, ci siamo concentrati su euristiche semplici per fare il lavoro, ma il lavoro di un data scientist non si ferma mai qui.

Come cambierebbero i risultati se considerassimo un metodo di imputazione diverso? Come avremmo potuto ottenere una migliore corrispondenza nella generazione dei nostri dati sintetici? Avremmo dovuto bilanciare entrambe le classi allo stesso modo o forse aumentare ancora di più la rappresentazione della classe minoritaria? Potrebbero essere state utili trasformazioni delle caratteristiche o riduzioni della dimensionalità per il risultato della classificazione? Avremmo dovuto rimuovere alcune caratteristiche di confusione?

Tutte queste domande sembrano inizialmente irrisolubili in ogni progetto di apprendimento automatico. Ma mentre iniziamo a misurare e scoprire la fonte di complessità in ciascun dataset, otteniamo migliori intuizioni su quali metodi potrebbero migliorare i risultati della classificazione (una sorta di approccio “meta-learning”). E ovviamente, i dati devono essere manipolati e migliorati in base sia alle caratteristiche dei dati che all’obiettivo finale del progetto.

Produrre una pipeline predefinita e trattare la preparazione dei dati come una soluzione “one-fits-all” è simile a volare alla cieca. Al contrario, un data scientist esperto gioca continuamente come un detective dei dati e cerca le migliori tecniche in base alle tracce che i dati ci lasciano. E di solito funziona. Dobbiamo solo tenere gli occhi ben aperti!

Spero che abbiate apprezzato il tutorial e, come sempre, feedback, domande e suggerimenti sono molto apprezzati. Fatemi sapere su quali altri argomenti vorreste che scrivessi nei commenti!

Iniziare con la Data Science? Vieni e incontraci giovedì prossimo, 23 novembre!

Se non fai ancora parte della Community Data-Centric AI, dovresti farlo. Siamo un gruppo amichevole di appassionati di dati che condividono una passione per l’apprendimento della Data Science. Organizziamo occasionalmente delle fantastiche Sessioni Code with Me e stiamo appena avviando alcuni gruppi di studio super informali.

Sarò io ad ospitare il prossimo il 23 novembre, dove parlerò di alcuni concetti di Analisi dei Dati Esplorativa .

Ci vediamo là?

Chi sono

Dottorato di ricerca, ricercatore di apprendimento automatico, educatore, sostenitore dei dati e in generale “uomo tuttofare”. Qui su VoAGI, scrivo di IA incentrata sui dati e qualità dei dati, educando le comunità di scienze dei dati e apprendimento automatico su come passare da dati imperfetti a dati intelligenti.

Relazioni con gli sviluppatori @ YData | Comunità di IA incentrata sui dati | GitHub | Google Scholar | LinkedIn