KNOWLEDGE BASE

Knowledge Base
1Backup
Acronis
Antivirus
Email
Firewall
GFI Software
Mail
Monitoring
N-Able
Sicurezza
TSPlus
Diventa Autore per CoreTech | Scopri di più

Vai al Video

Machine Learning: cos’è e a cosa serve

Da qualche anno si parla molto di Intelligenza Artificiale e Machine Learning, due termini che in un certo senso si somigliano; in questo tutorial verrà spiegato che cosa si intende per Machine Learning, concetto che potrebbe essere letteralmente esposto come “apprendimento delle macchine” ovvero macchine capaci di imparare. Per macchine si intendono sostanzialmente quelle governate dall’elettronica e dai sistemi di calcolo basati su hardware e software.

Prendiamo ad esempio un computer che deve governare un macchinario industriale: sino ad ora questo veniva fatto con un programma che, sulla base di alcuni parametri, eseguiva in maniera semplice, ripetitiva e immutata una serie di istruzioni.

Oggi si va su altri modelli, che sono quelli di computer capaci di migliorare il proprio programma sulla base di schemi di apprendimento, quali ad esempio quelli di estinzione e rinforzo, già propri della Psicologia: in breve, della capacità di imparare dagli errori, scartando i comportamenti che li determinano e sostituendo ad essi i comportamenti che forniscono esito positivo.

Personalità del computer e apprendimento

Siamo quindi su computer il cui funzionamento diventa simile a quello del cervello umano, ossia non più caratterizzati da una “personalità passiva” che prevede l’esecuzione pura e semplice di comandi, ma dotati di un certo grado di Intelligenza, tale da renderla in grado di interpretarli, di avere potere discrezionale su di essi e sul modo di eseguirli.

Uno dei passaggi verso l'ottenimento di macchine intelligenti è far sì di utilizzare strumenti per scrivere codice e algoritmi capaci di insegnare alle macchine a fare cose senza scrivere direttamente quello che devono fare.

È un po’ questo, il presupposto del machine learning.

Nel modo di scrivere codice cui siamo abituati, dobbiamo conoscere esattamente cosa il software deve fare e come la macchina dovrà comportarsi; per esempio nell’immagine seguente è proposto un piccolo script JavaScript il cui scopo è identificare la lingua in cui è scritto un testo: il codice contempla tutta una serie di comando per eseguire la ricerca di parole o parti di esse.

In questo esempio, il computer eseguirà solo ciò che gli verrà spiegato e non potrà affrontare situazioni differenti.

Nel caso del Machine Learning, invece, questa cosa si ribalta, nel senso che invece di fornire istruzioni esplicite forniamo degli esempi, nell’ottica di imitare il funzionamento del cervello umano, che impara per esperienza e quindi esempi, correggendo la propria condotta a seconda dell’esito dei comportamenti messi in atto.

Sulla base di questi, la macchina trova il modo di eseguire il compito richiesto.

L’importanza dei database composti da input e output

Il concetto di “esempio” nel mondo dei computer sono dei dati, ossia quelli che passiamo alla macchina affinché possa utilizzarli per effettuare confronti finalizzati all’apprendimento. Con riferimento all’immagine seguente, dove vediamo un foglio di Excel possiamo dire che un esempio è una riga di tale foglio o database.

In questo caso ci sono dei dati degli atleti, come nome, provenienza ecc. e in tale data base ognuna delle colonne è considerata una feature, ossia una caratteristica che costituisce una variabile di input da fornire per ottenere in output un valore che, nel caso specifico, viene chiamato target.

Banner

Quindi in questo database si spiega a una macchina come si fa qualcosa, ovvero come da un input si ricava il dato target: per esempio come si determina quante medaglie un certo atleta ha vinto a partire da un certo dato. Questo può essere fatto solo passando degli esempi, che sono contenuti, nel caso specifico, nel database.

Quello che vediamo nel foglio elettronico in alto a destra si traduce, nel mondo della geometria e della matematica, in una nuvola di punti, come esemplificato nel diagramma cartesiano a sinistra nell’immagine. Se mettiamo nello spazio ognuna delle dimensioni e ognuna delle dimensioni è una delle variabili, ogni variabile diventa un puntino all’interno di questo spazio. Per esempio X1 potrebbe essere la statura dell’atleta e X2 da quanti anni l’atleta pratica il suo sport; in questo caso il punto di intersezione dei due valori contraddistingue un atleta.

Quindi ogni record diventa un punto all’interno dello spazio cartesiano, pertanto, stabilito che ognuno dei record è un dato, ciascun dato di input può essere descritto come un punto nel diagramma cartesiano.

Il Machine Learning è una parte dell’Intelligenza Artificiale ed è quella parte dell'intelligenza artificiale che fa leva sui dati.

Per comprenderne l’attualità basta dare uno sguardo al grafico proposto nell’immagine seguente, dove vediamo lo sviluppo esponenziale dei dati disponibili che si è verificato negli ultimi 13 anni e quello che si prevede sarà lo sviluppo entro il 2010.

Abbiamo sempre più dati a disposizione e grosse potenze di calcolo a costi più bassi e quindi non a caso negli ultimi tempi è stato rispolverato il concetto di Machine Learning, che in realtà risale a molti anni fa ma che ora è possibile attuare, sia per la quantità cospicua di dati a disposizione, che costituiscono un bagaglio di esempi.

Apprendimento e catalogazione dei dati tramite Fitting

Lo scopo del machine learning è fornire a una macchina degli esempi e lasciare che essa risolva da sola il compito partendo da input e output, vale a dire che costruisca da sola la “funzione” necessaria.

Nel caso della programmazione esplicita, la funzione la scrive il programmatore, il quale fornisce istruzioni specifiche affinché a ciascun valore di input corrisponda un valore di output; quindi se:

y= f (x)

il programmatore fornisce istruzioni per realizzare la funzione f e correla ogni valore di output “y” al rispettivo input “x”.

Invece nel machine learning il programmatore fornisce alla macchina degli esempi di x e y e lascia che sia la macchina a costruire la funzione “f” che riesce a correlarle.

Nel machine learning, invece, abbiamo già a disposizione X e Y, quindi input e output, e utilizziamo delle tecniche statistiche, le quali sono sempre sono sempre i programmi scritti a mano, che però lavorano più in astratto e trovano da sole quale è “f”, ossia l’algoritmo che trasforma l’input in output.

Più che di un algoritmo, si può parlare di una figura geometrica che sta all'interno dello spazio a tante dimensioni proposto in precedenza, in cui ogni record del database (ogni esempio) è un punto.

Riprendendo tale esempio e riferendoci all’immagine seguente, costruiamo un grafico dove l’asse x è l’input “peso dell’atleta” e l’y corrisponde all’input “altezza”. Ciascun punto è un record, vale a dire corrisponde a un giocatore, identificato da peso e altezza.

Da qui vogliamo costruire un classificatore, cioè un modello di machine learning che prenda un input e lo riconduca a una certa categoria: nel caso proposto dal grafico a sinistra costruiamo una retta tracciata da punti corrispondenti a un certo rapporto altezza/peso che separa due categorie di atleti, ossia quelli idonei a diventare giocatori di basket e quelli più adatti ad essere giocatori di rugby.

Quindi questo caso il machine leraning permette di separare le due categorie in maniera automatica; naturalmente non è detto che la linea di separazione debba essere una retta, perché potrebbe essere una parabola, un’esponenziale ecc.

Inizialmente la macchina fa partire la linea di separazione a caso perché non sa alcunché; attraverso un mezzo iterativo facciamo in modo di presentare vari esempi alla macchina, cosicché questa aggiusti la pendenza della linea di separazione, cioè aggiusta i parametri che descrivono la retta, in modo che le risposte del modello siano tali da consentire alla retta di separare la nuvola di punti.

Questo è il caso dei classificatori.

Invece nel caso di regressori, che sono sempre forme di machine learning, all’interno di questo spazio di input, invece di separarli in parti con con un modello (con una retta o un polinomio) si fa in modo che la retta o il polinomoio attraversi i punti (grafico a destra nell’immagine precedente), perché nel caso del classificatore lo scopo è avere in output una categoria, ossia separare lo spazio di punti assegnando a una certa categoria quello che sta da una parte o dall'altra della retta o del modello, mentre nel caso del regressore lo scopo è ottenere in output un numero preciso, specifico. Riprendendo l’esempio dei giocatori, si può mettere in input una caratteristica come peso, altezza ecc. e chiedere in output un’altra caratteristica dell’atleta corrispondente agli input stessi (per esempio il numero di medaglie che ha vinto).

In entrambi i casi abbiamo una nuvola di punti: nel caso di classificatori questa nuvola va separata, mentre nel regressore i punti vanno interpolati. In ogni caso il modello è una forma all’interno della nuvola dei punti che separa o interpola i punti.

Dunque, un classificatore è qualcosa che partendo da dei dati di input fornisce in output una categoria, mentre un regressore fornisce in output un numero.

Da quanto esposto deriva che quello che nell’Intelligenza Artificiale viene chiamato “apprendimento” dal punto di vista geometrico prende il nome di Fitting, ossia l’adeguamento della funzione e della curva corrispondente a informazioni che vengono passate affinché la curva abbia l’andamento desiderato.

Schema e interrelazioni tra database, algoritmi e modelli

Possiamo vedere tutto il discorso fatto sinora sull’addrestramento della macchina schematizzandolo, dal punto di vista operativo, con l’immagine seguente.

Come vedete, si parte dai dati, che alimentano un algoritmo scritto per addestrare il modello; quest’ultimo attraverso una serie di test (question/answers) corregge il proprio comportamento e genera dei dati in output. La correzione avviene sulla base dell’esito delle elaborazioni effettuate, confrontando i risultati con gli esempi forniti.

Lo schema esemplifica come funziona il Machine Learning anche a livello industriale: all’algoritmo di addestramento vengono passati i dati un record alla volta, ogni record contiene sia l’input che l’output corrispondente ed è quindi un esempio.

Pian piano l’algoritmo di addestramento trova i coefficienti del modello (del polinomio) in modo che svolga il compito con meno errori possibile.

Semplificando molto, se passiamo come esempi tutta una serie di dati di input numerici i cui relativi output valgono sempre la metà, ci aspettiamo che il modello da essi trovi la relazione, la quale è evidentemente 2, ossia la funzione che correla input e output è “diviso 2”. Nella pratica le situazioni ono più complesse e lo diventano tanto più quantyo maggiore è il numero di features, ossia di variabili.

È da notare che per politica delle aziende sviluppatrici, molti strumenti che si utilizzano per lo sviluppo di applicazioni Machine Learning sono gratuiti perché vengono ripagati dal fatto che i dati raccolti e sviluppati nelle applicazioni vengono poi acquisiti (per contratto) dalle aziende stesse, che li utilizzano come esempi pronti da utilizzare per affinare sempre più i propri tool e algoritmi.

L’ecosistema open source

Per sviluppare applicazioni di Machine Learning esistono anche strumenti Open Source, perché l’argomento ha un seguito enorme e tantissimi sviluppatori e le aziende grandi ci tengono a pubblicare i loro strumenti Open Source, sia per ridare indietro qualcosa sui dati che hanno acquisito, sia per acquisire talenti e per per avere una partecipazione scientifica.

 

Ad oggi si può dire che i migliori strumenti per praticare il Machine Learning sono proprio quelli open source. Nel nostro caso vogliamo porre l’accento su Python e sulle sue librerie, per evidenziare come tra queste spicchi la libreria per Machine Learning chiamata scikit learn.

Questa è molto ben documentata e contiene anche più quello che serve per praticare il Machine Learning; ha un IDE estremamente completo e pratico.

Chiaramente l'ecosistema non è limitato a Python, ma esiste anche R, che è un linguaggio fatto apposta per la statistica e la modellazione, poi c’è Spark che è un framework per i Big Data, quindi per far girare programmi su cluster e nodi distribuiti (al suo interno trovate librerie per fare Machine Learning su grandi quantità di dati); esiste anche Tensor Flow, che è una libreria pubblica da Google per il Deep Leraning. Tra i tool troviamo anche Nime, che è un tool grafico strutturato a nodi, utile per chi non sa programmare, in quanto permette ci costruire applicazioni a oggetti.

Esempio pratico su uno script - Scrittura ed elementi dal Dataset originario alla Validazione

Per verificare quanto il modello risponda alle nostre esigenze dobbiamo ricorrere alla validazione, la quale è un modo per misurare quanto il modello che abbiamo costruito effettivamente sia in grado di capire gli esempi che gli abbiamo fornito.

Si parte quindi dal data-set originario, se ne mette da parte una porzione e la si utilizza per il test solo dopo che il modello è stato costruito e ha appreso dagli esempi restanti che gli abbiamo passato. In pratica una parte di dati di input e output per vari esempi la usiamo solo alla fine, dopo che il modello ha imparato.

Questo ci garantisce una verifica notevolmente affidabile, per il semplice fatto che non utilizzando un certo data-set di esempi e lasciando che la macchina apprenda dai restanti, quando andiamo a fare la verifica siamo certi che la macchina stessa tali esempi non li abbia mai visti e quindi se ad essi risponde come atteso, significa che l’algoritmo e il modello hanno funzionato e che il modello stesso ha raggiunto il massimo della precisione possibile con a disposizione un certo data-set. Più sono i dati contenuti nel data-set e gli esempi che la macchina “indovinerà”, maggiore ne risulterà l’affidabilità, ovvero la capacità della macchina di “generalizzare”, intendendo con tale termine la possibilità di estendere in linea generale il modello e di farlo valere alla generalità dei casi pratici e dei dati in input.

Passiamo quindi a vedere uno script in Python che implementa il Machine Learning: nella prima parte (immagine seguente) viene importata una serie di librerie e data-set; l’importazione di ciascun elemento è la riga che inizia con import.

Notate in particolare matplotlib.pyplot che ci servirà a costruire i grafici.

Ancor più attensione la merita la parte seguente, perché riguarda la libreria Python cui ci riferivamo in precedenza, vale a dire sklearn; al suo interno trovate numerosi esempi e tanti data-set già pronti per sperimentare classificatori, regressori, clustering ecc.

Nel listato proposto, l’istruzione:

from sklearn.datasets import load_boston

importa il data-set load_boston, contenente tutta una serie di informazioni inerenti alle vie di boston, che l’esempio utilizzerà per stimare il costo delle case a partire proprio dalle informazioni ivi contenute.

La successiva istruzione from sklearn.model_selection….. carica il modello della macchina, che si chiama train_test_Split ed è quello che serve a estrarre i dati, ossia a determinare i prezzi delle case.

La riga from sklearn.metrics.... carica i dati di test R2 score, che servono per misurare le prestazioni del modello dopo aver raccolto il data-set. R2 score è una misura che vale 1 quando la prestazione è perfetta e può scendere a meno infinito, quindi sotto l’1 la prestazione cala. Esistono vari tipi di metrica, quindi non necessariamente la R2 score; ognuna dev’essere considerata per quella che è.

Notare che si può anche parlare di “accuratezza” invece che di prestazione, ma tale concetto si applica solo ai classificatori.

L’ultima import del listato riguarda la regressione lineare, che è appunto un algoritmo di Machine Learning che permette di descrivere, all’nterno dello questo spazio composto dai punti che abbiamo descritto.

In realtà non si tratta di una vera e propria retta perché lo sarebbe solo all’interno di uno spazio bidimensionale; a tre dimensioni abbiamo un piano, a quattro dimensioni abbiamo un iperpiano e via di seguito. In altre parole dipende da quante colonne ha il database di riferimento, ossia dal numero di variabili (le features anzidette).

Dopo la serie di import, lo script inizia a caricare il dataset con load_boston; subito dopo vengono stampate a schermo le istruzioni sul data-set (print boston_dataset…).

Poi inizia l’estrazione delle features del database (X), che nel caso dell’esempio sono 13, quindi la nostra retta dovrà riguardare 13 dimensioni, cui aggiungiamo la quattordicesima, che è l’output (Y). Con l’istruzione successiva dividiamo i dati di training da quelli di test e mettiamo questi ultimi da parte, lasciando che il modello sia addestrato dalla prima porzione (immagine seguente).

A questo punto, con la porzione di codice:

# addestriamo il modello sui dati di training

Banner

il modello comincia ad analizzare e a cercare di replicare i dati, ovvero la funzione che li correla al costo al metro quadro delle case, e il modello inizia a costruire le proprie rette sui piani corrispondenti, fornendo i propri dati in output.

Banner

A questo punto si può avviare il test, con le istruzioni che seguono il commento:

# testiamo il modello sui dati di test

utilizzando r2_score per stabilire l’affidabilità della nostra macchina addestrata. Alla fine stampiamo a video i risultati.

In pratica con l’istruzione:

pred_test = model_predict(x_test)

passiamo i dati per il test, che sono gli esempi che non abbiamo utilizzato per addestrare il modello (x_test) e la macchina li elaborerà fornendo un output per ciascun record contenuto nel data-set di test, poi lanciamo r2_score, che farà il resto e sulla base degli output predetti dal modello (pred_test) e dei dati effettivi determinerà lo score, ossia il punteggio di affidabilità. In pratica a r2 score si passano come argomenti le risposte (Y) del modello e i dati certi; considerate che più il valore si avvicina a 1, più x-test e pred_test sono simili e viceversa.