facebook

Blog

Resta aggiornato

Vediamo insieme quali sono i tool di sviluppo più utilizzati nel Machine Learning
Machine Learning con TensorFlow, Python e… Azure!
mercoledì 12 Febbraio 2020

Il Machine Learning, al di là delle mode e delle buzzword, è in una fase di espansione continua, agevolata dalle offerte di tutte le piattaforme cloud.
Nel mio primo e secondo articolo sull’argomento, abbiamo scoperto che un programmatore può analizzare i dati attraverso strumenti ad alto livello, senza avere grosse conoscenze di statistica e di machine learning. È difficile, però, che funzioni tutto al primo colpo, ossia che dal nostro set di dati si riesca a costruire un modello che abbia un’efficienza ragionevole. Nell’ultimo articolo di questa serie, abbiamo introdotto il concetto di feature crossing che ci spinge a ritornare alla fase di manipolazione dei dati.

È questo il momento in cui gli strumenti ad alto livello mostrano i loro limiti, spingendoci a cercarne di nuovi: sono talmente sofisticati che non riusciamo a districarci nelle opzioni o nei wizard che improvvisamente cominciano a fallire (ne avevo parlato nel secondo articolo).

Quali sono i fattori che possono guidarci nella scelta di un nuovo framework a livello più basso per il machine learning e l’analisi dei dati? Secondo me, occorre abbandonare le preferenze e simpatie personali e indirizzare la scelta su strumenti sostenuti e utilizzati da una forte e numerosa community di utenti.

Python è il linguaggio di programmazione più usato nel mondo del ML. Perché? ML ridotto all’osso è: algoritmi complessi e workflow versatili.

I data scientist con Python hanno la possibilità di concentrarsi principalmente sui problemi del ML piuttosto che sugli aspetti più tecnici e architetturali di un linguaggio di programmazione. La versatilità del linguaggio consente di adottare stili diversi in base alle esigenze:

  • Imperativo
  • Funzionale
  • Object-oriented (anche se non pienamente supportato)
  • Procedurale

E poi, Python offre un ricco stack tecnologico con un gran numero di librerie nate per il ML: Keras, TensorFlow, Scikit, SciPy, Seaborn, Pandas, NumPy, etc.

Sono entrato in questo mondo, scegliendo una piattaforma chiamata Anaconda. Anaconda è una piattaforma realizzata per i data scientist e per i loro progetti collaborativi. È possibile distribuire i progetti in live notebook e modelli di ML. In definitiva, si tratta di un package manager gratuito basato su una distribuzione Python ricca di oltre 1500 pacchetti open source disponibile su Windows, macOS e Linux.

Anaconda Navigator è l’interfaccia utente desktop per lanciare le applicazioni e gestire i pacchetti, gli ambienti di esecuzione e i notebook.

Il navigator consente di creare un Environment dove ho installato le principali librerie di ML.

In questo environment, lanciamo una sessione di jupyter notebook, un’interfaccia web per la creazione ed esecuzione di notebook. La sessione ci consente di scegliere una cartella di lavoro in cui, per comodità, ho inserito il nostro dataset calcistico.

Ci troviamo di fronte a un editor di celle, al cui interno inseriremo delle istruzioni che sarà poi possibile eseguire. Le celle, inoltre, consentono di inserire testo formattato (ad esempio Markdown) per documentare e commentare il codice.

Le prime istruzioni sono importazioni di librerie che useremo in seguito.

Proviamo a caricare in memoria il dataset utilizzando la libreria pandas

L’oggetto caricato in memoria può essere rimescolato tramite il seguente codice:

football_dataframe = football_dataframe.reindex(
    np.random.permutation(football_dataframe.index))

Il risultato è il seguente:

Processiamo le nostre feature, scegliendo quelle di input e quella di output. Per fare ciò, ci occorrono due funzioni scritte in Python.

Predisponiamo quindi i sample di training e validazione (utilizzando per il primo una percentuale del 70% e il rimanente 30% per il secondo).

Ora possiamo cominciare ad utilizzare la libreria probabilmente più importante nel mondo del ML: TensorFlow.

TensorFlow è una libreria software open source che fornisce moduli sperimentati e ottimizzati, utili nella realizzazione di algoritmi per diversi tipi di compiti percettivi e di comprensione del linguaggio. Utilizzata da una cinquantina di team attivi sia in ambiti di ricerca scientifica, sia in ambiti di produzione, è alla base di dozzine di prodotti commerciali Google come il riconoscimento vocale, Gmail, Google Foto, etc. 

TensorFlow è disponibile nel nostro noteboook nella versione 2.0. Prestate attenzione a questo particolare, perché molti tutorial di ML utilizzano codice basato sulle versioni precedenti che non sono compatibili con l’ultima!

Cominciamo a utilizzare TensorFlow per definire le nostre feature in maniera appropriata. Il frammento di codice mostrato nell’immagine seguente mostra come, a partire dalla definizione di feature numeriche attraverso il metodo tf.feature_column.numeric_column(“NomeFeature”), possiamo definirne un’altra bucketized (ricordate il primo articolo?). Possiamo usare il metodo tf.feature_column_bucketized che prende in input una colonna numerica e la trasforma in una bucketized feature usando un numero di intervalli passato come secondo argomento.

Ad esempio, nel caso dell’età dei calciatori:

Lavorando su modelli lineari ad alte dimensioni, si parte spesso da una tecnica di ottimizzazione chiamata FTRL (Follow The Regularized Leader). Occorre scrivere quindi una funzione che crei un modello basato su questa tecnica di ottimizzazione. Il codice del Notebook è disponibile su GitHub: la funzione train_model è un’implementazione standard di FTRL (la trovate ad esempio sul materiale didattico di Google).

Ultimo step: la definizione delle feature-crossing. Tensor Flow offre un metodo chiamato tf_feature_column.crossed_column che accetta come input un array di bucketized feature e il numero totale di bucket.

Per esempio, nel nostro caso possiamo creare:

roles_crossed_ =
  tf.feature_column.crossed_column(
  set([bucketized_goalkeeper, bucketized_defender, bucketized_midfield, bucketized_forward, bucketized_age] ), hash_bucket_size=112)

A questo punto, dobbiamo solo accendere la macchina scegliendo accuratamente i parametri, in base alle proprie possibilità di calcolo.

Il notebook che abbiamo scritto può essere caricato sul portale https://studio.azureml.net che abbiamo visto nel primo articolo, assieme ai nostri dati. Attenzione: è però necessario installare i pacchetti mancanti (ad esempio, come mostrato nell’immagine seguente TensorFlow) tramite il package manager pip: !pip install tensorflow. Prestate attenzione anche in questo caso alle differenti versioni dei pacchetti installabili dal cloud.

Mentre scrivevo l’articolo, Microsoft ci ha sorpreso con un annuncio che riguarda proprio Anaconda: dotnet interactive è diventato disponibile in Jupyter attraverso la piattaforma di cui abbiamo parlato.

Occorre prima installare dotnet interactive attraverso il comando:

dotnet tool install --global Microsoft.dotnet-interactive

e poi renderlo disponibile in Jupyter

dotnet interactive jupyter install

Possiamo verificare l’installazione attraverso il seguente comando:

jupyter kernelspec list

Adesso, nel momento in cui creiamo un nuovo notebook, abbiamo a disposizione i nuovi kernel:

Ecco un esempio di codice che è possibile scrivere ed eseguire:

Siamo arrivati alla fine di questa serie di articoli in cui vi ho introdotto al mondo del ML partendo dalla prospettiva di uno sviluppatore di codice. Spero di avervi fornito un po’ di consigli da poter utilizzare nelle vostre analisi dei dati. Ci sarà chi avrà apprezzato di più la CLI di ML.NET, chi invece il classico portale di Azure ML.NET e chi invece l’ecosistema basato su Python. In ogni caso, bisogna avere un’attenzione particolare alla preparazione dei dati.

Al prossimo articolo!