• Home
  • Chi sono
  • Risorse
  • Contatti
  • Approfondimenti
  • Cerca nel sito

Lorenzo Govoni

Business e Tecnologia

  • Big Data
  • Business
  • Excel
  • Intelligenza Artificiale

2 semplici esempi di pipeline nel machine learning

pipeline


Nella maggior parte dei progetti di machine learning è improbabile che i dati con cui devi lavorare siano nel formato ideale per produrre il modello con le migliori prestazioni.

Spesso infatti ci sono una serie di passaggi come la codifica di variabili categoriche, il ridimensionamento delle funzionalità e la normalizzazione che devono essere eseguiti.

Scikit-learn ha incorporato delle funzioni per la maggior parte di queste trasformazioni di uso comune nel suo pacchetto di preelaborazione.

Tuttavia, in un tipico flusso di lavoro di apprendimento automatico dovrai applicare tutte queste trasformazioni almeno due volte. Una volta durante l’addestramento del modello e di nuovo su tutti i nuovi dati su cui si desidera prevedere.

Per ovviare a questo problema è possibile avvalersi di una pipeline. Vediamo meglio di che si tratta.

 

Che cos’è una pipeline?

Una pipeline rappresenta uno strumento mediante il quale è possibile descrivere o modellare il processo di attività di machine learning per semplificare la scrittura di codice, l’estrazione di dati, la creazione di modelli di addestramento e di ottimizzazione.

Si prefigge l’obiettivo di concatenare in sequenza oggetti detti trasformatori con uno stimatore finale in modo tale da poterli utilizzare come una singola unità.

I primi effettuano un qualche tipo di trasformazione sui dati con i metodi fit() e transform(), mentre il secondo permette di prevedere un qualche valore utilizzando i dati di input (col metodo predict()) e non ha il metodo transform().

Nella classe pipeline di Scikit Learn, tutte le classi al suo interno devono essere trasformatori, fuorché l’ultima che deve essere uno stimatore.

Vediamo subito un esempio.

 

Scelta del dataset

Per vedere l’esempio di creazione di una pipeline si è scelto un problema di classificazione di piccole dimensioni (l’heart disease dataset, che puoi scaricare qua), formato da 303 righe e 14 colonne.

Il problema riguarda la previsione di malattie al cuore in base a dei parametri di seguito definiti:

  • Age: anni del paziente;
  • Sex: genere del paziente;
  • CP (Chest Pain): tipo di dolore toracico (4 valori);
  • Trestbps: pressione sanguigna a riposo;
  • chol: colesterolo sierico in mg / dl;
  • fbs: glicemia a digiuno> 120 mg / dl (1 = vero, 0 = falso);
  • restecg: risultati elettrocardiografici a riposo (valori 0,1,2);
  • thalach: frequenza cardiaca massima raggiunta;
  • exang: angina indotta dall’esercizio (1 = si, 0 = no);
  • oldpeak: depressione ST indotta dall’esercizio relativo al riposo;
  • slope: un criterio per la diagnosi di patologie coronariche;
  • ca: numero di vasi principali (0-3) colorati mediante fluoroscopia;
  • thal: 3 = normale; 6 = difetto fisso; 7 = difetto reversibile.

Si vuole prevedere, in base ai dati forniti se una persona ha malattie cardiache (classe 1) oppure no (classe 0). Quest’ultimo valore è rappresentato dalla colonna target, la quattordicesima.

Importare le librerie

Importiamo le librerie necessarie all’esecuzione dell’algoritmo:

 

Tra di esse abbiamo:

  • Pandas: la libreria fondamentale per eseguire l’analisi dei dati e importare i set di dati;
  • PCA: lo stimatore PCA di Scikit-learn, per eseguire l’analisi delle componenti principali;
  • SelectKBest: in base a una funzione (f_classif di default) che gli viene passata, valuta tutte le funzionalità e tiene le migliori k che superano il test-f;
  • Pipeline: La classe che consente di inserire più processi in un unico stimatore di apprendimento;
  • StandardScaler: la classe che permette di standardizzare i dati di allenamento e di test per renderli uniformi e confrontabili tra di loro;
  • Train_test_split: per suddividere il dataset in set di addestramento e set di test;
  • Kfold e cross_val_score: per eseguire e valutare il modello di convalida incrociata kfold;
  • LogisticRegression: la classe per creare il modello di regressione logistica. Per maggiori informazioni vedi questo articolo.
  • Accuracy_score: una delle metriche per valutare l’accuratezza di modelli di classificazione.

 

Importare il dataset

Carichiamo il dataset, utilizzando il metodo read_csv (siccome il file è salvato in tale formato). I due puntini stanno ad indicare che si deve indicare il percorso corretto dove è salvato il file:

Richiamiamo poi il metodo describe(), che viene utilizzato per visualizzare alcuni dettagli statistici di base come il percentile, la media, la deviazione standard, ecc. per ogni caratteristica:

Visualizziamo poi il tipo di dato di ogni caratteristica (tutti interi e un float):

Vediamo anche se abbiamo elementi mancanti con le funzioni isna() e any():

Il valore False, di fianco ad ogni caratteristica, significa che non c’è nessuna riga mancante per la colonna. Non abbiamo dati mancanti in questo piccolo dataset.

 

Train Test Split

Al fine di valutare le prestazioni del modello, dobbiamo addestrarlo su un campione di dati e testarlo su un altro. Possiamo farlo facilmente con la funzione train_test_split di Scikit-Learn. Innanzitutto, estraiamo le caratteristiche (X) e la variabile target (y) dal set di dati:

Dopodichè conserviamo il 70% del set di dati per l’addestramento e il 30% per i test:

Arrivati a questo punto, siamo pronti a creare la prima pipeline.

Esempio Pipeline 1

In genere una pipeline mette in sequenza uno o più trasformatori con uno stimatore. Quindi è possibile inserire in sequenza i metodi in sklearn che prevedono la funzione fit, per adattare il modello ai dati, e poi transform, che applicano le trasformazioni a dati nuovi (di solito il set di test).

Esempi di trasformatori sono le tecniche di preprocessamento (come ad esempio StandardScaler, che vedremo nell’esempio 2), estrazione delle caratteristiche, riduzione della dimensionalità e metodi kernel.

Per costruire una pipeline occorre concatenare un elenco di tuple. Ognuna di esse è costituita da un nome e un’istanza del trasformatore o dello stimatore.

I passaggi scelti per questa prima pipeline sono semplicemente:

  • PCA: riduzione delle caratteristiche tramite l’algoritmo Principal Component Analysis. Decidiamo di selezionare le prime 9 caratteristiche a più alta correlazione, per trovare le direzioni della massima varianza nei dati. È l’unico trasformatore della pipeline.

  • Modello di apprendimento Logistic Regression, con un massimo numero di iterazioni (max_iter) pari a 1000, è lo stimatore della pipeline.

Adattiamo i dati di addestramento alla pipeline creata e poi prevediamo un risultato dai dati di test:

L’esecuzione dell’esempio fornisce un riepilogo dell’accuratezza della pipeline sul set di dati pari all’83,52%:

 

Esempio Pipeline 2

Vediamo un secondo esempio di utilizzo di pipeline. Essa risulta composta da due trasformatori e uno stimatore:

  • Standardizzazione: utilizziamo lo StandardScaler per eseguire l’attività di preprocessamento dei dati, al fine di standardizzarli. In questo modo i valori di ciascuna funzionalità si comportano come una distribuzione normale standard con media uguale a 0 e deviazione standard uguale a 1.

  • Estrazione delle caratteristiche: attraverso la classe SelectKBest selezioniamo tramite la tecnica Anova di default (f_classif) le prime 8 caratteristiche che ottengono il test f più alto (per maggiori informazioni vedi questo articolo);

  • Modello: anche qui per semplicità viene utilizzato il modello di regressione logistica, come stimatore per classificare i malati di cuori da quelli sani.

Anziché il test train split, valutiamo la seconda pipeline con la convalida incrociata k-fold con k pari a 10. La cross_val_score, che sostituisce l’accuracy_score, ci aiuta a valutare il risultato della convalida incrociata tra la pipe2 appena creata, le caratteristiche e il target:

Come risultato visualizziamo una media dei risultati ottenuti tra le 10 iterazioni della kfold:

 

Performance della pipeline

Le pipeline sono un ottimo strumento per rendere il flusso di lavoro più facile da leggere e comprendere, nonché ridurre l’attività di programmazione, in quanto si scrive meno codice, più fluido e snello.

Va però detto che, come si può immaginare, all’aumentare del numero di step utilizzati da una pipeline ne risentono le performance.

Il numero di fasi che porterebbe alle migliori prestazioni nell’architettura della pipeline dipende dalle proprietà del carico di lavoro (in particolare il tempo di elaborazione).

Se i tempi di elaborazione delle attività sono relativamente piccoli, allora possiamo ottenere prestazioni migliori avendo un piccolo numero di fasi (o semplicemente una fase).

In caso contrario, l’uso di un numero arbitrario di fasi nella pipeline può comportare prestazioni scarse.

 

Conclusione

In questo articolo, abbiamo visto cos’è una pipeline e due semplici esempi di utilizzo per raggruppare i passaggi di preelaborazione, estrazione delle caratteristiche e modellazione in modo da poter utilizzare l’intero pacchetto come se fosse un singolo passaggio.

La pipeline consente di inserire più processi in un singolo stimatore di apprendimento e si avvale del metodo fit, predict e score proprio come un qualsiasi altro stimatore.

Certamente vale la pena utilizzare questo strumento quando vuoi automatizzare i flussi di lavoro delle attività di machine learning. Tieni presente che non creano flussi unidirezionali, piuttosto di natura ciclica che si prefiggono di migliorare i punteggi degli algoritmi di apprendimento automatico e rendere scalabile il modello.

  • L’importanza del ridimensionamento dei dati nei problemi di machine learning
    L’importanza del ridimensionamento dei dati nei…
  • Metodi di codifica di variabili categoriali: Label Encoding vs One-Hot Encoding
    Metodi di codifica di variabili categoriali: Label…
  • Feature Selection: come funziona la tecnica RFE
    Feature Selection: come funziona la tecnica RFE
  • Python e le librerie principali per il machine learning
    Python e le librerie principali per il machine learning
Share
Pin1
Share
Tweet

Intelligenza Artificiale Machine Learning, Sklearn

  • Home
  • Archivio
  • Risorse
  • Newsletter
  • Cerca nel sito

Copyright © 2021 · Lorenzo Govoni - Privacy Policy