• Non ci sono risultati.

Clustering dei profili di consumo di energia elettrica

N/A
N/A
Protected

Academic year: 2021

Condividi "Clustering dei profili di consumo di energia elettrica"

Copied!
80
0
0

Testo completo

(1)

energia elettrica

Studente/i

Nicol Allegra

Relatore

Andrea Emilio Rizzoli

Correlatore

Marco Derboni

Committente

Andrea Emilio Rizzoli

Corso di laurea

C10097

Modulo

Progetto di diploma

Anno

2018/2019

(2)
(3)

Indice

1 Introduzione 5 2 Richiami Teorici 7 2.1 Apprendimento supervisionato . . . 7 2.1.1 Regressione . . . 8 2.1.1.1 Regressione lineare . . . 8 2.1.2 Classificazione . . . 9

2.1.2.1 Support Vector Machine . . . 10

2.1.2.2 Random forest . . . 13

2.2 Apprendimento non supervisionato . . . 16

2.2.1 Clustering . . . 16 2.2.1.1 Tecniche di clustering . . . 17 2.2.1.2 Kmeans . . . 19 3 Tecnologie utilizzate 21 3.1 Linguaggi . . . 22 3.2 Piattaforme . . . 23 3.3 Librerie . . . 25

4 Strutturazione dei dati 27 4.1 Database . . . 28

(4)

5.4 Random Forest . . . 42

6 Risultati 43 6.1 Features . . . 44

6.2 Cluster . . . 47

6.3 Classificatori . . . 50

6.3.1 Confronto tra algoritmi . . . 50

6.3.1.1 Classi suddivise equamente . . . 51

6.3.1.2 Classi suddivise per range di consumo . . . 56

6.3.1.3 Classi suddivise utilizzando K-Means . . . 61

7 Conclusioni 67 7.1 Problemi riscontrati . . . 67

7.2 Sviluppi futuri . . . 68

7.3 Considerazioni personali . . . 68

(5)

Elenco delle figure

2.1 Esempio grafico di regressione lineare [1] . . . 8

2.2 Esempio di possibili iperpiani, preso da [2] . . . 10

2.3 Esempio di iperpiano ottimale, preso da [2] . . . 11

2.4 Esempio di albero di decisione, preso da [3] . . . 13

2.5 Esempio di random forest, preso da [4] . . . 14

4.1 Comandi per creare database . . . 28

4.2 Diagramma classi utilizzate . . . 29

4.3 Query finale per interrogare i database . . . 32

4.4 One-hot encoding con heating source type . . . 33

4.5 One-hot encoding con la nazionalità . . . 33

4.6 One-hot encoding con building type . . . 34

4.7 One-hot encoding sulle mensilità . . . 34

4.8 Aggregate method . . . 35

4.9 One-hot encoding con quattro stagioni . . . 35

4.10 One-hot encoding con tre stagioni . . . 35

6.1 Risultati regressione dataframe mensile . . . 44

6.2 Risultati regressione dataframe stagionale . . . 44

6.3 Features importanti dataframe mensile con classi eque . . . 45

6.4 Features importanti dataframe mensile con classi per range . . . 46

(6)

6.15 Forchetta di consumo . . . 53

6.16 Informazioni classificatore con dataframe mensile . . . 54

6.17 Probabilità con dataframe mensile . . . 54

6.18 Forchetta di consumo . . . 55

6.19 Informazioni classificatore con dataframe stagionale . . . 56

6.20 Probabilità con dataframe stagionale . . . 56

6.21 Forchetta di consumo . . . 57

6.22 Informazioni classificatore con dataframe stagionale . . . 57

6.23 Probabilità con dataframe stagionale . . . 58

6.24 Forchetta di consumo . . . 58

6.25 Informazioni classificatore con dataframe stagionale . . . 59

6.26 Probabilità con dataframe stagionale . . . 59

6.27 Forchetta di consumo . . . 60

6.28 Informazioni classificatore con dataframe mensile . . . 61

6.29 Probabilità con dataframe mensile . . . 61

6.30 Forchetta di consumo . . . 62

6.31 Informazioni classificatore con dataframe mensile . . . 62

6.32 Probabilità con dataframe mensile . . . 63

6.33 Forchetta di consumo . . . 63

6.34 Informazioni classificatore con dataframe mensile . . . 64

6.35 Probabilità con dataframe mensile . . . 64

(7)

Elenco delle tabelle

3.1 Linguaggi utilizzati . . . 22

3.2 Piattaforme utilizzate . . . 24

3.3 Librerie utilizzate . . . 26

4.1 Mensilità per quattro stagioni . . . 36

4.2 Mensilità per tre stagioni . . . 36

4.3 Dataframe creati . . . 36

5.1 Alcuni esempi dei coefficienti . . . 38

(8)
(9)

Abstract

Italiano

La SUPSI è impegnata in un progetto di ricerca chiamato enCOMPASS. Tale progetto mira a intraprendere un cambiamento comportamentale per quanto concerne il risparmio ener-getico rendendo noti ai propri utenti i loro consumi. Questi dati sul consumo vengono rilevati attraverso dei contatori intelligenti e sono campionati ogni 15 minuti per un totale di circa 400 utenti.

Lo scopo di questo progetto è quello di analizzare e studiare queste moli di dati per capire l’affidabilità e la veridicità di quest’ultimi. Analiticamente si vogliono scoprire quali sono, se ci sono, le principali fonti di consumo. Inoltre, si vuole anche realizzare una classificazione per analizzare e identificare l’intervallo di consumo, partendo unicamente dal profilo di un nuovo utente e dai suoi dati riguardanti la domotica.

Per soddisfare tutti i compiti e gli obiettivi si è deciso di utilizzare il linguaggio di programma-zione Python in quanto esistono già diverse librerie che implementano algoritmi di machine learning mirati al compimento del progetto. Il presente documento andrà a spiegare detta-gliatamente il lavoro svolto sui dati e gli algoritmi adottati, quali K-means, Support Vector Machine, Random Forest e la regressione lineare.

Eseguendo un’analisi preliminare dei dati forniti e una loro scrematura, eliminando alcuni valori errati e/o inconsistenti, si raggiungono in modo ottimale gli obiettivi prefissati:

(10)

English

SUPSI is involved in a research project called enCOMPASS. This project aims to undertake a behavioral change with regard to energy saving by making its consumption known to its users. This consumption data is collected through smart meters and is sampled every 15 minutes for a total of about 400 users.

The purpose of this project is to analyze and study these amounts of data to understand their reliability and their veracity. Analytically we want to find out what are, if any, the main sources of energy consumption. Furthermore, we also want to create a classification to analyze and identify the consumption interval, starting from the profile of a new user and the respective data relating to home automation.

To meet all the tasks and objectives I decided to utilize Python programming language as there are many libraries that implement valid machine learning algorithms to complete the project. This document will explain in detail the work carried out on the data and the adopted algorithms, such as K-means, Support Vector Machine, Random Forest and Linear Regres-sion.

Performing a preliminary analysis of the data provided and skimming them, eliminating so-me incorrect and/or inconsistent values, the pre-established objectives are reached in an optimal way:

• We achieve the features that affect on electricity consumption the most, even if the results are not exactly what was expected at the theoretical level and some are not very satisfactory.

• The classifiers, by giving them significant data frames, work very well, managing to identify the class to which a new user belongs.

(11)

Progetto assegnato

Descrizione

Nel contesto del cambiamento energetico (energiewende) e del continuo aggiornamento delle reti di distribuzione dell’energia elettrica, i contatori intelligenti svolgono un ruolo fon-damentale permettendo la raccolta di dati di consumo a risoluzione molto più elevata di quanto fosse possibile in passato.

La SUPSI partecipa ad un progetto di ricerca nel quale ha accesso a dati di consumo di energia misurati ogni 15 minuti per un insieme di circa 400 utenti in tre località diverse. Oltre ai dati di consumo, sono presenti dati rilevati da sensori di temperatura e umidità, oltre che dei dati sulla luminanza e sulla presenza e assenza degli utenti nell’abitazione. L’obiet-tivo di questo lavoro è quello di utilizzare alcuni algoritmi di feature selection e di clustering, correntemente disponibili, al fine di individuare i principali fattori che influenzano il consumo di energia, e di organizzare i profili degli utenti secondo dei cluster scoperti durante l’analisi dei dati.

Compiti

• Organizzare e strutturare i dati per l’analisi.

• Utilizzare diversi algoritmi di feature selection per identificare quali sono, nell’insieme di dati disponibili, i principali fattori che influenzano il consumo.

(12)

Obiettivi

• Identificare i principali fattori di consumo dell’energia elettrica a partire dai dati dispo-nibili.

• Essere in grado di assegnare un nuovo utente ad un determinato cluster, in base al suo profilo e quindi, implicitamente, determinare quale potrebbe essere una sua "forchetta" di consumo (consumo minimo e massimo stimato).

(13)

Capitolo 1

Introduzione

La continua evoluzione del mercato dell’energia elettrica in Svizzera, come in molti altri stati, unitamente ai costi crescenti e alla maggiore attenzione dell’opinione pubblica, dei governi nazionali e internazionali sul tema del risparmio energetico, hanno indotto gli utenti finali ad attivare processi tesi alla riduzione dei consumi e, conseguentemente, della spesa com-plessiva.

La SUPSI, assieme ad altri istituti Europei, partecipa ad un progetto di ricerca chiamato enCOMPASS.

Tale progetto ha lo scopo di implementare un approccio socio-tecnico integrato al cambia-mento comportamentale per quanto concerne il risparmio energetico, sviluppando strumen-ti digitali innovastrumen-tivi e di facile ustrumen-tilizzo per rendere il consumo di dastrumen-ti energestrumen-tici disponibili e comprensibili per i diversi utenti, consentendo loro di collaborare per riuscire a risparmiare e gestire il proprio fabbisogno energetico in modo efficiente ed economico.

EnCOMPASS sfrutta la rete dei contatori intelligenti (smart meter) già installati da alcune aziende elettriche e si appoggia anche a una serie di sensori, installati appositamente negli edifici che partecipano al progetto, che rilevano la presenza delle persone nei locali e

(14)

leg-Uno degli obiettivi scientifici di questo progetto di ricerca è proprio quello di diffondere questi dati e i relativi risultati per realizzare dei lavori transdisciplinari nei diversi campi di interesse. Ed è da questa ideazione che prende vita l’attuale progetto sui clustering, in quanto avendo a disposizione queste informazioni e dati, si vuole comprendere se ci sono dei fattori molto determinanti che aggravano sul consumo di energia elettrica e inoltre, si vuole riuscire a individuare, nel momento in cui giunge un nuovo utente non legato al progetto enCOMPASS, la forchetta di consumo (consumo minimo e massimo) avendo a disposizione solo il profilo di quest’ultimo, cioè le informazioni sugli elettrodomestici in possesso, sul numero persone che risiedono nell’abitazione e ulteriori dati.

(15)

Capitolo 2

Richiami Teorici

Questo capitolo vuole introdurre il lettore al mondo del machine learning in modo da svi-luppare delle conoscenze di base prima di gettarsi nella parte pratica del progetto dove si andranno a utilizzare degli algoritmi di machine learning.

Il tutto non vuole essere una ricerca o documentazione specifica per ogni singolo algoritmo, anche perché si potrebbero scrivere innumerevoli informazioni e così deviare dallo scopo ultimo del progetto, ma una visione d’insieme delle principali differenze.

Inoltre, informazioni più dettagliate ci saranno solo per gli algoritmi di clustering, regressione e classificazione utilizzati per adempiere ai compiti e agli obiettivi prefissati.

2.1

Apprendimento supervisionato

L’apprendimento supervisionato è una tecnica di apprendimento automatico che mira a istruire un sistema informatico, consentendogli così di elaborare automaticamente previ-sioni sui valori di uscita di un sistema basato su un input generato da una serie di esempi ideali, costituiti da coppie di input e di output, che gli vengono inizialmente forniti.

Con l’apprendimento supervisionato si cerca dunque di costruire un modello partendo da dei dati di addestramento etichettati, con i quali si cerca di fare previsioni su dati non dispo-nibili o futuri. Si suppone quindi che nel nostro insieme dei campioni (o dataset), i segnali di

(16)

2.1.1

Regressione

L’analisi della regressione è una tecnica usata per analizzare una serie di dati che consisto-no in una variabile dipendente e una o più variabili indipendenti.

Lo scopo è stimare un’eventuale relazione funzionale esistente tra la variabile dipendente e le variabili indipendenti.

2.1.1.1 Regressione lineare

La regressione rappresenta un metodo statistico che mira ad identificare la presenza di una relazione tra una variabile dipendente e una o più variabili indipendenti. Nella regressione lineare la relazione è espressa dal seguente polinomio di primo grado:

f (x) = xw + b

Graficamente questa relazione lineare può essere rappresentata come una retta che passa il più vicino possibile a tutti i punti costituiti da input X e output Y.

(17)

2.1.2

Classificazione

La classificazione è una tecnica utilizzata nell’apprendimento con supervisione dove l’obiet-tivo, in base alle analisi di dati precedentemente etichettati, è quello di riuscire a prevedere l’etichettatura delle classi di dati future.

Questo insieme di dati può essere semplicemente di due classi (come identificare se la persona è maschio o femmina o che la posta è spam o non spam) o può anche essere di più classi.

Il processo di classificazione può essere suddiviso in tre fasi:

1. Addestramento: si produce un modello da un insieme di addestramento.

2. Stima dell’accuratezza: si stima l’accuratezza del modello usando un insieme di test. 3. Utilizzo del modello: si classificano istanze di classe ignota.

Ci sono diversi algoritmi che permettono di svolgere l’attività di classificazione, di seguito alcuni esempi:

• Naïve Bayes

• Reti neurali

• Macchine a vettori di supporto (SVM)

• Regressione Logistica

• Random Forest

• Alberi di decisione

(18)

2.1.2.1 Support Vector Machine

Support Vector Machine, abbreviato come SVM, è un algoritmo preferito da molti esperti di machine learning in quanto produce una precisione significativa con meno potenza di cal-colo rispetto ad altri algoritmi di classificazione.

SVM può essere utilizzato sia per attività di regressione che di classificazione ma è ampia-mente usato negli obiettivi di classificazione e questo progetto ne è l’esempio.

L’obiettivo del support vector machine è quello di trovare un iperpiano in uno spazio N-dimensionale, dove N è il numero di features, che classifica distintamente i data points.

(19)

Per separare le due classi, ci sono molti possibili iperpiani che potrebbero essere scelti. L’obiettivo è quello di trovare un piano che ha il margine massimo, cioè la distanza massima tra i punti di entrambe le classi.

La massimizzazione della distanza del margine fornisce un’importante informazione in mo-do che i futuri punti possano essere classificati con maggiore sicurezza.

Figura 2.3: Esempio di iperpiano ottimale, preso da [2]

Gli iperpiani sono limiti decisionali che aiutano a classificare i data points.

I punti che cadono su entrambi i lati dell’iperpiano possono essere attribuiti a diverse classi. Inoltre, la dimensione dell’iperpiano dipende dal numero di features: se il numero di caratte-ristiche di input è 2, allora l’iperpiano è una retta, se il numero di elementi di input è 3, allora l’iperpiano diventa un piano bidimensionale, ovviamente diventa difficile immaginare cosa avviene con un numero di features maggiore di 3.

I vettori di supporto sono i punti più vicini all’iperpiano e quindi ne influenzano la posizione e l’orientamento, il loro utilizzo massimizza il margine del classificatore. Tali punti dipendono

(20)

Per riuscire a identificare l’iperpiano che meglio divide i vettori di supporto in classi, l’algo-ritmo esegue questi step:

1. Cerca un iperpiano linearmente separabile o un limite di decisione che separa i valori di una classe dall’altro. Se ne esiste più di uno, cerca quello che ha margine più alto con i vettori di supporto, per migliorare l’accuratezza del modello.

2. Se tale iperpiano non esiste, SVM utilizza una mappatura non lineare per trasformare i dati di allenamento in una dimensione superiore (a due dimensioni, valuterà i dati in 3 dimensioni). In questo modo, i dati di due classi possono sempre essere separati da un iperpiano, che sarà scelto per la suddivisione dei dati.

(21)

2.1.2.2 Random forest

Il Random forest è un classificatore d’insieme composto da alberi decisionali, ovvero da modelli predittivi, i cui nodi interni rappresentano le variabili, un arco verso un nodo figlio rappresenta un possibile valore per quella proprietà e una foglia il valore predetto per la variabile obiettivo a partire dai valori delle altre proprietà.

Con "path" dell’albero si intende il cammino che parte dal nodo root, passa sui nodi che rappresentano le altre proprietà, e arriva al nodo foglia, che di conseguenza è influenzato dalle ’risposte’ alle ’domande’ precedenti.

Figura 2.4: Esempio di albero di decisione, preso da [3]

Normalmente un albero di decisione viene costruito utilizzando tecniche di apprendimento a partire dall’insieme dei dati iniziali, il quale può essere diviso in due sottoinsiemi: il training set sulla base del quale si crea la struttura dell’albero e il test set che viene utilizzato per testare l’accuratezza del modello predittivo così creato.

(22)

Nel data mining un albero di decisione viene utilizzato per classificare le istanze di grandi quantità di dati (per questo viene anche chiamato albero di classificazione).

In questo ambito un albero di decisione descrive una struttura ad albero dove i nodi foglia rappresentano le classificazioni e le ramificazioni l’insieme delle proprietà che portano a quelle classificazioni.

Di conseguenza ogni nodo interno risulta essere una macro-classe costituita dall’unione delle classi associate ai suoi nodi figli.

L’idea fondamentale dietro il random forest è quella di combinare molti alberi decisionali in un unico modello.

Individualmente, le previsioni fatte dagli alberi decisionali possono non essere accurate, ma combinate insieme, le previsioni saranno in media più vicine al target cercato. Un random forest è migliore di un singolo albero decisionale in quanto ogni albero porta la propria ’esperienza’, Inoltre, ogni albero decisionale nella foresta considera un sottoinsieme casuale di caratteristiche quando si formano le domande e ha accesso solo ad un insieme casuale di punti di dati di formazione.

Questo aumenta la diversità nella foresta, portando a previsioni generali più solide; quando arriva il momento di fare una previsione, il bosco casuale prende una media di tutte le singole stime degli alberi decisionali se si tratta di un problema di regressione, se si vuole classificare invece ogni albero darà un ’voto’ alla classe prevista e la foresta sceglierà la label più votata.

(23)

L’algoritmo di random forest è tra i più apprezzati, ecco alcune sue caratteristiche:

• Funziona in modo efficiente su grandi basi di dati.

• Può gestire migliaia di variabili di input.

• Fornisce stime di quali variabili sono importanti nella classificazione.

• Dispone di un metodo efficace per stimare i dati mancanti e mantiene l’accuratezza quando ne mancano in gran parte.

• Dispone di metodi per bilanciare gli errori nelle classi di dati non equilibrati della popolazione.

• Le foreste generate possono essere salvate per un uso futuro su altri dati.

• Vengono calcolati prototipi che forniscono informazioni sulla relazione tra le variabili e la classificazione.

(24)

2.2

Apprendimento non supervisionato

L’apprendimento non supervisionato è una tecnica di apprendimento automatico che con-siste nel fornire al con-sistema informatico una serie di input (esperienza del con-sistema) che egli riclassificherà ed organizzerà sulla base di caratteristiche comuni per cercare di effettua-re ragionamenti e peffettua-revisioni sugli input successivi. La validità di questi algoritmi è legata all’utilità delle informazioni che riescono ad estrarre dalla base di dati.

Le tecniche di apprendimento non supervisionato lavorano confrontando i dati e ricercando similarità o differenze. Sono molto efficienti con elementi di tipo numerico, dato che possono utilizzare tutte le tecniche derivate dalla statistica, ma risultano essere meno efficienti con dati non numerici.

Principali algoritmi:

• Clustering

• Regole di associazione

2.2.1

Clustering

Il clustering è una tecnica di Machine Learning che prevede il raggruppamento di punti dati in classi omogenee. Dato un insieme di punti, si può usare un algoritmo di clustering per classificare ogni punto in un gruppo specifico.

Questi gruppi vengono, per l’appunto, chiamati cluster e sono un insieme di oggetti che pre-sentano tra loro delle similarità, ma che, per contro, prepre-sentano dissimilarità con oggetti in altri cluster.

L’input di un algoritmo di clustering è costituito da un campione di elementi, mentre l’output è dato da un certo numero di cluster in cui gli elementi del campione sono suddivisi in base a una misura di similarità.

Gli algoritmi di clustering forniscono come output anche la descrizione delle caratteristiche di ciascun cluster, il che è fondamentale per poi prendere decisioni strategiche sulle azioni da compiere verso tali gruppi.

(25)

Il clustering è un metodo di apprendimento non supervisionato ed è una tecnica comune per l’analisi statistica dei dati utilizzata in molti campi:

• Ricerche di mercato

• Riconoscimento di pattern

• Segmentazione del mercato

• Posizionamento dei prodotti

• Analisi dei social network

• Identificazione degli outliers

2.2.1.1 Tecniche di clustering

Le tecniche di clustering si possono basare principalmente su due "filosofie":

• Dal basso verso l’alto (metodi aggregativi o bottom-up):

Questa filosofia prevede che inizialmente tutti gli elementi siano considerati cluster a sé, e poi l’algoritmo provvede ad unire i cluster più vicini. L’algoritmo continua ad unire elementi al cluster fino ad ottenere un numero prefissato di cluster, oppure fino a che la distanza minima tra i cluster non supera un certo valore, o ancora in relazione ad un determinato criterio statistico prefissato.

• Dall’alto verso il basso (metodi divisivi o top-down):

All’inizio tutti gli elementi sono un unico cluster, e poi l’algoritmo inizia a dividere il cluster in tanti cluster di dimensioni inferiori. Il criterio che guida la divisione è natural-mente quello di ottenere gruppi sempre più omogenei. L’algoritmo procede fino a che non viene soddisfatta una regola di arresto generalmente legata al raggiungimento di un numero prefissato di cluster.

(26)

Queste tecniche si possono nuovamente suddividere a dipendenza della possibilità che un elemento possa o meno essere assegnato a più cluster o tenendo conto del tipo di algoritmo utilizzato per dividere lo spazio:

• Clustering esclusivo: ogni elemento può essere assegnato ad uno e ad un solo gruppo. Quindi i cluster risultanti non possono avere elementi in comune. Questo approccio è detto anche hard clustering.

• Clustering non-esclusivo, in cui un elemento può appartenere a più cluster con gradi di appartenenza diversi. Questo approccio è noto anche con il nome di soft clustering o fuzzy clustering, dal termine usato per indicare la logica fuzzy.

• Clustering partizionale (detto anche non gerarchico, o k-clustering), in cui per definire l’appartenenza ad un gruppo viene utilizzata una distanza da un punto rappresenta-tivo del cluster (centroide, medioide ecc.), avendo prefissato il numero di gruppi della partizione risultato.

Gli algoritmi di clustering partizionali sono più adatti a data set molto grandi, per i quali la costruzione di una struttura gerarchica dei cluster porterebbe a uno sforzo computazionale molto elevato.

• Clustering gerarchico, in cui viene costruita una gerarchia di partizioni caratterizzate da un numero (de)crescente di gruppi, visualizzabile mediante una rappresentazione ad albero (dendrogramma), in cui sono rappresentati i passi di accorpamento/divisio-ne dei gruppi.

(27)

2.2.1.2 Kmeans

Il clustering K-means è uno degli algoritmi di apprendimento automatico non supervisionato e partizionale tra i più semplici e popolari; esso trova un numero fisso di cluster in un insie-me di dati.

L’obiettivo che l’algoritmo si prepone è di minimizzare la varianza totale intra-cluster. Ogni cluster viene identificato mediante un centroide o punto medio.

L’algoritmo segue una procedura iterativa; inizialmente crea K partizioni e assegna ad ogni partizione i punti d’ingresso casualmente o usando alcune informazioni euristiche; quindi calcola il centroide di ogni gruppo.

Costruisce, di conseguenza, una nuova partizione associando ogni punto d’ingresso al clu-ster il cui centroide è più vicino ad esso, infine vengono ricalcolati i centroidi per i nuovi cluster e così via, finché l’algoritmo non converge.

Vediamo più nel dettaglio come funziona l’algoritmo passo per passo: 1. Inizializzazione k-means

• Lo si fa scegliendo l’ampiezza del set di dati e k centroidi iniziali disposti casual-mente. Scegliendo il numero di centroidi, si scelgono i cluster cui il data set sarà composto e quindi i raggruppamenti che si vogliono effettuare e visualizzare. 2. Assegnazione del cluster

• l’algoritmo analizza ciascuno dei data points e li assegna al centroide più vicino. Quindi viene calcolata la distanza euclidea1tra ogni data points e ogni centroide.

Ogni data points sarà poi assegnato al centroide la cui distanza risulti minima.

Questo è il riassunto di ciò che avviene in termini matematici:

arg min

ci∈ C

dist(ci, x)2

(28)

3. Aggiornamento della posizione del centroide

• Dopo il passaggio 2 è probabile che si siano formati nuovi cluster, in quanto a quelli precedenti si saranno assegnati (o tolti a seconda che essi siano passati ad un altro cluster) nuovi data points. Di conseguenza, si ricalcola la posizione media dei centroidi. Il nuovo valore di un centroide sarà la media di tutti i data points che sono stati assegnati al nuovo cluster, matematicamente parlando ci troviamo in questa situazione:

ci = 1 |Si| X xi∈ Si xi

Dove Si rappresenta la somma dei data points assegnati al cluster i-esimo. Si ottiene la nuova posizione del centroide dalla media di tutti i data points assegnati al cluster nello step precedente.

Dopodiché i passaggi 2 e 3 verranno ripetuti finché i centroidi non verranno più modificati, ossia si raggiunge un punto di convergenza tale per cui non si hanno più modifiche dei cluster.

I questi casi vuol dire che si è raggiunta la condizione di stop, questo avviene quando si verificano una delle seguenti opzioni:

• nessun data points cambia cluster;

• la somma delle distanze è ridotta al minimo;

(29)

Capitolo 3

Tecnologie utilizzate

Un altro aspetto da considerare prima di concentrarci sullo sviluppo vero e proprio è quello delle tecnologie utilizzate.

Ovviamente navigando per il web si trovano un’immensa varietà di linguaggi e IDE che si potrebbero utilizzare per progetti di data science e machine learning, questo capitolo elenca quelli che sono stati scelti.

Le scelte sono state influenzate sia da un background già acquisito durante il percorso sco-lastico, sia dalle esperienze dei data scientist.

Anche alcune librerie, solo le più importanti, verranno brevemente descritte per comprende-re il loro utilizzo.

Inoltre, non meno importanti, vengono elencate anche le tecnologie utilizzate per la gestione dei database e le interrogazioni con quest’ultimi.

(30)

3.1

Linguaggi

Tecnologia Nome Descrizione

Python

Python è un linguaggio di programmazione ad alto livello, orientato agli oggetti, adatto, tra gli altri usi, a sviluppare applicazioni distribuite, scripting, computazione numerica e system testing.

Per il progetto è stato scelto perché, per quanto riguarda il machine learning e il data science, le sue librerie per analisi dei dati e calcolo numerico, quali Numpy, Pandas, Scikit-learn ecc., lo rendono il linguaggio ideale.

Inoltre, se si hanno già delle conoscenze di base di programmazione, è molto semplice da imparare e utilizzare.

SQL

In informatica, SQL (Structured Query Language) è un linguaggio standardizzato per database basati sul modello relazionale (RDBMS).

Come verrà descritto più avanti, i dati disponibili provenivano da tre diversi database, di conseguenza si è utilizzato SQL per le interrogazioni.

Indispensabile per tutta la durata del progetto per l’analisi dei dati e soprattutto per verificare la veridicità dei risultati.

(31)

3.2

Piattaforme

Tecnologia Nome Descrizione

MySQL

MySQL o Oracle MySQL è un Relational database mana-gement system (RDBMS) composto da un client a riga di comando e un server.

È il database open source più diffuso al mondo e inoltre, ha ottime performance e un elevato fattore di sicurezza.

Nel corso del progetto è stato utilizzato per far eseguire gli script sql e di conseguenza creare localmente i database.

DataGrip

DataGrip è un ambiente di gestione di database per svilup-patori. È progettato per l’interrogazione, la creazione e la gestione di database.

Per utilizzare questo IDE si è creata una connessione con MySQL, in questo modo si poteva lavorare sui database preventivamente creati.

Necessario per tutta la durata del progetto in quanto le query e quindi le interrogazioni al database sono state eseguite in questo ambiente di sviluppo.

Anaconda

Anaconda è una distribuzione gratuita e open-source dei linguaggi di programmazione Python e R per l’informatica scientifica.

Le versioni dei pacchetti sono gestite dal sistema di gestione dei pacchetti conda.

(32)

Tecnologia Nome Descrizione

Jupyter

Project Jupyter è un’organizzazione no-profit creata per sviluppare software open-source, standard aperti e servizi per il calcolo interattivo in decine di linguaggi di programmazione. Per il progetto è stato utilizzato Jupyter Notebook che è un’ap-plicazione client-server che consente di modificare ed esegui-re documenti notebook (documenti prodotti dalla Jupyter No-tebook, che contengono sia codici informatici che elementi di testo) tramite un browser web.

PyCharm

PyCharm è un ambiente di sviluppo integrato utilizzato nella programmazione informatica, in particolare per il linguaggio Python.

Fornisce analisi del codice, un debugger grafico, un tester integrato di unità, integrazione con sistemi di controllo delle versioni.

Il progetto finale è stato tutto implementato in PyCharm per la praticità di tale IDE.

(33)

3.3

Librerie

Tecnologia Nome Descrizione

Pandas

Pandas è una libreria software scritta per il linguaggio di programmazione Python per la manipolazione e l’analisi dei dati. In particolare, offre strutture dati e operazioni per manipolare tabelle numeriche e serie temporali.

È un software libero rilasciato sotto la licenza BSD.

Indispensabile fin dal principio dello sviluppo del progetto per riuscire a creare un dataframe iniziale partendo dalla query sui database, più altre funzionalità che si incontreranno oltre.

NumPy

NumPy è una libreria open source per il linguaggio di pro-grammazione Python, che aggiunge supporto a grandi matrici e array multidimensionali insieme a una vasta collezione di funzioni matematiche di alto livello per poter operare efficien-temente su queste strutture dati.

Per il progetto è stata ampiamente utilizzata, appunto, per la facile gestione di array semplici e multidimensionali e soprat-tutto per le funzioni matematiche messe a disposizione per calcolare velocemente medie, deviazioni standard ecc.

Scikit-learn

Scikit-learn è una libreria open source di apprendimento automatico per il linguaggio di programmazione Python. Contiene algoritmi di classificazione, regressione, clustering e macchine a vettori di supporto, regressione logistica, classifi-catore bayesiano, k-mean e DBSCAN.

Questa libreria è il cuore di tutto il progetto in quanto contiene tutti gli algoritmi sopracitati di cui l’implementazione e gli import specifici verranno dettagliati nei capitoli successivi.

(34)

Tecnologia Nome Descrizione

Plotly

Plotly è una società di informatica tecnica che sviluppa strumenti di analisi dei dati online e di visualizzazione.

Plotly fornisce strumenti grafici, analitici e statistici online per gli individui oltre a librerie di grafici scientifici per Python, R, MATLAB e altri linguaggi.

La libreria grafica Python di Plotly rende interattivi i grafici.

Matplotlib

Matplotlib è una libreria per la creazione di grafici per il linguaggio di programmazione Python e la libreria matematica NumPy.

Con poche righe di codice è possibile generare grafici, isto-grammi, spettri di potenza, diagrammi a barre, diagrammi di errore, diagrammi a dispersione, ecc.

Per l’utente finale, si ha il pieno controllo degli stili tramite un’interfaccia orientata agli oggetti.

(35)

Capitolo 4

Strutturazione dei dati

Appresi i fondamenti teorici degli argomenti riguardanti il progetto, si può passare alla parte pratica dove si spiegherà dettagliatamente in quale modo si è giunti alla realizzazione dei compiti e degli obiettivi prefissati.

Il primo compito, fondamentale per la buona riuscita del progetto, è quello di organizzare e preparare i dati per eseguire l’analisi in modo efficiente.

In questo capitolo ci si vuole soffermare sui passi eseguiti e le scelte intraprese durante questa fase.

(36)

4.1

Database

Come già accennato precedentemente, il progetto enCOMPASS a cui sta lavorando SUPSI, raccoglie informazioni sul consumo di energia elettrica; queste vengono campionate ogni 15 minuti per un insieme di circa 400 utenti.

Queste informazioni sono raccolte in tre database differenti in base al luogo di campio-namento, difatti gli utenti interessati a questo progetto provengono da tre diverse nazioni: Svizzera, Germania e Grecia.

Per riuscire ad accedere alle informazioni, partendo da tre diversi script sql forniti, sono stati ricreati localmente i database utilizzando MySQL, questi sono i comandi usati per creare i database e far eseguire gli script:

Figura 4.1: Comandi per creare database

Anche se i database contengono informazioni diverse, la loro struttura è identica:

• 61 tabelle per ogni database,

• gli attributi, per ogni tabella, sono equivalenti,

• le relazioni tra le tabelle sono le stesse.

L’allegato [1]: Diagramma delle classi, mostra, come suggerito dal nome, il diagramma delle classi di questi database fornendo informazioni sulle tabelle, i loro attributi e le relazioni.

(37)

4.1.1

Classi utilizzate

Dalle informazioni fornite precedentemente si evince che le dimensioni dei database sono abbastanza voluminose, per questo si è deciso di limitare l’analisi del consumo unicamen-te sul profilo dell’uunicamen-tenunicamen-te tralasciando dunque i valori forniti dai sensori inunicamen-terni che fornivano informazioni sull’umidità, la temperatura, la luminanza e la presenza di attività all’interno di una stanza. Anche le condizioni esterne, come per esempio il meteo, non sono state valu-tate. Inoltre, la maggior parte delle tabelle sono superflue allo scopo del progetto.

Eseguendo questo accorgimento il numero di tabelle si è ridotto a un totale di 10, come si può vedere dal diagramma delle classi in figura 4.2.

(38)

Di seguito un’analisi delle tabelle per capire più dettagliatamente il loro contenuto:

• User: contiene le informazioni sull’utente inerenti alla registrazione sull’app creata nel progetto enCOMPASS come per esempio l’username, l’e-mail, il giorno di nascita ecc.

• User_profile: contiene tutte le informazioni dell’utente che interesseranno in seguito l’analisi. Sono prensenti informazioni sugli elettrodomestici, sul numero di componenti del nucleo famigliare ecc.

• Heating_source_type: indica il tipo di fonte di riscaldamento, in questo caso può essere a olio, a elettricità, a gas oppure a legna.

• Heating_type: anche questa tabella è sul riscaldamento, qui le informazioni possono essere elementi radiatori, serpentina a pavimento oppure convezione d’aria

• Main_lighting_type: indica il tipo di illuminazione principale dove le lampadine posso-no essere alogene, led, a basso consumo o a incandescenza; c’è anche la possibilità che l’utente non sia a conoscenza di questa informazione.

• Dwelling: contiene le informazioni sull’abitazione a livello di nucleo familiare, indispen-sabile per la connessione tra l’utente e lo smart meter.

• Building: contiene le informazioni sul palazzo fisico.

• Building_type: procura le informazioni sul tipo di palazzo che potrebbe essere una casa indipendente, un appartamento, una casa bifamiliare, una villetta a schiera, un edificio pubblico, una scuola oppure degli edifici residenziali.

• Smart_meter: contiene le informazioni sul contatore intelligente installato nelle abita-zioni

• Meter_consumption: contiene i valori di consumo campionati dallo smart meter e l’istante di tempo a cui fa riferimento.

(39)

4.2

Pretrattamento dei dati

Ora che è stato ridotto il numero di tabelle e si è a conoscenza di dove si trovano le infor-mazioni necessarie, ci si può concentrare sulla loro analisi più approfondita.

Come già accennato in precedenza, le date di inizio e fine campionamento non sono uguali per i tre database, dunque si è scelto un arco di tempo della durata di un anno partendo dal’01/06/2018 fino al’31/05/2019.

Sempre sulla questione date, un ulteriore taglio è stato eseguito sulle festività: con un pic-colo script sono state calcolate tutte le domeniche presenti nelle dodici mensilità e per ogni nazione sono stati inseriti i giorni festivi di maggior importanza.

La lista di queste date viene esclusa dalla query finale e di conseguenza le informazioni del consumo di quelle giornate non saranno presenti nell’analisi, questa scelta è avvenuta in quanto durante le domeniche e i giorni festivi è molto più probabile consumare maggior-mente poiché è possibile che tutto il nucleo familiare si trovi nell’abitazione o viceversa. Inoltre, le festività variano a seconda della nazione e per tali giorni le informazioni, non es-sendo eque, avrebbero ’sporcato’ i risultati finali.

Il progetto si vuole concentrare sullo studio del profilo dei semplici utenti considerando un insieme di features e di valori equi, per questa motivazione si sono eliminati gli edifici che non erano abitazioni private come per esempio le scuole e i municipi.

All’interno dei database sono presenti degli utenti di test che devono essere rimossi. Dopo le rimozioni eseguite sulle date e sugli edifici, per alcuni utenti persistevano alcune infor-mazioni contrastanti. In accordo con il relatore si è deciso di non considerare gli utenti del database greco poiché nel corso del progetto enCOMPASS non ci sono stati più contatti con il rispettivo istituto di ricerca che gestisce il database e dunque le informazioni presenti non erano molto affidabili. Per quanto concerne il database tedesco, ci sono alcuni utenti che hanno abbandonato il progetto e altri i quali dati riportano dei buchi temporali significativi, anche questi utenti sono stati rimossi.

(40)

La query finale utilizzata per interrogare il database e creare i primi dataframe con le restrizioni sopraelencate è la seguente:

Figura 4.3: Query finale per interrogare i database

Dove con ’building’ si fa riferimento al tipo di edificio accettato, nel nostro caso quelli resi-denziali, ’final_string’ contiene tutta la lista delle date da non considerare e i numeri fanno riferimento agli id degli utenti che devono essere rimossi per un totale di 27 utenti.

Otteniamo due dataframe, uno utilizzando il database svizzero e l’altro usando quello tede-sco. Per delle analisi che vogliamo svolgere in seguito, a entrambi aggiungiamo due colonne nominate ’Switzerland’ e ’Germany’ che potranno assumere il valore 0 o 1 a seconda se il dato da analizzare proviene da uno piuttosto che dall’altro dataframe; in questo modo man-teniamo l’informazione sulla nazionalità. Questa modalità è denominata one-hot encoding e verrà spiegata successivamente.

Per ottenere un unico dataframe eseguiamo una semplice concatenazione dei due, purtrop-po questo dataframe contiene dei valori NaN (tramandati dai due dataframe iniziali) che non permettono l’avanzamento delle operazioni necessarie a realizzare i cluster e la classifica-zione.

Per sostituire questi valori è stata dapprima effettuata un’interpolazione lineare ma analiz-zando più approfonditamente i dati in possesso non è risultata la scelta più adatta in quanto potevano esserci molti NaN consecutivi o capitava che i valori scelti per interpolare non fossero adatti. Tenendo conto che i dati di campionamento non sono pochi, analizzando il problema con il relatore, si è deciso semplicemente di rimuoverli utilizzando la funzione dropna().

(41)

Ricapitolando, eliminando dall’analisi tutti gli utenti greci più quelli problematici, il numero di utenti è più che dimezzato passando da 448 a 179. Facendo un breve calcolo si può capire con quante informazioni si andrà a lavorare durante l’analisi. I campionamenti avvengono ogni 15 minuti, quindi nell’arco della giornata sono 96 in totale. L’analisi è stata delimitata a un anno di rilevamenti, quindi 365 giorni. Per ogni utente si hanno dunque 35’040 dati sul consumo, in totale moltiplicando questo numero per il numero di utenti analizzabili si arriva teoricamente a 6’272’160, andando però a controllare la dimensione del dataframe completo a cui sono stati rimossi i valori NaN otteniamo 5’058’941 che nonostante tutte le restrizioni è un ottimo numero per permettere la buona riuscita dell’analisi.

4.2.1

One-hot encoding

One-hot encoding è un processo mediante il quale le variabili categoriche1vengono conver-tite in una forma che permette agli algoritmi di machine learning di fare un lavoro migliore durante la previsione.

Si tratta semplicemente di creare delle nuove colonne corrispondenti ai valori che può as-sumere la variabile categorica, dopodiché verrà inserito il valore 1 se la condizione è soddi-sfatta oppure 0 in caso contrario.

Questo approccio, come anticipato prima, è stato utilizzato per inserire le informazioni sulla nazionalità ma anche per i tipi di riscaldamento, i tipi di luce e i tipi di edifici. Di seguito sono riportate alcune immagini esempio catturate dal dataframe.

(42)

Figura 4.6: One-hot encoding con building type

4.3

Creazione dataframes

Applicato il processo di one-hot encoding, un’ultima miglioria da applicare al dataframe è quella di eliminare le colonne non rilevanti al fine ultimo del progetto poiché per tutti gli utenti è presente lo stesso valore e di conseguenza la feature risulta inutile. Si pensi al frigo o alla televisione che possiedono tutti.

Si ottiene, finalmente, il dataframe unico e completo, con un totale di 44 colonne equivalenti alle features di interesse. Le informazioni sul consumo sono però abbastanza insignificanti in quanto sono presenti i campionamenti ogni quarto d’ora, di conseguenza si creano dei nuovi dataframes aggregando i dati del consumo, ottenendo in questa maniera i consumi medi per ogni utente.

Il primo dataframe creato contiene la media giornaliera mensile, per ottenere questa aggre-gazione si sono dapprima sommati i valori del consumo di un singolo giorno ottenendo così il consumo giornaliero, dopodiché dei valori trovati si è eseguita la media per ogni mese. Il problema principale nella creazione di questo dataframe nasce dai valori in cui l’ultimo giorno contiene la somma dei consumi di tutto il mese, per ovviare a questo il consumo indicato viene diviso per il numero di giorni di quello specifico mese in modo da ottenere approssimativamente il consumo medio giornaliero per quel mese.

Inoltre, per questo dataframe non si voleva perdere l’indicazione sulla mensilità a cui il va-lore medio trovato fa riferimento, per questo le informazioni sono state aggiunte in modalità one-hot encoding. (Figura 4.7)

(43)

La figura 4.8 mostra il codice d’esempio su un’aggregazione mensile dove si va a calcolare la media dei valori.

Figura 4.8: Aggregate method

Per utilizzare i metodi di aggregazione, l’indice del dataframe dev’essere di tipo DateTime, le prime due righe di codice servono per l’appunto a impostare come indice la colonna ’da-tetime’ che contiene le informazioni sull’istante di tempo in cui è stato campionato il valore del consumo.

Il groupby() è indispensabile per avere i dati raggruppati per ogni utente (si vuole la media di quel determinato mese per quel determinato utente e non la media di quel mese di tutti gli utenti), infine il resample con chiave ’M’ che identifica la mensilità non fa altro che aggregare i dati su base mensile eseguendo la media dei valori.

Tutte le funzioni di aggregazione sono impostate con la stessa metodologia.

Il secondo dataframe contiene la media mensile per ogni utente, è stato creato ottenendo dapprima il consumo totale per ogni mese, quindi facendo un’aggregazione su base mensile e sommando i valori, e infine si è calcolata la media dei valori trovati.

Il terzo dataframe è molto semplice: contiene il consumo di tutto l’anno per ogni utente. Nel quarto dataframe invece troviamo unicamente i consumi giornalieri.

Il quinto e il sesto contengono le media mensile stagionale, per crearli si sono dapprima calcolati i consumi per ogni mese e poi si è fatta la media dei mesi che compongono una determinata stagione. La differenza tra i due si consegue nella suddivisione delle stagiona-lità, il primo è basto su quattro stagione mentre il secondo su tre unendo assieme primavera e autunno.

Per entrambi i dataframe sono state aggiunte, in modalità one-hot encoding, le informazioni per tenere traccia della stagione a cui si fa riferimento.

(44)

Le tabelle delineano come sono stati assegnati i mesi a seconda delle stagioni. Estate Giugno, Luglio, Agosto

Autunno Settembre, Ottobre, Novembre Inverno Dicembre, Gennaio, Febbraio Primavera Marzo, Aprile, Maggio

Tabella 4.1: Mensilità per quattro stagioni

Estate Giugno, Luglio, Agosto Autunno_Primavera Settembre, Ottobre, Novembre

Marzo, Aprile, Maggio Inverno Dicembre, Gennaio, Febbraio

Tabella 4.2: Mensilità per tre stagioni

I restanti dataframe sono gli stessi elencati precedentemente ma privati degli outliers. Per individuarli si è applicato il metodo dello z-score2con una threshold pari a 3, il che vuol dire che un punto viene considerato outlier se dista dalla media± 3 deviazioni standard.

La prima parte molto significativa e a cui si è dedicato un lasso di tempo importante, in quanto è indispensabile che il pretrattamento dei dati sia eseguito correttamente per non avere informazioni inconsistenti, è terminata.

Riassumendo sono stati creati un totale di dodici dataframe, ognuno con le proprie caratte-ristiche.

1 Media giornaliera mensile 2 Media mensile 3 Consumo annuo 4 Consumi giornalieri

5 Media mensile stagionale (4 stagioni) 6 Media mensile stagionale (3 stagioni) 7-8-9-10-11-12 Dataframe replicati, senza outliers

Tabella 4.3: Dataframe creati

(45)

Capitolo 5

Analisi

Una volta portato a termine il primo compito, tutti i dataframe sono pronti per l’analisi. Ora ci dedicheremo alla seconda parte dei compiti dove, come ricordiamo, viene richiesto di identificare i principali fattori che influenzano il consumo e di utilizzare algoritmi di clustering per organizzare i gruppi di utenti, infine essere in grado di assegnare un nuovo utente al suo cluster di appartenenza.

Gli algoritmi scelti sono quelli già spiegati nel capitolo 2, se in quel contesto ci eravamo soffermati sui fondamenti teorici ora ci concentreremo sull’esecuzione.

5.1

Regressione lineare

La regressione lineare è implementata nella libreria Scikit-learn, tabella 3.3, per poterla utilizzare è necessario dapprima importare la relativa libreria:

from s k l e a r n . l i n e a r _ m o d e l import L i n e a r R e g r e s s i o n

(46)

maggior-no_of_adults_older_than_16 565.1427600357491 no_of_kids_younger_than_16 741.1684507714189 no_of_pets 202.546953791628 heat_pump 1391.1521885307036 electric_hot_plates 1052.4576008815611 hi_fi -142.00684889327124 Electricity 1052.8174405824907 Tabella 5.1: Alcuni esempi dei coefficienti

Questa valutazione dei coefficienti è stata eseguita per tutti i dataframe creati, quello più si-gnificativa è stato quello che contiene la somma dei consumi giornalieri in quanto possiede un maggior numero di righe rispetto agli altri, ma più o meno i valori dei coefficienti sono risultati equivalenti per ogni dataframe.

Ora che si conoscono i coefficienti più significativi, verifichiamo con una regressione lineare se sono effettivamente corretti e quanto veramente influenzano sul consumo.

Si realizza una funzione dove viene creato un array X che conterrà i valori delle features scelte e un ulteriore array y che sarà il nostro target, cioè il consumo. Dopodiché dobbiamo splittare questi array per ottenere la X e la y di train per allenare l’algoritmo e la X e la y di test per verificare se l’algoritmo ha lavorato correttamente.

X _ t r a i n , X _ t e s t , Y _ t r a i n , Y _ t e s t = t r a i n _ t e s t _ s p l i t ( X , Y ,

t e s t _ s i z e = 0 . 3 3 , random_state =5) Potrebbe essere che alcune features non siano binarie (es. numero di persone nel nucleo familiare) per questo è buona norma eseguire una standardizzazione1:

ss = S t a n d a r d S c a l e r ( )

X _ t r a i n _ s t d = ss . f i t _ t r a n s f o r m ( X _ t r a i n ) X _ t e s t _ s t d = ss . t r a n s f o r m ( X _ t e s t )

Ora è possibile allenare l’algoritmo e verificare come ha lavorato sul set di test: l l = L i n e a r R e g r e s s i o n ( )

l l . f i t ( X _ t r a i n _ s t d , Y _ t r a i n )

Y _ p r e d _ t e s t = l l . p r e d i c t ( X _ t e s t _ s t d )

Un metodo di valutazione dell’algoritmo è quello di calcolare l’R22che deve risultare almeno più dello 0.3, altrimenti il modello è inutile3.

(47)

Seguendo sempre questi passaggi si possono controllare singolarmente o prese in gruppo le features d’interesse, basta modificare l’array X.

Per il progetto sono state fatte sette funzioni per analizzare le features più significative trovate dopo l’analisi dei coefficienti:

regression_with_good_features ’number_of_rooms’, ’water_boiler’, ’heat_pump’, ’microwave’,’freezer’, ’AC’, ’dishwasher’,

’washing_machine_existence’, ’electric_kettle’, ’Electricity’, ’Independent_house’,’Switzerland’, ’Apartment’,

’Energy_saving_light_bulb’, ’gaming_set’, ’Oil’, ’laptop_computer’, ’hi_fi’, ’dehumidifier’,

’tumble_dryer_existence’

regression_with_good_season ’number_of_rooms’, ’water_boiler’, ’heat_pump’, ’microwave”freezer’, ’AC’, ’dishwasher’,

’washing_machine_existence’, ’electric_kettle’, ’Electricity’, ’Independent_house’,’Switzerland’, ’Apartment’,

’Energy_saving_light_bulb’, ’gaming_set’, ’Oil’, ’laptop_computer’, ’hi_fi’, ’dehumidifier’, ’tumble_dryer_existence’,’Summer’,’Winter’ regression_with_good_seasonmix ’number_of_rooms’, ’water_boiler’, ’heat_pump’,

’microwave”freezer’, ’AC’, ’dishwasher’,

’washing_machine_existence’, ’electric_kettle’, ’Electricity’, ’Independent_house’,’Switzerland’, ’Apartment’,

’Energy_saving_light_bulb’, ’gaming_set’, ’Oil’, ’laptop_computer’, ’hi_fi’, ’dehumidifier’,

’tumble_dryer_existence’,’Summer’,’Winter’,’SpringAutumn

regression_heating ’Electricity’, ’Oil’, ’Gas’ regression_building ’Apartment’, ’Independent_house’ regression_domestic ’laptop_computer’, ’hi_fi’, ’dehumidifier’,

’tumble_dryer_existence’, ’microwave’, ’freezer’, ’dishwasher’, ’washing_machine_existence’, ’electric_kettle’

(48)

5.2

K-means

Anche l’algoritmo di clustering K-means è già implementato in sklearn:

from s k l e a r n . c l u s t e r import KMeans

Con questo algoritmo si è provato un approccio orientato alla classificazione: conoscendo il target di appartenenza di una certa features, si è provato a vedere se il solo valore del consumo potesse bastare a classificarlo nella giusta categoria.

Per esempio, sono presenti le informazioni sulla nazionalità, quindi si è a conoscenza se quel determinato valore del consumo è di un utente svizzero oppure tedesco.

Con il K-Means si creano 2 cluster e si verifica se l’algoritmo è in grado di riconoscere gli utenti in base alla nazionalità. Lo stesso approccio si è sperimentato con i valori dell’heat pump, del riscaldamento elettrico e del tipo di edifici.

Una volta creati i cluster si è utilizzata una nuova metrica, differente da K-means, per identifi-care il cluster a cui assegnare il dato del nuovo utente. In questo caso si è deciso di utilizzare una Logistic Regression4ma la scelta può variare puntando anche a un più semplice K-NN5.

5.2.1

Creazione classi di consumo

Poiché all’interno dei nostri dataframe non c’è alcuna informazione riguardo la classe di appartenenza di un utente in base al suo profilo, ciò significa che manca il target necessario per la classificazione, bisogna creare questa indicazione.

Per farlo sono stati implementati tre approcci:

1. Creazione delle classi solo in base al consumo, dividendo in modo da avere lo stesso numero di utenti per ogni classe. Questo approccio è il più semplice e anche il più scorretto perché così facendo è molto probabile che gli intervalli dei consumi che dividono le classi siano molto squilibrati. Ad esempio, una classe potrebbe avere un intervallo che parte da 40 e finisce a 50 mentre quella successiva inizia con un consumo di 51 e finisce con un consumo di 210.

2. Creazioni delle classi solo in base al consumo, dividendo in base a un range prefis-sato. Questo approccio è meglio rispetto a quello appena visto ma ha il problema inverso, in una classe è molto probabile avere un numero più elevato di utenti rispetto alle altre. Si può intuire che le classi limiti come quelle con consumi troppo bassi o troppo alti siano le più coinvolte.

(49)

equivarranno al numero di cluster per l’algoritmo. Per ogni utente si salva la labels che lo colloca in un certo cluster e quella sarà la sua classe.

Per salvare le informazioni sulle classi appena calcolate sono stati creati altri dataframe, partendo da quelli già illustrati al capitolo 4.3 nella tabella 4.3, aggiungendo la colonna ’Classe’.

5.3

SVM

Come gli altri algoritmi già osservati, anche questo viene già fornito da sklearn:

from s k l e a r n . svm import SVC

Durante il progetto questo algoritmo è stato utilizzato per giungere al completamento del-l’ultimo compito richiesto, quello di classificare i nuovi utenti.

I dataframe da utilizzare sono quelli contenti le informazioni sulla classe, capitolo 5.2.1.

Per questo algoritmo il nostro array X conterrà tutte le informazioni sul profilo dell’utente scartando il consumo e la classe di appartenenza. L’array y, come al solito, sarà il target che in questo caso è la classe.

Il procedimento di split per creare i set di train e di test è il medesimo già illustrato al capitolo 5.1 per l’algoritmo di regressione lineare. L’unica differenza è, naturalmente, l’algoritmo applicato:

s v c l a s s i f i e r = SVC( k e r n e l = ’ l i n e a r ’ , p r o b a b i l i t y =True ) s v c l a s s i f i e r . f i t ( X _ t r a i n , y _ t r a i n )

proba = s v c l a s s i f i e r . p r e d i c t _ p r o b a ( X _ t e s t ) y_pred = s v c l a s s i f i e r . p r e d i c t ( X _ t e s t )

Si è aggiunto il calcolo della probabilità in modo tale da avere un’idea di quanto il classifica-tore si sia sbagliato nel caso di una catalogazione errata.

Per i risultati e i confronti tra le diverse metodologie di creazione delle classi si faccia riferimento al capitolo 6

(50)

5.4

Random Forest

Questo è l’ultimo algoritmo, ma non il meno importante. Anche il Random forest risolve i problemi di classificazione ed è disponibile su sklearn:

from s k l e a r n . ensemble import R a n d o m F o r e s t C l a s s i f i e r

Anche per questo algoritmo i dataset da utilizzare saranno quelli creati con le informazioni sulla classe.

Gli array X e y sono gli stessi dell’SVM, capitolo 5.3, così come l’operazione di split. c l f = R a n d o m F o r e s t C l a s s i f i e r ( n _ e s t i m a t o r s =100)

c l f . f i t ( X _ t r a i n , y _ t r a i n ) y_pred = c l f . p r e d i c t ( X _ t e s t ) proba = c l f . p r e d i c t _ p r o b a ( X _ t e s t )

N_estimators serve a specificare il numero di alberi decisionali che si vogliono utilizzare al-l’interno della foresta.

Oltre alla classificazione, random forest permette di determinare le features importanti ri-tornandoti uno score per ognuna di esse. Queste informazioni sono presenti nell’attributo feature_importances_ già presente nell’algoritmo:

f e a t u r e _ i m p = pd . S e r i e s ( c l f . f e a t u r e _ i m p o r t a n c e s _ ,

i n d e x =X . columns ) . s o r t _ v a l u e s ( ascending = F al se )

Questa qualità aggiuntiva ci da la possibilità di riesaminare le features e scartare quelle con uno score basso. Ci aspettiamo che togliendo i valori insignificanti per la classificazione, l’algoritmo possa ottenere prestazioni migliori. Quindi dall’array C togliamo quelle colonne insignificanti: X = d f . drop ( [ ’ o i d ’ , ’ s m a r t _ m e t e r _ o i d ’ , ’ c l a s s e ’ , ’ consumption ’ , ’ Semi_detached ’ , ’ dishwasher ’ , ’ e l e c t r i c _ h o t _ p l a t e s ’ , ’ d e h u m i d i f i e r ’ , ’ I n c a n d e s c e n t _ l i g h t _ b u l b ’ , ’ vacuum_cleaner ’ , ’D . K . ’ , ’ e l e c t r i c _ c a r ’ , ’ A i r _ c o n v e c t i o n ’ , ’ Terraced_house ’ ] , 1 ) y = d f [ ’ c l a s s e ’ ] . v a l u e s

(51)

Capitolo 6

Risultati

Nel capitolo precedente sono stati enunciati tutti gli algoritmi utilizzati, ora si vedrà come si sono comportati e quali sono i risultati ottenuti da queste analisi.

Essendo che i dataframe creati e gli algoritmi da verificare sono molti, in questa documenta-zione ci limitiamo a visionare i risultati per due solo dataframe, quello con la media mensile e quello con la media mensile stagionale privati degli outliers. Tutti gli altri risultati si possono ricavare direttamente dal progetto.

(52)

6.1

Features

Come visto nel capitolo 5.1, le features importanti sono state estrapolate studiando i coef-ficienti, partendo da quelle conoscenze si sono create delle funzioni che processavano la regressione lineare su un determinato insieme di features. Se non si ricorda il dettaglio di ogni features in base alla funzione si faccia riferimento alla tabella 5.2.

Le immagini sottostanti mostrano i risultati per i due dataframe selezionati.

Figura 6.1: Risultati regressione dataframe mensile

Figura 6.2: Risultati regressione dataframe stagionale

I risultati sono abbastanza soddisfacenti per entrambi i dataset, soprattutto nella regressione dove prendiamo in considerazione tutte le features risultate significative dopo l’analisi dei coefficienti. Sulla regressione dove studiamo le features sul tipo di edificio e quella dove raggruppiamo tutti i tipi di elettrodomestici forniscono dei risultati meno soddisfacenti, ciò significa che congiuntamente alle altre informazioni sono significative per determinare il consumo, ma non abbastanza per esserlo anche singolarmente. Si può dunque affermare che le feature che aggravano di più sul consumo sono quelle utilizzate nella regressione completa, più dettagliatamente quelle strettamente correlate sono: il riscaldamento elettrico, la pompa di calore, il boiler dell’acqua e l’aria condizionata.

(53)

Anche con random forest, al capitolo 5.4, sono stati trovati i coefficienti significativi.

La differenza sostanziale è che per la regressione di cui si è discusso precedentemente si cercava di individuare le features importanti per il consumo; con random forest l’obiettivo consisteva invece nel determinare la classe di appartenenza, quindi i risultati non sono gli stessi.

Inoltre, il random forest è eseguito su tre tipologie di dataframe diversi in base a come sono state create le classi.

Di seguito sono riportati dei grafici che mostrano l’importanza delle features, la funzione di random forest utilizzata è quella dove sono state rimosse già alcune features ritenute insignificanti.

(54)
(55)

6.2

Cluster

Il tentativo di utilizzare l’algoritmo K-Means come classificatore non ha portato i risultati spe-rati. L’algoritmo sicuramente non riesce a identificare, basandosi solo sul consumo, la netta appartenenza di un valore a una determinata categoria.

Inoltre, anche il clustering in generale non fornisce informazioni significative per eventual-mente eseguire ulteriori analisi. I cluster tendono a suddividere le informazioni tra chi con-suma tanto e chi concon-suma poco.

Si potrebbero fare alcune osservazioni interessanti per esempio sulla nazionalità perché è facilmente intuibile che gli svizzeri consumino di più dei tedeschi.

Come ci si poteva aspettare anche dai risultati delle features appena eseguite chi possiede il riscaldamento elettrico ha un consumo più elevato rispetto a chi utilizza altre fonti.

(56)
(57)
(58)

6.3

Classificatori

I classificatori scelti sono due, l’SVM e il Random Forest.

Come già specificato le classi di appartenenza sono state selezione con tre tipologie diffe-renti, ora andremo a osservare i risultati ottenuti valutando quale assegnamento risulta il più attendibile e se eventualmente c’è un classificatore migliore.

6.3.1

Confronto tra algoritmi

Andremo a confrontare i nostri classificatori valutando i risultati ottenuti con le tre differenti assegnazioni.

Per ogni classificatore si è in possesso delle seguenti informazioni:

• Matrice di confusione: restituisce una rappresentazione dell’accuratezza. Ogni co-lonna della matrice rappresenta i valori predetti, mentre ogni riga rappresenta i valori reali.

• Report di classificazione: restituisce alcune informazioni utile come per esempio la precisione del classificatore.

• Accuratezza: restituisce l’accuratezza totale del classificatore

• Tabella probabilità: mostra le probabilità che il classificatore assegna a un elemento di appartenere alle classi, se il classificatore fa una classificazione errata si può valutare se ha sbagliato di molto.

• Forchetta di consumo: sul set di test torna la forchetta di consumo dei nuovi utenti, se sono stati classificati correttamente

Valutare tutti i risultati anche solo dei due dataframe selezionati diventa davvero dispendio-so, per questo la scelta verrà alternata.

(59)

6.3.1.1 Classi suddivise equamente

• SVM

(60)

Figura 6.12: Forchetta di consumo

(61)
(62)

• Random Forest senza features inutili

(63)

Figura 6.18: Forchetta di consumo

Suddividendo in modo equo le classi si può notare come i classificatori facciano fatica a classificare i valori ’al centro’ mentre per l’ultima classe la precisione del classificatore è molto più elevata.

Se ci si sofferma sull’accuratezza il Random Forest ha ottenuto risultati migliori rispetto al SVM e, come ci si poteva aspettare, rimuovendo le features insignificanti il classificatore si è perfezionato.

(64)

6.3.1.2 Classi suddivise per range di consumo

• SVM

(65)

Figura 6.21: Forchetta di consumo

(66)

Figura 6.23: Probabilità con dataframe stagionale

(67)

• Random Forest senza features inutili

(68)

Figura 6.27: Forchetta di consumo

Si nota immediatamente che rispetto a quanto visto precedentemente, i classificatori siano migliorati notevolmente. Non c’è più il problema del non riuscire a classificare le classi cen-trali ma a discapito si nota subito come ci sia una concentrazione elevata in un’unica classe, problema che ci aspettavamo di ottenere. Per quanto riguarda le performance, come già detto sono migliorate e anche in questa circostanza l’algoritmo di Random Forest produce un’accuratezza maggiore rispetto all’SVM. Ora ci si può ritenere soddisfatti dei risultati otte-nuti dagli algoritmi ma, rimuovendo il problema dell’accumulo di utenti in un’unica classe, i classificatori potrebbero ancora migliorare.

(69)

6.3.1.3 Classi suddivise utilizzando K-Means

• SVM

(70)

Figura 6.30: Forchetta di consumo

(71)
(72)

• Random Forest senza features inutili

(73)

Figura 6.36: Forchetta di consumo

I risultati ottenuti utilizzando i cluster creati con il K-Means non vanno a migliorare quelli già analizzati precedentemente. Ovviamente i dataframe su cui si sta lavorando sono differenti e bisognerebbe fare un’analisi utilizzando tutti i dataframe precedentemente creati. In questo caso la suddivisione in classi sfruttando il K-means non migliora le performance, anche se risultano comunque migliori rispetto alla divisione equa. Anche in questo caso l’algoritmo Random Forest lavora meglio ma al contrario di come visto prima, eliminando le feature inutili non si assiste a un miglioramento, anzi il valore dell’accuratezza è identico.

(74)
(75)

Capitolo 7

Conclusioni

Le fasi principali del progetto sono state esposte ed ora è giunto il momento di trarre le considerazioni finali.

Tutti i compiti e gli obiettivi enunciati sono stati completati ottenendo dei risultati concreti. Grazie agli algoritmi di regressione sono state trovate le features che influenzano mag-giormente i dati del consumo e con i classificatori riusciamo a catalogare un nuovo utente ricavando il suo intervallo di consumo.

Alcune features risultano importanti solo se aggregate tra loro, non c’è alcuna features tal-mente significativa da permettere di ricavare il consumo unicatal-mente da essa.

Con i dati trattati il classificatore Random Forest è migliore rispetto all’SVM, ma non è sta-to confrontasta-to un numero considerevole di dataframe al fine di poter stabilire con certezza quale dei due sia più performante.

I risultati di entrambi sono però molto soddisfacenti in quanto riescono a classificare le nuove istanze di utenti con una precisione sempre superiore al 70

7.1

Problemi riscontrati

I problemi si sono riscontrati principalmente nella fase di pretrattamento dati, capitolo 4.2. Questa parte ha occupato il 60/70% del tempo dedicato al progetto, questo perché i dati

Riferimenti

Documenti correlati

E con il tempo mi coinvolse sempre di più, por- tandomi ad eventi, alcuni indimenticabili come il Chocco Venezuela a Caracas presso la Universitá Metropolitana, alla

[r]

COMPAGNIA ITALIANA MOLLE ACCIAIO S.P.A... (CAMBIO DI DENOMINAZIONE SOCIALE IN

La riduzione delle dispersioni di calore attraverso un accurato isolamento termico dell’involucro rappresenta una delle fonti di energia più importanti, in quanto consente una

E infine, ancora a dimostrazione dell’autenticità della proposta di Rodari di far squadra con bambini e ragazzi e di dare significato profondo alla parola, viene riportata una

Continuano così per qualche minuto finché ad un certo punto, come mossi da qualche impegno improvviso, interrompono il gioco, si rimettono in formazione e si spostano lontano

Nel I trimestre 2020, le imprese dell’Alimentazione registrano un calo dei consumi di energia elettrica pari a -4,9% rispetto allo stesso periodo dell’anno

Acqua, reti fognarie, rifiuti e risanamento Energia elettrica, gas, vapore e aria condizionata.