Il Machine Learning è divertente! — Parte 1

La guida introduttiva al Machine Learning più facile del mondo

Questo articolo è il primo di una lunga serie, se lo hai già letto puoi saltare direttamente alla parte 2, parte 3, parte 4, parte 5, parte 6, parte 7 o parte 8 cliccando i link diretti.

Hai mai sentito persone parlare di Machine Learning ma hai solo una vaga idea di quello che significa? Sei stanco di annuire mentre i tuoi colleghi o amici ne parlano? É ora di cambiare, continua a leggere!

Questa guida è per chi è curioso di saperne di più sul Machine Learning, ma non sa da dove cominciare. Immagino che ci siano un sacco di persone che hanno cercato l’argomento su Wikipedia (link in Inglese, per l’articolo in Italiano cliccate QUI), ma si sono scoraggiati e hanno rinunciano sperando di trovare qualcuno in grado di dargli spiegazioni di livello più alto. Questo è ciò che vuole fare questa guida.

L’obiettivo è quello di essere accessibile a chiunque — il che significa usare molte generalizzazioni. Ma cosa importa? Se questa guida può far diventare qualcuno più interessato al Machine Learning, la missione potrà dirsi compiuta.


Cos’è il Machine Learning?

Il Machine Learning è l’idea che ci sono generici algoritmi che possono dare informazioni interessanti su un insieme di dati senza dover scrivere alcun codice specifico sul problema. Invece di scrivere del codice, si inseriscono i dati in un algoritmo generico e l’algoritmo genera una propria logica basandosi sui dati inseriti.

Per esempio, uno di questi algoritmi è algoritmo di classificazione (Classification Algorithm). Può inserire i dati in diversi gruppi basandosi su caratteristiche comuni che è in grado di identificare in autonomia. Lo stesso algoritmo di classificazione utilizzato per riconoscere i numeri scritti a mano può anche essere usato per classificare le mail, indicando se sono spam o meno, senza dover cambiare nessuna riga di codice. É lo stesso algoritmo, ma è alimentato da Training Data differenti in modo che emergano logiche diverse di classificazione.

Questo algoritmo di Machine Learning è una scatola nera che può essere riutilizzata per tanti diversi problemi di classificazione.

Machine Learning è un termine “ombrello” che comprende molti di questi algoritmi generici.

Due tipi di Algoritmi di Machine Learning

Si può pensare di suddividere gli algoritmi di “Machine Learning” tra le due categorie principali — apprendimento supervisionato (Supervised Learning) e apprendimento non supervisionato (Unsupervised Learning). La differenza è semplice, ma molto importante.

Apprendimento Supervisionato

Diciamo che sei un agente immobiliare. La tua azienda è in crescita, e devi assumere molti nuovi agenti da formare per aiutarti. Ma c’è un problema — a te basta un’occhiata alla casa per avere una chiara idea di quanto vale, ma i tuoi nuovi assunti non hanno la tua stessa esperienza nello stimare il prezzo delle case.

Per aiutare i tuoi agenti (e forse riuscire a prenderti qualche giorno libero per andare in vacanza), decidi di scrivere una piccola applicazione in grado di stimare il valore di una casa in base alla sua zona, alla dimensione, al quartiere e a quale prezzo sono vendute le case con caratteristiche simili.

Per 3 mesi, ti annoti ogni volta che qualcuno vende una casa nella tua città e per ognuna, prendi nota dei dettagli della transazione— il numero di camere da letto, i metri quadrati, il quartiere, ecc. E soprattutto il prezzo finale di vendita:

Questo è il nostro “Training Data”

Usando questo training data, vogliamo creare un programma che riesca a stimare quanto possa valere qualsiasi altra casa in quell’area:

Vogliamo usare i training data per stimare i prezzi di altre case

Questo si chiama apprendimento supervisionato. Tu sai a quanto ogni casa è stata venduta, quindi sapendo le precedenti risposte al problema sei in grado di lavorare a ritroso e da lì capirne la logica.

Per costruire la tua applicazione, devi alimentare l’algoritmo di Machine Learning con i dati di ogni casa. L’algoritmo cercherà di capire che tipo di funzioni matematiche deve utilizzare per dare i risultati che servono.

É come avere un foglio delle risposte di un esercizio matematico dove tutti i simboli aritmetici sono cancellati:

Oh no! Uno studente disonesto ha cancellato i simboli aritmetici dal testo delle risposte del professore!

Da qui, riesci a capire di che tipo di problema di matematica si parlava sul test? Si suppone che devi “fare qualcosa” con i numeri a sinistra per ottenere la risposta sulla destra.

Nell’ apprendimento supervisionato si lascia il lavoro di risoluzione al computer. E una volta che si conosce che funzione matematica è stata necessaria per risolvere questo specifico insieme di problemi, sarà possibile rispondere a qualsiasi altro problema dello stesso tipo.

Apprendimento Non Supervisionato

Torniamo al nostro esempio originale con l’agente immobiliare. Come faresti a creare la stessa applicazione senza però sapere il prezzo di vendita di ogni casa? Anche se conosci solo la dimensione e la posizione di ogni casa, si possono produrre ottimi risultati, davvero interessanti. Questo è l’apprendimento non supervisionato.

Anche se non puoi prevedere un valore sconosciuto (come il prezzo), puoi usare il Machine Learning fare altre interessanti valutazioni

É un po’ come se qualcuno ti desse una lista di numeri su un foglio di carta e ti dicesse “io non so davvero cosa significano questi numeri, ma forse tu riesci a capire se c’è uno schema o un raggruppamento o qualcosa del genere alla base — Buon divertimento!”

Allora, cosa potresti fare con questi dati? Per cominciare, potresti avere un algoritmo che identifichi automaticamente i diversi segmenti di mercato presenti nei dati. Magari scopriresti che gli acquirenti di case nel quartiere vicino alla scuola locale sono interessati a case piccole con molte camere da letto, ma gli acquirenti di case in periferia preferiscono case con 3 camere da letto e molta più metratura. Conoscere questi diversi tipi di clienti potrebbe aiutarti a dirigere meglio il tuo lavoro di marketing.

Un’altra cosa interessante che potresti fare è identificare automaticamente eventuali valori anomali, molto diversi rispetto a tutti gli altri. Forse le case con quegli strani valori sono palazzi molto grandi e puoi cercare di concentrare i tuoi agenti commerciali su quelle aree, così da avere commissioni più alte.

L’apprendimento supervisionato è quello sul quale ci concentreremo per il resto di questo post, ma non perché l’apprendimento non supervisionato sia meno utile o interessante. Infatti, l’apprendimento non supervisionato sta diventando sempre più importante perché può essere utilizzato senza dover etichettare i dati con una risposta corretta.

Nota: Ci sono molti altri tipi (ENG) di algoritmi di Machine Learning. Ma questo è un buon punto di partenza.

Fantastico, ma davvero essere in grado di stimare il prezzo di una casa può essere considerato come “apprendimento”?

Negli esseri umani, il cervello può approcciare qualsiasi situazione e imparare come farvi fronte senza istruzioni esplicite. Se vendi case per lungo tempo, sicuramente avrai la “sensazione” sul giusto prezzo per la casa, sul modo migliore per commercializzarla, sul tipo di cliente che potrebbe essere interessato, ecc. L’obiettivo della ricerca sull’Intelligenza Artificiale Forte (Strong AI) è quello di essere in grado di replicare questa capacità nei computer.

Ad oggi, gli algoritmi di Machine Learning non sono ancora così avanzati — funzionano solo quando hanno di fronte un problema molto specifico, limitato. In questo caso, forse una definizione più appropriata di “apprendimento” sarebbe “capire un’equazione, per risolvere un problema specifico, sulla base di alcuni dati di esempio”.

Purtroppo “Automazione per Capire un’equazione che risolve un problema specifico, sulla base di alcuni dati di esempio” non è un grande bel nome. Così ci siamo ritrovati invece con il nome Machine Learning.

Naturalmente se stai leggendo questo post 50 anni nel futuro e l’algoritmo di intelligenza artificiale forte è già stato sviluppato, allora tutto questo articolo potrà sembrare di altri tempi. Forse dovresti smettere di leggere e andare a dire al tuo robot servitore di andare a prepararti un panino.

Scriviamo questo programma!

Quindi, come si scrivere il programma per stimare il valore di una casa come nel nostro esempio sopra? Pensaci per un attimo prima di andare oltre a leggere.

Se non sai nulla di “Machine Learning”, probabilmente tenteresti di scrivere alcune regole di base per stimare il prezzo di una casa, più o meno in questo modo:

def stima_prezzo_casa(num_di_stanze_da_letto, mq2, quartiere):
prezzo = 0
# Nella mia area, il costo medio delle case per mq2 è $200
prezzo_per_mq2 = 200
if quartiere== "hipsterton":
# ma alcune aree costano un pò di più
prezzo_per_mq2 = 400
elif quartiere== "skid row":
# alcune aree costano un pò di meno
prezzo_per_mq2 = 100
# si inizia a stimare un prezzo base in base alla grandezza della casa
prezzo = prezzo_per_mq2 * mq2
# adesso aggiusti la stima in base al numero di stanze da letto
if num_di_stanze_da_letto == 0:
# i monolocali sono economici
prezzo= prezzo — 20000
altrimenti:
# casa con più camere da letto vengono valutate di più    prezzo = prezzo + (num_di_stanze_da_letto * 1000)
return prezzo

Puoi spenderci sopra ore e ore, e arrivare alla fine ad avere qualcosa che funzioni. Ma il programma non sarà mai perfetto e sarà difficile mantenerlo aggiornato dato che i prezzi cambiano in continuazione.

Non sarebbe meglio se il computer riuscisse a capire come implementare questa funzione al posto tuo? A noi non importa cosa fa esattamente la funzione, ma che dia come risultato il valore corretto:

def stima_prezzo_casa(num_di_stanze_da_letto, mq2, quartiere):
prezzo = <computer, per favore fai qualche calcolo per me>
return prezzo

Puoi pensare a questo problema come se il prezzo fosse un delizioso stufato e gli ingredienti fossero il numero di camere da letto, la metratura e il quartiere. Se riesci a capire quanto ogni ingrediente impatta sul prezzo finale, probabilmente c’è un rapporto esatto tra gli ingredienti e il prezzo finale.

Questo ridurrebbe la funzione originale (con tutte quei ‘se’ e ‘altrimenti’) a qualcosa di molto più semplice come questo:

def stima_prezzo_casa(num_di_stanze_da_letto, mq2, quartiere):
prezzo = 0
# un pizzico di questo
prezzo += num_di_stanze_da_letto * .841231951398213
# una grande manciata di questo
prezzo += mq2 * 1231.1231231
# forse un pugnetto di questo
prezzo += quartiere * 2.3242341421
# e alla fine, ci aggiungiamo un pò di sale qb
prezzo += 201.23432095
return prezzo

Nota i numeri magici in grassetto — 0,841231951398213, 1231,1231231, 2,3242341421, e 201,23432095. Questi sono i nostri pesi. Se fossimo in grado di capire i pesi perfetti per usarli per ogni casa, la nostra funzione sarebbe in grado di predire i prezzi delle case!

Un semplice modo per capire i migliori pesi da usare sarebbe qualcosa di questo tipo:

Step 1:

Inizia con ogni peso impostato a 1.0:

def stima_prezzo_casa(num_di_stanze_da_letto, mq2, quartiere):
prezzo= 0
# un pizzico di questo
prezzo += num_di_stanze_da_letto * 1.0
# una grande manciata di questo
prezzo += mq2 * 1.0
# forse un pugnetto di questo
prezzo += quartiere * 1.0
# e alla fine, ci aggiungiamo un pò di sale qb
prezzo += 1.0
return prezzo

Step 2:

Usa la funzione per ogni casa che conosci e guarda quanto lontano si scosta il risultato della funzione dal prezzo corretto reale:

Usa la funzione per stimare il prezzo di ogni casa

Ad esempio, se la prima casa è stata realmente venduta a $ 250.000, e la funzione indicava come prezzo $ 178.000, c’è una differenza di 72.000 $ per quella casa.

Adesso aggiungi il quadrato dell’importo della differenza di ogni casa che hai nel tuo set di dati. Diciamo che hai 500 vendite di case nel tuo set di dati e la differenza totale che la tua funzione ha elaborato è di $ 86.123.373. Ecco di quanto “sbaglia” la funzione attualmente.

Ora, prendi quella somma totale e dividila per 500 per ottenere una media della differenza per ogni casa. Chiama questo importo medio come costo errato di funzione.

Se si potesse avere questo costo uguale a zero, giocando con i pesi, la funzione sarebbe perfetta. Vorrebbe dire che in tutti i casi, la funzione indovina perfettamente il prezzo della casa in base ai dati di input. Ecco, questo è il nostro obiettivo è avere questo costo più basso possibile provando diverse combinazioni di pesi.

Step 3:

Ripeti il secondo passaggio più e più volte con ogni possibile combinazione di pesi. Qualunque sia la combinazione di pesi che rende il costo più vicino allo zero, è quella da usare. Quando trovi il peso che funziona, hai risolto il problema!

Momento Stupefacente!

Abbastanza semplice, vero? Bene, pensa a quello che hai appena fatto. Hai preso alcuni dati, hai alimentato 3 grandi insiemi, passi veramente molto semplici, e il tutto si è concluso con una funzione che può indovinare il prezzo di una casa nella tua zona. Attenzione, Zillow!

Ma ecco alcuni fatti che ti lasceranno ancor più a bocca aperta:

1. La ricerca in molti campi (come la linguistica / la traduzione) negli ultimi 40 anni ha dimostrato che questi algoritmi di apprendimento generici che “mescolano i numeri dello stufato” (una frase che ho appena inventato) hanno approcci migliori di quelli usati dalle persone reali che usano esplicite regole. L’approccio “sciocco” del Machine Learning alla fine batte gli esperti umani.

2. La funzione che abbiamo ottenuto è molto sciocca. Non sa nemmeno cosa sono i metri quadrati o le camere. Tutto quello che sa è che ha bisogno di mescolare questi numeri per ottenere la risposta corretta.

3. E’ molto probabile che tu non abbia idea del perché una particolare combinazione di pesi funzioni. Quindi hai appena scritto una funzione che non capisci del tutto, ma che nonostante ciò funziona perfettamente.

4. Immagina che invece di prendere come parametri i metri quadri e il numero delle stanze da letto, la funzione prenda un range di numeri. Diciamo che ogni numero rappresenta la luminosità di un pixel di un’immagine catturata dalla telecamera montata sulla parte superiore della tua auto. Ora diciamo che invece di cercare un valore chiamato “prezzo”, la funzione emetta una previsione chiamata “gradi_per_girare_sterzo_ruote”. Hai appena fatto una funzione che può guidare l’auto da sola!

Incredibile, vero?

Che dire sul fatto di “provare ogni numero” indicato nello Step 3?

Ok, ovviamente non puoi provare tutte le combinazioni di tutti i pesi possibili per trovare la combinazione che funziona meglio. Se lo prendessi letteralmente, continueresti all’infinito perché non saresti mai a corto di numeri da provare.

Per evitare questo, i matematici hanno trovato molti modi intelligenti per trovare rapidamente dei buoni valori per quei pesi senza dover fare tantissimi tentativi. Ecco un modo:

Primo, scrivi una semplice equazione che rappresenta lo Step #2:

Questa è la nostra funzione di costo

Ora riscriviamo esattamente la stessa equazione, ma usando un pò di gergo matematico del Machine Learning (che puoi ignorare per ora):

θ è quello che rappresenta i nostri pesi attuali. J(θ) sta per il ‘costo per i pesi correnti’.

Questa equazione rappresenta quanto è sbagliata la nostra stima di prezzo per i pesi che stiamo attualmente usando.

Se tracciamo questa equazione dei costi per tutti i possibili valori dei nostri pesi, per num_di_stanze_da_letto e mq2, otterremo un grafico che potrebbe essere simile a questo:

Il grafico della nostra funzione di costo si presenta come una conca. L’asse verticale rappresenta il costo.

In questo grafico, il punto più basso in blu è dove il nostro costo è il più basso — quindi la nostra funzione sarà la meno sbagliata. I punti più alti sono dove ci sono margini di errore più alti. Quindi, se siamo in grado di trovare i pesi che ci fanno arrivare al punto più basso di questo grafico, il gioco è fatto!

Abbiamo solo bisogno di regolare i nostri pesi per fare in modo di spostarci verso la parte centrale, più bassa del grafico. Se continuiamo a fare piccoli aggiustamenti sui nostri pesi rimanendo diretti verso il punto più basso, arriveremo alla meta senza dover provare tanti altri pesi.

Se ricordi qualcosa sui calcoli, potresti ricordare che la derivata di una funzione ti indica la pendenza della tangente alla funzione in qualsiasi punto. In altre parole, ci dice che il senso è in discesa per un qualsiasi punto sul nostro grafico. Possiamo usare questo concetto per continuare il cammino in discesa.

Quindi, se calcoliamo una derivata parziale della nostra funzione di costo rispetto a ciascuno dei nostri pesi, possiamo sottrarre tale valore da ogni peso. Questo ci permetterà di camminare sempre più vicino alla parte inferiore del grafico. Continua a farlo e alla fine raggiungerai il fondo dove si hanno i migliori valori possibili per i nostri pesi. (Se non ne capisci il senso, non ti preoccupare e continuate a leggere).

Questo è un riepilogo di alto livello di un modo per trovare i migliori pesi per la vostra funzione chiamato Batch Gradient Descent (discesa del gradiente). Non abbiate paura di scavare più a fondo, se siete interessati a capirne i dettagli.

Quando si utilizza una libreria di Machine Learning per risolvere un problema reale, tutto questo sarà fatto per voi dal computer. Ma è sempre utile avere una buona idea di ciò che sta facendo.

Quali dettagli ho saltato per convenienza?

L’algoritmo in tre fasi che ho descritto sopra si chiama Multivariate Linear Regression (regressione lineare multivariata). Stai stimando l’equazione di una linea che si adatta a tutti i punti dei dati delle casa. Quando utilizzi questa equazione per stimare il prezzo di vendita delle case, non sai bene dove apparirà sulla linea. Questa è davvero un’idea molto potente con cui si riesce a risolvere i problemi “reali”.

L’approccio che ho mostrato può funzionare nei casi più semplici, ma non in tutti i casi. Una ragione è che i prezzi delle case non sono sempre abbastanza semplici e lineari da seguire una linea continua.

Ma per fortuna ci sono molti modi per gestire questo problema. Ci sono molti altri algoritmi di “Machine Learning” in grado di gestire i dati non lineari (come le reti neurali — neural networks o SVMs con kernels). Ci sono anche modi per utilizzare la regressione lineare in maniera più intelligente che permette di gestire le linee più complicate. In tutti i casi, l’idea di base di dover trovare le migliori combinazioni si applica sempre.

Inoltre, ho ignorato l’idea di overfitting. É facile venire fuori con una serie di pesi che funziona sempre perfettamente per prevedere i prezzi delle case nel set di dati originali, ma non funziona per tutte le nuove case che non erano nel set di dati originale. Ma ci sono modi per affrontare anche questo problema (come la regolarizzazione / regularization e l’utilizzo di un set di dati di convalida incrociata / cross validation data set). Imparare come affrontare questo problema è un elemento chiave per imparare ad applicare il Machine Learning con successo.

In altre parole, mentre il concetto di base è piuttosto semplice, ci vuole una certa abilità ed esperienza per applicare il Machine Learning e per ottenere risultati veramente utili. Ma è una capacità che ogni sviluppatore può imparare!

Il Machine Learning è magico?

Una volta che si inizia a vedere la facilità con cui tecniche di Machine Learning possono essere applicate a problemi che sembrano davvero difficili (come il riconoscimento della scrittura a mano), si inizia ad avere la sensazione che si potrebbe usare il Machine Learning per risolvere qualsiasi problema e ottenere una risposta fino a quando si hanno abbastanza dati. Basta inserire dei dati e guardare il computer calcolare magicamente l’equazione che c’è tra gli stessi!

Ma è importante ricordare che il Machine Learning funziona solo se il problema è veramente risolvibile con i dati che si hanno a disposizione.

Ad esempio, un modello che prevede i prezzi delle case in base al tipo di piante in vaso di ogni casa, non potrà mai funzionare. Non c’è nessuna relazione tra le piante in vaso in ogni casa e il prezzo di vendita della casa. Quindi, non importa quanto si provi, il computer non potrà dedurre una relazione tra i due.

È possibile modellare solo le relazioni effettivamente esistenti

Quindi ricorda, se un umano esperto non può utilizzare i dati per risolvere il problema manualmente, anche un computer probabilmente non sarà in grado di risolverlo. Invece, concentrati su problemi che un essere umano è in grado di risolvere, ma dove sarebbe meglio se un computer potesse risolverli molto più velocemente.

Come saperne di più sul Machine Learning

Secondo me, in questo momento il problema più grande con il Machine Learning è che vive per lo più nel mondo accademico e nei gruppi di ricerca. Per i non esperti che desiderano avere però una visione più ampia sull’argomento non è facile comprendere il materiale a riguardo. Ma ogni giorno è sempre meglio.

L’opera gratuita di Andrew Ng Classe di Machine Learning su Coursera è sorprendente. Consiglio vivamente di partire da lì. Dovrebbe essere comprensibile per chiunque abbia una laurea in materia informatica e che ricorda un minimo di matematica.

In più, si può giocare con le tonnellate di algoritmi di Machine Learning, scaricando e installando SciKit-Learn. E’ un python framework che ha versioni “black box” di tutti gli algoritmi standard.


Vai alla seconda parte: Come usare il Machine Learning per creare livelli di Super Mario Maker

Qui invece trovi le traduzioni della parte 3, parte 4 e parte 5. Le parti 6 e 7 sono in fase di traduzione.

Puoi trovarmi su Twitter @giovannitoschi, scrivermi per mail o cercarmi su Linkedin.


Nota: questa è una traduzione dell’articolo “Machine Learning is Fun!” scritto da Adam Geitgey.

Per coloro che preferiscono altre lingue, questo articolo è disponibile anche in 日本語, Português, Türkçe, Français, 한국어 , العَرَبِيَّة‎‎, Español (México), Español (España) o Polski.

Se ti è piaciuto questo articolo, considera di iscriverti alla mailing list di Adam Geitgey: Il Machine Learning” è divertente! Adam manda mail solo quando ha qualcosa di nuovo e interessante da condividere.

Puoi seguire Adam Geitgey su Twitter @ageitgey, scrivergli direttamente per email o cercarlo su linkedin.

We’re a team of bot creatives and AI scientists with one common goal:

blowing business objectives out of the water with bots and cognitive solutions
Did you like the article? Click ❤ to recommend it to other Medium readers!