Le Macchine possono vederti

Sulla costruzione di algoritmo di riconoscimento visivo


Avrete certamente notate la mia più che settimanale assenza. Purtroppo sono stato impegnato per motivi lavorativi: per farmi perdonare, ho deciso di produrre un bell’articolo (con tanto di programma Python) su un argomento iper attuale: la Machine Vision.

Intro

La Machine Vision raccoglie tutte le tecniche algoritmiche per il riconoscimento automatico di immagini. In essenza, utilizzando queste tecniche, è possibile insegnare ad una macchina a riconoscere gli oggetti più disparati (anche in tempo reale): l’applicazione più semplice é ad esempio la lettura automatica di testi. Come quando vi arriva la multa a casa, perché siete entrati come dei fessi nella ZTL: la telecamera, partendo da una foto, ha automaticamente letto la targa del vostro carro.

La teoria

A prima vista potrebbe sembrare che algoritmi di tale portata possano essere complessi e sostanzialmente distaccati dalla teoria di Data Science. In realtà, l’algebra lineare è ancora una volta onnipresente e viene in aiuto. Difatti, i metodi di Machine Vision non differiscono di molto dai metodi di Data Science in generale. Le differenze più marcate sono in come i dati (i.e. le immagini) vengono pre-processate, prima di essere inviate ad un classificatore (e.g. una Random Forest o una Rete Neurale).

Ordunque, qual’è la logica generale da seguire? Le immagini presentano un inevitabile problema di fondo: sono “pesanti” dal punto di vista di utilizzo memoria. Infatti, anche una piccola foto in b\n di dimensioni (in pixel) 100×100 rappresenta, per un calcolatore, una matrice di 10.000 elementi. Triplicate il valore per una in RGB.

Dunque, a meno di avere a disposizione una elevata potenza di calcolo, il classificatore impiegherà un tempo non trascurabile per stimare tutti i parametri.

Per ovviare a questo problema, non si deve nutrire il modello con le immagini pure, ma bisognerà estrarre delle misure (in inglese features) che riassumano l’informazione contenuta in esse. Di queste misure ne esistono di tutti i gusti ed è sostanzialmente impossibile riassumerle tutte. Come esempio, si prendano quelle utilizzate nel programma descritto più avanti nell’articolo.

Le features diventano dunque le nostre nuove variabili. In linea generale, il nostro problema viene nuovamente ridotto al generale:

Y=f(X)

dove X è un vettore di lunghezza p contenente i valori per le p misure e  Y= \in \{0,1, . . ., k\} rappresentante le k classi di immagini.

Un semplice esempio per chiarire: costruiamo un algoritmo per permettere al computer di riconoscere il colore blu dal rosso e viceversa, utilizzando immagini di 10×10 pixels. In questo caso avremo n immagini, alcune completamente rosse e altre blu. Per abbiamo scelto 120.

Innanzitutto, importiamo le librerie che ci serviranno:

from PIL import Image
import numpy as np
import os
from os import walk
from sklearn.ensemble import RandomForestClassifier as RF
from sklearn import cross_validation

Ora doppiamo si procede con la creazione delle cartelle e delle immagini. Al tempo stesso si deve anche creare il vettore della variabile dipendente (indicato con Y).


# -------------------------------------------------------------------------------------- #
# Controlla l'esistenza di due cartelle per salvare le immagini. Se non presenti, le crea
directories = ["/foo/rosso/", "/foo/blu"]
for dir in directories:
    if not os.path.exists(dir):
        os.makedirs(dir)
# -------------------------------------------------------------------------------------- #

files = []
t = 0  # contatore
size = 10 # dimensione k, in pixel, di immagini kxk
iterations = range(0, 60) # costruisce 60 immagini
Y = []

for u in iterations:

    k1 = int(np.random.uniform(0, 100)) # Valori aleatori per introdurre variabilità nei colori
    k2 = int(np.random.uniform(0, 100))
    k3 = int(np.random.uniform(0, 100))
    k4 = int(np.random.uniform(0, 100))

    col = [["rosso/", (255, k1, k2)], ["blu/", (k3, k4, 255)]] # paletta colori

    for n,i in col:
        im = Image.new("RGB", (size, size))
        pix = im.load()

        for x in range(size):
            for y in range(size):
                pix[x, y] = i # setta il colore dei pixel
                
        filename = directory + n + str(t) + ".png"
        im.save(filename, "PNG")
        files.append(filename) # crea la lista dei filenames
        Y.append(n[0:-1]) # Crea il vettore variabile dipendente con le classi
        t += 1

Una volta creato il dataset e la variabile dipendente, si può procedere all’estrazione delle misure, che andranno a creare la nostra matrice X delle variabili indipendenti. Come già accennato, la scelta di quali features includere è notevolmente specifica al problema da risolvere. In questo semplice esempio, la distribuzione dei colori dei pixel sui 3 canali (RGB) è sufficiente.

Nota tecnica: nell’ultimo passaggio logico, se in R, sarebbe meglio vettorizzare la funzione anziché evocarla in loop. Ma usando Py, il for non crea troppi problemi.

print("Extracting features")
def extract_features(path):

    ''' Extract features from image of MetroBank Clapham Junction: colours distributions, sdev of the colours, number
    of objects and several measurements on those objects.
    Input: path - string with path of the picture
    Output: a vector '''


    # Resizing to 1000x1000, pixel distribution for each colour channel according to a fixed number of bins
    im = Image.open(path)
    im_arr = np.array(im)

    hist_R = np.histogram(im_arr[:, :, 0].flatten()) # Distibuzione Rosso
    hist_G = np.histogram(im_arr[:, :, 1].flatten()) # Distribuzione Verde
    hist_B = np.histogram(im_arr[:, :, 2].flatten()) # Distribuzione Blu

    features = np.concatenate((hist_R[0], hist_G[0], hist_B[0], hist_R[1], hist_G[1], hist_B[1]), axis=0)

    features = np.reshape(features, (1, len(features)))
    return (features)

# ------------------------------------------------------------------------------- #
# Evoca la funzione 'extract_features()' in loop. In R sarebbe meglio vettorizzare.

X = np.zeros((len(files), 63)) # ncol da modificare a seconda del'entrata
i = 0
for im in files:
    feat = extract_features(im)
    X[i, 0:len(feat[0])] = feat[0]
    i += 1
    print(i/len(files)*100, '%', ' done')

E alla fine, basta costruire un classificatore: in questo caso, data la semplicità dell’esempio, ho scelto una normale Random Forest. Facile da utilizzare avendo pochi parametri, non crea troppi problemi di overfitting e funziona straight out of the box.

# -------------------------------------------------------------------------------------------- #

# Stima del modello: Random Forest

print("Training")
# n_estimators is the number of decision trees
# max_features also known as m_try is set to the default value of the square root of the number of features
clf = RF(n_estimators=100, n_jobs=3)
scores = cross_validation.cross_val_score(clf, X, Y, cv=5, n_jobs=1) # Effettua la Cross Validation con 5 folds
print("Accuracy of all classes")
print(np.mean(scores)) # Stampa la media del punteggio di Cross Validation (accuracy in questo caso)

Se eseguite il programma, vedrete che l’accuracy media è di 1: abbiamo dunque costruito un modello perfetto per distinguere i colori di semplici immagini. L’accuracy di 1 tuttavia non è sempre un buon segno: potrebbe voler dire che il nostro modello è in over-fitting, ossia è troppo adattato ai dati osservati ma non è generalizzabile. In questo caso però non rischiamo di cadere in questo problema poiché il training set é molto semplice e praticamente privo di rumore.

Enjoy!

Post-Verità e la casualità dell’esistenza

O anche: ‘La Statistica è morta. Lunga vita alla Statistica!’


I recenti sviluppi politici mondiali hanno sicuramente confuso i più riguardo cosa sia cambiato nella mente dell’elettorato, sul perché idee apparentemente irrazionali1 e populiste abbiano avuto il sopravvento. L’evento più lampante (se non folkloristico) è stata l’esclamazione di Gove, un politico sostenitore della Brexit:

Britain has had enough of experts

Questa frase, oltre ad avere un significato filosofico profondo, ha anche dei risvolti sinificativi a livello statistico, perché riflette la sfiducia del cittadino contemporaneo nella misurazione quantitativa dello realtà, ossia la Statistica.

Un recente articolo apparso sul Guardian ha per l’appunto affrontato questo tema, che risulta essere epocale, tanto da aver generato il neologismo di post-verità.

Uno studio di Marketplace ha rilevato come il 47.5% dell’elettorato Trump e il 25% del totale “non crede ai dati economici ufficiali pubblicati dal governo federale”.

Risultati studio Marketplace sull’elettorato americano

Allo stesso modo, in un altro studio YouGov/Uni Cambridge, il 55% dei rispondenti crede che “il governo stia nascondendo il numero reale di immigrati viventi nel paese”.

Pare dunque ovvio che il pubblico occidentale non creda più all’oggettività della misurazione e al metodo scientifico della Statistica. Non solo, sembra anche, come risulta dalle parole di Gove, che tale oggettività risulti arrogante e debba essere combattuta; ecco dunque che gli unici argomenti che contano sono solo soggettivi e altamente personalizzati.

Un esempio? Un report del think-tank BritishFuture ha dimostrato come le persone siano emotivamente colpite da storie personali e struggenti di immigrati; al contrario, i “freddi” dati generano l’effetto diametralmente opposto, soprattutto se dimostrano l’influenza positiva degli immigrati sull’economia. La motivazione? Le persone assumono automaticamente che siano dati contraffatti.

Si potrebbe discutere per ore sulle motivazioni profonde di questa ostilità verso i dati statistici ufficiali (una mia spiegazione personale e ‘a pelle’ è che il bias di conferma sia più forte di quanto pensiamo), ma forse questa non è la sede più adatta.

Tuttavia, voglio sottoporci ad un esperimento mentale riguardo le implicazioni statistiche di questo fenomeno: e se avessero ragione? Ossia, se i dati fossero davvero non rappresentativi della realtà?

Questa domanda fa riflettere in maniera profonda sulla natura dei dati statistici: essi sono infatti nati per riassumere la stocasticità del mondo in maniera oggettiva ed inequivocabile. Esistono proprio per demolire la diversità e riassumerla in una piccola panoplia di numeri in modo tale da ‘rendere’ la realtà più semplice ed interpretabile dalle nostre menti limitate. Il problema però, è che seppur la nostra rappresentazione del mondo è ora semplice, il mondo rimane complesso, qualsiasi modello tu voglia usare. Esempio lampante in statistica economica: il GDP misura davvero la produzione di un paese? A che geografia è meglio produrlo? Nazionale? Regionale? Che cosa vogliamo contarci dentro: produzione metallurgica? Prostituzione? E i lavori domestici?

Ecco dunque l’insegnamento centrale della Statistica, che a mio avviso dovrebbe essere insegnato prima ancora dei numeri aleatori:

la Statistica è un compromesso tra il comprendere e il descrivere.

Più la descrizione è dettagliata, meno è comprensibile, e vice versa. Non a caso esistono misure come R2 o la Devianza, proprio per aiutarci a scegliere un livello di questo compromesso. Ma ancora: sono di nuovo misure, usate per misurare altre misure. Sta al Data Scientist, allo Statistico l’onere di scegliere, di valutare tutte queste misure, perché da soli i numeri non vogliono dire nulla: la magia sta tutta qui, nell’esperienza dell’analista che usa una mente umana per cercar di comprendere la stocasticità dell’esistenza.

Resta solo da vedere che strada prenderanno le nuove tendenze Statistiche come la Machine Learning e la Data Science, che creano delle vere e proprie macchine automatiche: la seconda vita della Statistica; dai semplice numeri, alle macchine.

E intanto, il mondo resta comunque casuale, in barba a tutti noi.

Note

1. Seppur io faccia fatica a non esprimermi a livello politico, cerco di resistere alla brama.

La Statistica è così poetica!

Il mese scorso ad Edinburgo si è tenuta l’annuale Scottish Governement Statistical Conference. Il contenuto delle presentazioni è stato più amministrativo che tecnico: gli oratori hanno di fatto presentato la strategia Open Data e il nuovo sistema organizzativo del dipartimento statistico del governo.

In mezzo a tutta ‘sta noia però, si è anche tenuta una sfida poetica: ogni partecipante alla conferenza poteva inviare una poesia alla giuria, a patto fosse di contenuto statistico.

Orbene, come immaginerete non ho potuto esimermi dalla tentazione di diventare un Omero statistico per consegnarmi alla Gloria eterna. Ecco dunque il testo incriminato:

The Outlier legacy (or violation of Normality)

Unmodelled by LM:

Thou, be not like the Median,

but a Life of Deviance.

Ovviamente, quando morirò, qualche critico scoprirà questa poesia e scriverà pagine e pagine di interpretazione rompendo i maroni a poveri studenti liceali.

Oppure no.

Sul futuro della Data Science

La Data Science e l’Intelligenza Artificiale sono sempre più vicine. tenetevi pronti.

Nell’ultima decade, i Data Scientist si sono focalizzati soprattutto sull’analisi di dati provenienti da web; difatti, tra il web 1.0 e il web 2.0 gli analisti si accorsero dell’enorme mole di dati disponibile a costo nullo che emergeva dal www. Questa mole di dati noscondeva inoltre un impressionate valore inutilizzato, pronto per essere raccolto con metodi statistici e visivi.

Azzarderei oltretutto ad affermare che, senza questa fase di ‘dati web’, la Data Science non sarebbe mai diventata così figa e di moda come ora. Infatti, durante questi anni sono stati costruiti algoritmi fantastici per comprendere il Web ed automatizzare il maggior numero possibile di operazioni: ormai i frutti più bassi dell’albero sono stati raccolti. L’innovazione contemporanea nella Data Science sul web si basa sopratutto sull’ottimizzazione di tali algoritmi e sull’aggiustamento di particolari (e possiamo dire, marginali) aspetti tecnici.

Quale sarà dunque il futuro della Data Science?

La sorgente di dati del Web, inaridendosi di grandi opportunità di innovazione, lascierà spazio a nuove fonti di dati. Ritengo che questo spazio sarà riempito da dati di origine fisica, ossia dati da sensori misuranti l’ambiente in cui l’Uomo interagisce ogni giorno. Pensiamo, ad esempio, alle enormi opportunità di analisi ed automazione che scaturiranno dall’Internet delle cose. Oppure dal vasto mondo di sensori medici: difatti, uno dei campi che nel futuro sarà maggiormente coinvolto dalla marea statistica, sarà proprio la Medicina (Wired sembra essere d’accordo).

Ritengo dunque che nella prossima decade, la sfida più eccitante per i Data Scientist sarà quella di creare ecosistemi e algoritmi partendo da dati di sensori: si genererà tutta una nuova serie di domande e necessità sia hardware che software.

Insomma, automazione sarà una delle parole chiave per il futuro prossimo della materia.

I fantastici Big Data e dove trovarli

Data Science non è l’unico nuovo termine germogliato nel mondo della statistica. In particolare, il primo premio per uso erroneo di queste nuove parole va ai famigerati Big Data.
Il caro lettore avrà sicuramente già sentito o letto a riguardo e ciò che avrà potuto capire sarà letteralmente inutile: descrizioni corrette del termine sono molto rare dato che è nella natura umana riempirsi la bocca con termini di cui non si capisce un belino (il caro vecchio dialetto ligure).

Ora, cosa sono i Big Data e come si definiscono? Al contrario di ciò che i profani pontificano, questo nome non definisce assolutamente un grande dataset: la dimensione notevole (quantificata in bytes e multipli) è una condizione necessaria ma non sufficiente.

Definizione

Il termine nacque nei primi anni 2000 quando il data scientist Douglas Laney formalizzò i Big Data usando le famose 4 V:

  • Volume
  • Variety (Varietà)
  • Velocity (Velocità)
  • Veracity (Veracità)

Analizzandole singolarmente:

  • Volume indica una grande dimensione del dataset in termini di bytes. Ovviamente, non esiste un valore univoco che faccia da spartiacque. Tuttavia, come linea di massima, si considerano Big Data volumi nell’ordine dei Tb e multipli.
  • Variety si riferisce alla forma di questi dati, che è molto varia: da dati numerici e strutturati (ossia ben organizzati e analizzabili dalla macchina), a stringhe di testo o video.
  • Velocity caratterizza i Big Data in quanto un dataset degno di questo aggettivo deve essere live, ossia ricevere continuamente dati, o comunque aggiornato ogni breve lasso di tempo.
  • Veracity indica invece l’accuratezza dei dati, ossia quanto questi dati siano affidabili nel misurare un certo evento/processo, che per i Big Data è generalmente molto bassa.

Come sarà dunque chiaro, per essere definito Big Data, un dataset deve essere dinamico, di enormi dimensioni, contenente dati in diversi formati e di una qualità dubbia.

Dove trovarli

Ovviamente, dataset di questo tipo sono molto rari; non tanto a causa della loro natura ma a causa delle difficoltà che insorgono nella loro gestione e raccolta. Infatti, per poter trarre vantaggio dai Big Data, sono necessarie particolari architetture di calcolo e conservazione (come Hadoop o pacchetti di parallel computing in R) che solo organizzazioni con notevoli risorse possono disporre. Inoltre, i Data Scientist addetti a Big Data devono sviluppare capacità tecniche specifiche per la gestione di tali dati.

L’industria in cui i Big Data regnano sovrani è quella delle Telecomunicazioni: ogni scambio di dati tra dispositivi genera una grande quantità di metadati (quanto è durato lo scambio, posizione geografica degli interlocutori, che tipo di scambio etc.) che vengono naturalmente salvati e analizzati dai provider per generare informazioni e prendere decisioni.
Anche l’industria finanziaria fa un uso sostanziale dei Big Data: la borsa di NY, solo per il comparto azionistico, genera 1 TB di dati.

Ogni. Singolo. Giorno.

Comunque, in generale, ogni industria che ha a che fare con un grande numero di transazioni giornaliere è un buon candidato per generare Big Data.

Qualità ed Affidabilità

Come detto sopra, una delle caratteristiche dei Big Data è di essere di dubbia qualità. Difatti, seppure in grandi volumi, molte volte questo tipo di dati contiene poco potenziale informativo: ossia è spesso difficile, se non impossibile, riuscire ad estrarne del significato.
Questo perché i processi che hanno generato questi dati sono logicamente semplici e molto comuni; in altre parole, una modellazione di tali eventi genererebbe risultati banali: un esempio di tale problema fu apportato dal VP for Product Innovation di Netflix durante una intervista, in cui ha definito i Big Data di tale azienda come 99% fatto di spazzatura. Ovvio, l’importante è riuscire a trovare il diamante dell’1%.

Ma che diavolo è ‘sta Data Science?

Data Science non è una nuova scienza. È una nuova prospettiva.


E fai bene a chiedertelo usando quell tono, perchè Data Science è solo un termine nato dal nulla, per chiamare in modo più moderno delle idee e delle tecniche preesistenti.

Il suo scopo è quello di prendere dei dati, di qualsiasi tipo, e cercare di tirarne fuori delle informazioni utili per prendere decisioni, descrivere il processo che ha generato quei dati o più semplicemente, fare delle predizioni. Per esempio, cercare di capire che tempo farà domani è un classico problema di Data Science.

Che cosa vuol dire davvero? Data Science si riferisce ad una statistica che fa pesante uso di tecniche informatiche, quali programmazione, calcolo, database e via discorrendo. Essa non è dunque nulla di nuovo nelle sue tecniche, ma lo è per come tali tecniche si relazionano tra loro: Data Science non è una nuova scienza. È una nuova prospettiva.

Per gli amanti dei grafici tra di noi, possiamo dunque raffigurarla in questo modo:

data-science

La sua genesi si puó far risalire al termine Data Analysis che J. Tukey (uno dei padri della moderna statistica) usó nel suo articolo The Future of Data Analysis per riferirsi ad una statistica altamente focalizzata sull’analisi dei dati reali. Quindi più empirica che matematica. Tuttavia sarà solo nel 1994 che il termine Data Science verrà utilizzato per la prima volta: ‘Data science, classification, and related methods’, ossia il titolo di una conferenza organizzata dall’International Federation of Classification Societies, presso Kobe in Giappone (dove per altro allevano dei manzi da sogno). Da allora, la sua diffusione è diventata esponenziale.

Ora il caro lettore si starà domandando quali applicazioni possa avere questa nuova “scienza”. Ebbene, ogni attività, umana e non, genera dati. Come accennato precedentemente, se applichiamo le tecniche di Data Science a questi dati possiamo generare informazione. In altre parole, interpretare tali dati in maniera umanamente comprensibile e permettere di fare delle predizioni o descrizioni. Un esempio di predizione? Tutti i cookies dei siti che visitate non sono altro che files che registrano le tue interazioni con le pagine internet. Mamma Google (o chi per essa) userà poi questi dati per costruire un bel modello statistico (magari una bella macchina a supporto vettoriale) e offrirti della meravigliosa pubblicità personalizzata. Un esempio di descrizione? Ogni ditta deve cercare di capire la sua struttura dei costi: utilizzando una regressione più o meno complicata, è possibile comprendere con precisione matematica quali fattori influenzano le spese di questa compagnia ed in che modo ciò avviene. Altri esempi di Data Science all’opera possono essere: valutazione dell’impatto ambientale di una fattoria eolica marina, capire se una transazione bancaria è illegale oppure no, predirre i prezzi delle azioni nel nostro portafoglio, permettere al computer di riconoscere automaticamente gli oggetti in un gruppo di immagini, costruire automobili a guida automatica oppure identificare ed aiutare in anticipo potenziali criminali prima che commettano il crimine.

Essenzialmente, ogni processo che genera dati può essere modellato con tecniche di Data Science: la fantasia è davvero l’ultima frontiera.

Che strumenti deve dunque saper usare il Data Scientist? Indubbiamente deve essere molto (e intendo MOLTO) esperto in statistica, che compone la parte teorica del campo. Dalla parte pratica invece sono necessarie tante (e intendo TANTE) ore di programmazione in un linguaggio con un buoni pacchetti statistici: R è la prima scelta, Python la seconda. Una volta padroneggiati questi strumenti si entra nel puro cosmo; ogni Data Scientist puó perfezionarsi come preferisce: imparare un linguaggio SQL per maneggiare databases, costruire API per lavorare nel dipartimento di Advertising di Mamma Google o disegnare accattivanti visualizzazioni di dati usando Processing.js.

Ultimamente, sono inoltre nati nuovi termini come Data Mining o Machine Learning; in essenza, essi si riferiscono tuttavia a sottoinsiemi tecnici della Data Science: (per il principiante questa differenza non vorrà dire nulla) Machine Learning indica, ad esempio, un gruppo di modelli (principalmente non parametrici) che costituiscono una sorta di ponte con il campo dell’Intelligenza Artificiale (AI); le reti neurali ne sono un esempio.


Data Science, in sintesi, non rappresenta un nuovo filone di ricerca o una nuova ‘scienza’: essa è semplicemente una nuova prospettiva su come utilizzare insieme tecniche scientifiche di campi differenti. Grazie a questo suo ampio bagalio di metodologie, le sue applicazioni sono svariate spaziando dal campo finanziario, all’agricoltura fino allo sport. Il suo focus tuttavia, è l’analisi di dati in forma matematica.