Data Analysis ed Intelligenza Artificiale in Python: interpretare dati reali con Numpy, Pandas e Scikit-Learn

Analizzare ed interpretare i dati che provengono dai processi reali è una tematica di grande interesse. Questi dati ormai fanno parte della nostra vita di tutti i giorni: pensiamo alle informazioni reperibili sui processi climatici, oppure a tutte quelle acquisite durante i processi di smart manufacturing. Tale mole di dati permette, in linea teorica, di caratterizzare qualsiasi fenomeno; tuttavia, trattarla richiede la padronanza di svariate nozioni, sia teoriche, sia pratiche. Scopriamo insieme alcune di queste tecniche, usando Python nell'analisi di uno scenario realistico.

Termini come big data ed artificial intelligence sono ormai entrati a far parte stabilmente del linguaggio di tutti i giorni. Ciò è dovuto principalmente a due fattori: da un lato, la crescente e pervasiva diffusione di sistemi per l'acquisizione dati ha permesso di creare delle repository di conoscenza praticamente sterminate; d'altra parte, l’aumento delle capacità computazionali, complice anche la diffusione dell’utilizzo del GPGPU, ha reso trattabili problemi la cui risoluzione era un tempo impossibile.

Facciamo un esempio che utilizzeremo in questo articolo come scenario applicativo. Immaginiamo di dover monitorare un’intera catena di produzione (indipendentemente dal prodotto finale che, in questo contesto, non ha importanza). Abbiamo la possibilità di acquisire dati da svariate sorgenti: potremo dislocare sensori lungo l'intera linea produttiva, ad esempio, o usare informazioni di contesto, legate all'età ed alla tipologia di ciascun macchinario. Questo insieme di dati, o dataset, può essere usato per diversi scopi: ad esempio, la manutenzione predittiva ci permette di valutare e prevedere l'insorgenza di situazioni anomale, pianificando interventi di sostituzione o riparazione prima dei guasti, con conseguente risparmio ed aumento di produttività. Inoltre, la conoscenza dello storico dei dati permette di correlare le grandezze misurate da ciascun sensore, evidenziando possibili rapporti di causa/effetto: per fare un esempio, se ad un repentino aumento della temperatura e dell’umidità della stanza seguisse una diminuzione del numero di pezzi fabbricati, potrebbe essere necessario migliorare il condizionamento della sala stessa allo scopo di mantenere le condizioni climatiche costanti.

L'implementazione di un sistema di questo tipo è un'operazione sicuramente non alla portata di tutti; tuttavia, risulta essere semplificata dagli strumenti messi a disposizione dalla comunità open source. Per iniziare, quindi, basta avere a disposizione un PC (o, in alternativa, anche il nostro fidato Raspberry Pi, qualora la mole di dati da trattare non sia enorme), una conoscenza anche elementare di Python (che potrete approfondire seguendo un tutorial come questo) e, ovviamente, conoscere i "ferri del mestiere", ovvero i concetti e gli strumenti fondamentali; scopriamoli insieme.

I ferri del mestiere

Inutile dire che, per prima cosa, dobbiamo poter creare programmi scritti in linguaggio Python. Per farlo, dovremo installarne l'interprete: possiamo trovarlo direttamente sul sito ufficiale. Nel prosieguo di questo articolo, supporremo che Python sia già stato installato ed aggiunto alle variabili di ambiente del sistema.

L'ambiente virtuale

Una volta completato il setup di Python, sarà il momento di impostare il nostro virtual environment, ovvero una sorta di "contenitore", separato dal resto del nostro sistema, all'interno del quale installare le librerie che utilizzeremo. Il motivo per cui si preferisce usare un virtual environment ad un'installazione globale delle librerie è principalmente legato alla rapida evoluzione cui è soggetto il mondo Python: molto spesso, infatti, vi sono differenze sostanziali anche tra release minori dell'interprete, che rendono incompatibili le librerie (e, conseguentemente, i programmi) scritte per le due versioni. Avere un ambiente deterministico, del quale si conoscono nel dettaglio le versioni di ogni singola libreria installata, rappresenta una sorta di "garanzia" di funzionamento dei nostri programmi: basterà, infatti, replicare esattamente la configurazione dell'ambiente virtuale, ed il gioco sarà fatto.

Per gestire i nostri ambienti virtuali, usiamo un package chiamato virtualenvwrapper. Installiamolo da shell mediante pip:

$ pip install virtualenvwrapper

Una volta completata l'installazione, creiamo un nuovo ambiente virtuale:

$ mkvirtualenv ml-python

Notiamo che ml-python è il nome dell'ambiente virtuale scelto nello scenario di esempio. Ovviamente, tale nome può variare, e potremo scegliere quello che maggiormente ci aggrada. Procediamo quindi ad attivare l'ambiente virtuale:

$ workon ml-python

Siamo adesso pronti ad installare il necessario per seguire il resto dell'articolo.

Le librerie

Le librerie che presenteremo ed useremo sono cinque tra le più usate per la data analysis in Python.

La prima, e forse più famosa, è Numpy, che rappresenta una sorta di porting di MATLAB in Python. Numpy è, nello specifico, una libreria per il calcolo algebrico e matriciale: di conseguenza, chi utilizza abitualmente MATLAB vi troverà numerose analogie, sia in termini di sintassi, sia in termini di ottimizzazione. Usare il calcolo algebrico in Numpy, infatti, risulta essere maggiormente efficiente rispetto ai cicli annidati, proprio con MATLAB (per saperne di più, vi lascio il link a questo articolo). Prevedibilmente, il tipo di dato alla base del funzionamento di Numpy è l'array, da non confondersi con il corrispondente informatico di "vettore", ma da intendersi nel senso algebrico e geometrico del termine (ovvero, come matrice). Dato che la data analysis si fonda su operazioni di tipo algebrico e matriciale, inoltre, Numpy fa da "base" per due tra i framework maggiormente utilizzati in tale ambito, ovvero Scikit-Learn (introdotto a breve) e TensorFlow.

Naturale complemento di Numpy è Pandas, libreria delegata alla gestione e lettura dei dati provenienti da sorgenti eterogenee, tra cui fogli Excel, file CSV, o anche JSON e database di tipo SQL. Pandas è estremamente flessibile e potente, e permette di organizzare i dati in strutture chiamate dataframe, manipolabili a piacimento e facilmente esportabili direttamente in array Numpy.

La terza libreria che utilizzeremo è Scikit-Learn. Nata da un progetto accademico, Scikit-Learn è un framework che implementa la maggior parte degli algoritmi di machine learning utilizzati al giorno d'oggi, offrendo un'interfaccia comune. Quest'ultimo concetto è proprio quello della programmazione orientata agli oggetti: è, infatti, possibile usare praticamente ogni algoritmo offerto da Scikit-Learn mediante il metodo fit_transform, cui verranno passati almeno due parametri, ovvero i dati sotto analisi e le label associate agli stessi.

Le ultime due librerie che useremo sono MatplotlibJupyter. La prima, assieme al suo complemento Seaborn, è necessaria per visualizzare sotto forma di grafici i risultati dei nostri esperimenti; la seconda, invece, ci offre la possibilità di usare i cosiddetti notebook, ovvero degli ambienti interattivi di utilizzo semplice ed immediato, che danno la possibilità al data analyst di scrivere ed eseguire parti di codice in maniera indipendente dalle altre.

Prima di procedere oltre, però, introduciamo alcuni concetti teorici che ci serviranno per costruire una "base comune" per il discorso.

I concetti

Il primo concetto da conoscere è quello, spesso dato per scontato, di dataset, ovvero di insieme di campioni, ciascuno dei quali caratterizzato da un certo numero di variabili o features, che descrivono il fenomeno sotto osservazione. Per semplicità, possiamo pensare ad un dataset come ad un foglio Excel: sulle righe, avremo i campioni, ossia le singole osservazioni del fenomeno, mentre sulle colonne avremo le features, ovvero i valori che caratterizzano ciascuno degli aspetti del processo. Tornando all'esempio dello smart manufacturing, ciascuna riga rappresenterà le condizioni della catena di produzione in un determinato istante, mentre ogni colonna indicherà la lettura di un dato sensore.

Quando abbiamo parlato di Scikit-Learn, abbiamo brevemente menzionato il concetto di label, o classe. La presenza o meno delle label permette di distinguere tra algoritmi di tipo supervisionato e non supervisionato. La differenza è, almeno in linea di massima, abbastanza semplice: gli algoritmi di tipo supervisionato necessitano di una conoscenza aprioristica della classe di appartenenza di ciascun campione nel dataset di esempio, mentre quelli di tipo non supervisionato, ovviamente, non ne hanno bisogno. In termini pratici, per usare un algoritmo supervisionato è necessario che un esperto di dominio stabilisca la classe di appartenenza di ciascun campione: nel caso di un processo di smart manufacturing, l'esperto potrebbe determinare se l'insieme di letture in un certo istante di tempo rappresenta una situazione anomala o meno, associando, quindi, una tra due possibili classi al singolo campione. Questo, ovviamente, non è necessario per gli algoritmi non supervisionati.

E' poi necessario sottolineare l'esistenza di un'ulteriore distinzione tra processi, ovvero quella che separa quelli inerenti i dati indipendenti ed identicamente distribuiti (IID) dalle serie temporali. In questo caso, la differenza è legata alla natura del fenomeno sotto osservazione: i campioni di un processo IID sono indipendenti gli uni dagli altri, mentre nelle serie temporali ciascun campione dipende da una combinazione (lineare o meno) dei valori assunti dal processo negli istanti temporali precedenti.

Passiamo ai fatti!

Dopo aver introdotto le necessarie nozioni teoriche e pratiche, passiamo all'azione usando un dataset adatto a descrivere il nostro caso di esempio. Questo dataset è SECOM, acronimo che sta per SEmiCOnductor Manufacturing, dataset contenente i valori letti da un insieme di sensori durante il monitoraggio di un processo manifatturiero di semiconduttori. Nel dataset, che è possibile scaricare da diverse sorgenti (come ad esempio Kaggle) sono presenti 590 variabili, ciascuna delle quali rappresentativa della lettura di un singolo sensore in un determinato istante di tempo; il dataset contiene inoltre delle label, che contraddistinguono i guasti e le anomalie dalle situazioni di funzionamento corretto del sistema.

Una volta scaricato il dataset, passiamo ad installare le librerie menzionate in precedenza. Da riga di comando, digitiamo:

$ pip install numpy pandas scikit-learn matplotlib seaborn jupyter

Installate le librerie, vediamo come impostare una semplice pipeline per la data analysis.

Il primo notebook

Il primo passo è creare un nuovo notebook. Dalla riga di comando, lanciamo Jupyter mediante la seguente istruzione:

$ jupyter-notebook

Si aprirà una schermata simile a quella mostrata in Figura 1.

Figura 1. La schermata iniziale per la gestione dei notebook in Jupyter

Creiamo un notebook selezionando New > Python 3. Si aprirà una nuova scheda nel nostro browser, con il notebook appena creato. Prendiamoci il tempo necessario a familiarizzare con l'interfaccia, mostrata in Figura 2, che ricorda (molto vagamente) una riga di comando interattiva, dotata di un menu superiore e diverse opzioni.

Figura 2. Un notebook vuoto

La prima cosa che salta all'occhio è la cosiddetta cella, ovvero una delle "parti" in cui risulta essere suddiviso il nostro script. L'esecuzione delle singole celle è delegata al pulsante Run, ed è relativamente indipendente da quella delle altre (bisogna tenere a mente che vale sempre il concetto di ambito delle variabili).

I tre pulsanti immediatamente a destra del pulsante Run permettono rispettivamente di interrompere, riavviare e resettare il kernel, ovvero l'istanza che Jupyter associa al nostro notebook. In particolare, riavviare l'istanza potrebbe essere necessario per reimpostare le variabili locali e globali associate allo script, operazione estremamente utile quando si sta sperimentando con nuovi metodi e librerie.

Altra opzione interessante è quella che permette di selezionare il tipo di cella, scegliendo tra Code (ovvero codice Python), Markdown (utile ad inserire commenti e descrizione nel formato usato, ad esempio, per i README di GitHub), Raw NBContent (che permette di inserire testo semplice) ed Heading (che offre uno shortcut per inserire i titoli).

Import e visualizzazione dei dati

Una volta acquisita familiarità con l'interfaccia, passiamo ad implementare il nostro script. Importiamo quindi le librerie ed i moduli che utilizzeremo:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from ipywidgets import interact
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.utils import resample

Tra le precedenti, è interessante sottolineare l'istruzione %matplotlib inline, utile a visualizzare in maniera corretta i grafici prodotti da Matplotlib. [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3951 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend