Ho fatto reverse-engineering di un’azienda di Intelligenza Artificiale da 500M$, in una settimana. Ecco la storia completa
[EN]: Disclaimer: the original story is now featured in Startup-Grind’s publication. Since the goal was to spread awareness, due to the many requests I received I made this a translation for the Italian community.
[IT] Disclaimer: la storia originale fa ora parte della pubblicazione di Startup-Grind. Poiché lo scopo iniziale era di diffondere consapevolezza, in seguito alle numerose richieste ho elaborato questa traduzione per la comunità Italiana.
Perché l’ho fatto:
Molte delle pubblicazioni, dei dataset e degli strumenti software relativi al deep learning sono stati resi open source. Questo ha avuto un effetto democratizzante, permettendo ad individui e piccole organizzazioni di costruire potenti applicazioni. WhatsApp è stata in grado di costruire un sistema di messaging a livello globale che serviva 900M di utenti con solo 50 ingegneri, confrontati con le migliaia necessarie per sistemi di messaging di generazioni precedenti. L’ “effetto WhatsApp” sta adesso accadendo con l’AI. Strumenti software come Theano e TensorFlow, combinati con data center cloud per il training, e GPU economiche per il deployment, permettono a piccoli team di ingegneri di costruire sistemi di Intelligenza Artificiale allo stato dell’arte.
Concludo sempre l’introduzione ai seminari di AI-Academy con una slide contenente questa citazione di Chris Dixon (general partner A16Z) e sullo sfondo una foto di George Hotz nella macchina autonoma che si è costruito da solo.
Il messaggio è semplice: oggi chiunque può sfruttare l’Intelligenza Artificiale senza spendere anni e una montagna di soldi in ricerca e sviluppo.
Sono fermamente convinto che questo sia vero sia nel caso in cui si vogliano spingere in avanti i confini della tecnologia (vedi George Hotz), sia nel caso in cui si voglia applicare delle metodologie di AI ben consolidate a nuovi problemi.
Siccome alcune persone non erano convinte al 100% dal mio ragionamento, ho deciso di dimostrarlo investendo un po’ del mio tempo per metterlo in pratica. Come il mio professore di business alla Santa Clara University era solito dire, “devi assaggiare il cibo che dai ai tuoi cani”.
Inoltre, devo essere onesto: è stato molto divertente :)
Trovare l’esperimento giusto:
Ho scelto il caso di un’azienda che ammiro molto (essendo un ingegnere energetico): Opower.
Quello che fa Opower è molto semplice ma molto potente: usa dati provenienti dagli smart meter per aiutare i fornitori energetici a “targhetizzare” i propri clienti fornendo informazioni sui loro pattern di consumo. È un problema molto sentito dai fornitori energetici, che hanno la necessità di mantenere il consumo energetico dei propri clienti il più stabile possibile durante il giorno (i così detti “picchi” e “valli” sono costosi da gestire per un produttore energetico per motivi che non tratteremo in questa sede)
Una volta conosciuto il pattern di utilizzo di un utente energetico, è possibile “targhetizzarlo” con un’offerta su misura per ridurre il suo consumo energetico durante i momenti critici.
Opower ha avuto molto successo col loro prodotto: secondo crunchbase, è stata fondata nel 2007, diventata pubblica nel 2014, e alla fine acquisita da Oracle per 532M$ cash, nel 2016.
Opower rappresentava il caso perfetto per la mia analisi in quanto ho trovato questo dataset molto interessante composto da circa 15000 file .csv contenenti il carico orario di 15000 edifici negli Stati Uniti, risalenti al 2004. Sembrava abbastanza simile a quello che Opower ha in realtà.
Il caso era perfetto ed ero pronto a procedere ;)
Guardando i dati:
La prima cosa che ho fatto è stata importare i singoli file csv e tracciare dei grafici molto veloci e sporchi dei profili di consumo energetico degli utenti, per valutare cosa potevo comprendere da questi.
Ho fatto dei “hairball plots”: praticamente ho disegnato su un singolo grafico il profilo di consumo energetico relativo a diversi giorni con una linea nera con opacità pari a 0.1. Questo rende semplice osservare quali sono i pattern di consumo energetico più comuni in un edificio.
Ho anche fatto tre grafici separati per l’intero anno, per i giorni lavorativi e i fine-settimana, per cercare pattern differenti.
Ecco due esempi:
Possono sembrare inutili ad un primo sguardo, ma possiamo già estrarre delle conclusioni interessanti:
- Il ristorante opera a colazione, pranzo e cena (guarda i tre picchi)
- Il ristorante probabilmente apre tra le 5 e le 6 di mattina (primo aumento nel consumo dovuto all’entrata dei dipendenti)
- Il ristorante probabilmente chiude tra l’una e le due di notte
- Il ristorante probabilmente è aperto nei fine-settimana e nei giorni festivi.
- I clienti restano nel ristorante più tempo a pranzo che per colazione e cena.
- Il ristorante probabilmente ha dei frigoriferi che restano in funziona durante le ore notturne (il consumo non scende mai a zero).
- La scuola apre intorno alle 6 di mattina e chiude intorno alle 10 di sera.
- Intorno alle 6 del pomeriggio la maggior parte delle persone lascia la scuola, ma qualcuno resta all’interno (professori? attività dopo-scuola?)
- Anche la scuola ha dei dispositivi che non vengono mai spenti (Frigoriferi? dispositivi elettronici? O forse mantengono le luci accese di notte per ragioni di sicurezza?)
- C’è un problema nel dataset! Dovremmo aspettarci un consumo stabile e vicino allo zero durante i fine-settimana (le linee orizzontali). È possibile che il dataset sia spostato rispetto alle date? Scopriamo che Sì, lo è. Spostando tutto di tre giorni nel passato la situazione si avvicina a quello che ci aspettavamo, e la maggior parte dei fine-settimana e giorni festivi hanno un consumo pià stabile :).
Ora che sapevo cosa potevo trovare in questi dati, ho iniziato il processo di pulizia e preparato delle funzioni per costruire il mio modello. Come sempre, questa è stata la parte che ha preso più tempo.
Machine Learning time:
Quello di cui avevo bisogno per iniziare a cercare dei pattern nel consumo energetico era un dataset con un “modello” per ogni edificio. Ho costruito il modello semplicemente facendo la media del consumo energetico dell’edificio ora per ora, per ogni giorno dell’anno (più alcuni parametri che ho considerato potessero essere interessanti, come lo stato, la città, etc.).
Per rendere possibile comparare gli edifici tra di loro ho anche diviso il consumo di ogni ora per il consumo più alto registrato, così che potesse variare tra 0 e 1 per ogni edificio.
Ho anche costruito la mia funzione “make_building_model” così da poter cambiare il dataset semplicemente e considerare solamente i giorni lavorativi o solo quelli festivi per creare il modello di ogni singolo edificio, nel caso in cui avessi voluto cercare pattern più specifici.
Ho deciso di iniziare considerando l’anno intero, e far girare il mio codice sui ~15000 file .csv che avevo, finendo con un dataset di 15000 righe, e sono partito con il clustering.
Ho usato un semplice (ma molto potente ed efficiente) algoritmo chiamato KMeans, e gli ho dato in pasto i 15000 sample usando come input una lista contenente i 24 valori contenenti i profili di carico orari normalizzati.
Ho giocato col numero di cluster, e quello che mi ha permesso di ottenere i cluster più significativi era 6 (è stato un approccio “a tentativi”, per brevità riporterò solamente i risultati finali).
Per avere delle informazioni ho disegnato i centri dei cluster (praticamente i 6 principali pattern di utilizzo riconosciuto dall’algoritmo), insieme ad un grafico “hairball” degli edifici che fanno parte del cluster, così da poter apprezzare le similarità (nota che ci sono migliaia “di linee con opacità settata all’1% in quei grafici! È questo che causa l’“effetto fantasma” che vedi).
Sembra abbastanza bello, vero? Adesso praticamente sappiamo che:
- Ci sono utenti con un consumo che cresce costantemente e che ha un picco intorno alle 5 del pomeriggio e poi diminuisce (Cluster 1)
- Alcuni utenti hanno due picchi giornalieri, intorno alle 7 del mattino e 9 di sera (Cluster 2)
- Alcuni utenti hanno 3 picchi giornalieri, intorno alle 8 di mattina, una e sei del pomeriggio (Cluster 3)
- Alcuni utenti hanno un modo di operare con “due modalità”: consumi elevati più o meno dalle 9 di mattina alle 5 del pomeriggio, e consumi bassi durante il resto della giornata (Cluster 4)
- Alcuni utenti hanno un consumo simile al cluster 4, ma con una modesta (10% del picco) ma netta diminuzione intorno all’una del pomeriggio (Cluster 5)
- Alcuni utenti hanno un consumo abbastanza stabile, con un consumo minimo del 60% del picco (Cluster 6).
Possiamo andare oltre? Che tipo di valore un’azienda potrebbe dedurre da quest’analisi?
Questo è quello che otteniamo se stampiamo la descrizione di che tipo di edifici appartengono a ognuno dei cluster:
CLUSTER 1
total elements: 3042
n Stand-aloneRetailNew = 936 out of 936
n StripMallNew = 936 out of 936
n SecondarySchoolNew = 923 out of 936
n PrimarySchoolNew = 235 out of 936
n MediumOfficeNew = 4 out of 936
n LargeOfficeNew = 8 out of 936
CLUSTER 2
total elements: 2808
n LargeHotelNew = 936 out of 936
n MidriseApartmentNew = 936 out of 936
n SmallHotelNew = 936 out of 936
CLUSTER 3
total elements: 1872
n FullServiceRestaurantNew = 936 out of 936
n QuickServiceRestaurantNew = 936 out of 936
CLUSTER 4
total elements: 5381
n LargeOfficeNew = 928 out of 936
n MediumOfficeNew = 932 out of 936
n OutPatientNew = 935 out of 936
n PrimarySchoolNew = 701 out of 936
n SecondarySchoolNew = 13 out of 936
n SmallOfficeNew = 936 out of 936
n SuperMarketNew = 936 out of 936
CLUSTER 5
total elements: 936
n WarehouseNew = 936 out of 936
CLUSTER 6
total elements: 937
n HospitalNew = 936 out of 936
n OutPatientNew = 1 out of 936
Noti niente di interessante? Questo è quello che direi io:
- Tutti gli “Stand-alone retailers” (negozi), “Malls” (centri commerciali), e quasi tutti i licei appartengono al cluster 1. Se fossimo un fornitore energetico che utilizza questo strumento, potremmo considerare di offrire incentivi per spostare il loro consumo lontano da quel singolo picco.
- Tutti gli hotel e gli appartamenti “Midrise” appartengono al cluster 2. I fornitori energetici potrebbero offrire a questi clienti delle offerte che li spingono verso una riduzione dei consumi intorno alle 7 di mattina e 9 di sera (specialmente quest’ultima). O quantomeno essere coscienti che se acquisiscono un nuovo cliente che è una grande catena alberghiera devono aspettarsi questi picchi e agire di conseguenza.
- Tutti i ristoranti appartengono al cluster 3. Probabilmente a causa del fatto che non avevamo nessun dataset aperto solo per due dei tre pasti principali (colazione, pranzo, cena). Un fornitore energetico dovrebbe prestare particolare attenzione all’ultimo picco di questi utenti, che avviene circa allo stesso orario degli utenti appartenenti al cluster 2. Una promozione su misura potrebbe incentivare per esempio un cambiamento degli orari di apertura e quindi uno spostamento dei consumi (anche se non sono sicuro che sia efficace da un punto di vista di business).
- Il cluster 4 è il profilo più comune, con uffici di qualsiasi taglia, supermercati e la maggior parte delle scuole primarie. Ce lo aspettavamo, in quanto è un classico profilo “9to5”.
- Il cluster 5 è tipico solamente dei magazzini. Il calo nei consumo all’una del pomeriggio è probabilmente un cambio turni. Potremmo incentivare l’uso di energia durante gli orari notturni con promozioni su misura, così che i picchi non vadano a sommarsi a quelli degli utenti del cluster 4.
- Gli ospedali di nuova costruzione hanno tutti un profilo come quello del cluster 6. Questo giustifica l’alto consumo notturno e il profilo di carico costante, siccome probabilmente avranno macchinari che non possono essere spenti durante la notte. Non c’è molto che possiamo dire ad un ospedale per cambiare il suo modo di consumare energia, e inoltre sono degli utenti abbastanza stabili per cui li lasceremo perdere :)
Conclusioni:
Sì, è possibile trarre delle conclusioni molto interessanti usando tecniche di Machine Learning anche se non sei un’azienda da 500 milioni di dollari, ma una singola persona con un po’ di tempo libero. Questo è principalmente dovuto alla disponibilità di dati aperti, insieme a strumenti software open source che mi hanno permesso di costruire un modello di base ma funzionante ad una velocità incredibile.
Aggiungerei anche che il clustering è una tecnica estremamente potente e semplice da applicare che ha tantissimo potenziale non ancora sfruttato. Immagina cosa potresti fare nel marketing con lo stesso approccio.
Sviluppi futuri:
Ho solamente grattato la superficie di quello che è possibile estrarre da questo dataset. Potremmo continuare e cercare differenze tra diverse aree climatiche negli Stati Uniti, differenze tra giorni lavorativi e feriali, o ripetere lo stesso lavoro con altri tipi di consumo (il dataset originale ha anche dati sul riscaldamento e altre cose interessanti!)
Se qualcuno volesse continuare nella ricerca, ho reso il mio codice publico su Github, dove puoi usare le mie funzioni per risparmiare un sacco di tempo per la pulizia dei dati, e iniziare subito a divertirti col Machine Learning :).
Aggiornamento:
Ben Packer, un ex Data Scientist di Opower, mi ha rimandato a questo articolo molto interessante sul lavoro originale di Opower (grazie Ben!). È molto interessante come l’approccio sia molto simile al mio (persino la rappresentazione grafica!). Siccome loro fanno riferimento a utenti residenziali, le forme dei cluster sono leggermente differenti, per esempio non c’è nessuno con tre picchi giornalieri nei loro dati, mentre noi avevamo notato che era un profilo tipico di tutti i ristoranti.
Inoltre, ci permettono di fare un’occhiata alle tecniche che usano: ovviamente sono più sofisticate di quelle che ho usato io, avendo loro centinaia di volte la quantità di dati che avevo io, più soldi, tempo, ingegneri, e…essendo un’azienda da 500M$ (Immagino sia questo il motivo per cui il mio titolo volontariamente provocatorio ha irritato così tante persone su Hacker News).
Ad ogni modo, mi sembra che le conclusioni ed il valore (in termini di informazioni, non di soldi ovviamente…) che abbiamo estratto sono decisamente paragonabili.
Se ti è piaciuto il mio lavoro, un click sul pulsante “recommend” è molto apprezzato, come anche il condividerlo. Sharing is caring ❤
Se hai dei dati dalla quale ti piacerebbe estrarre valore, puoi contattarmi al gianluca@ai-academy.com :)