
Nei problemi di regressione si tenta di prevedere una variabile dipendente (solitamente indicata da Y) confrontandola con una serie di altre variabili (note come variabili indipendenti, solitamente indicate da X).
Esistono diversi tipi di regressione, a seconda del tipo di dati che si vuole prevedere. Tra i più diffusi abbiamo:
- Regressione Lineare: quando si vuole prevedere un valore continuo (ad esempio che temperatura sarà oggi?). Se la variabile di input è solo una allora la regressione lineare si dice semplice, altrimenti in caso contrario la regressione lineare si dice multipla.
- Regressione Logistica: quando si vuole prevedere in quale categoria si trova l’osservazione si sta trattando un problema di regressione logistica (si tratta di un gatto o di un cane?);
- Regressione di Poisson: quando si vuole prevedere un valore di conteggio che impatta il modello (ad esempio il numero di guasti informatici catastrofici in una grande azienda tecnologica in un anno di calendario).
In questo articolo voglio mostrare come risolvere un problema di regressione lineare utilizzando Python e il suo IDE Spyder (se non sai di cosa sto parlando, puoi vedere questo articolo).
Cominciamo subito.
Scelta del dataset
Per questo esempio si è scelto un dataset di Kaggle, che rappresenta il meteo della città di Seghedino, la terza città città ungherese per numero di abitanti secondo Wikipedia per un periodo di 10 anni (dal 2006 al 2016).
Lo puoi scaricare da qua dopo esserti registrato al sito di Kaggle.
Il set di dati contiene le informazioni meteorologiche di base come temperatura, velocità del vento, pressione e condizioni meteorologiche.
L’obiettivo del problema è tentare di capire se esiste una relazione di tipo lineare tra umidità e temperatura, dove la temperatura è la variabile dipendente (y) mentre l’umidità è la variabile indipendente (X).
Per verificare l’esistenza di questa relazione o meno creiamo un modello di regressione per prevedere i dati di temperatura dall’umidità.
Importare le librerie
Come abbiamo visto anche per l’algoritmo knn, per utilizzare le principali librerie di machine learning è necessario importarle. Ciò significa eseguire le seguenti righe di codice:
Oltre a pandas, numpy e matplotlib importiamo seaborn, una libreria di visualizzazione dei dati. Inoltre importiamo alcune importanti classi e moduli di Sklearn:
- il LabelEncoder, per codificare i valori stringa in campi numerici;
- le metriche (R2, il coefficiente di correlazione) per valutare il modello di regressione lineare;
- il Train_test_split per suddividere la fase di addestramento con quella di test;
- il linear_model, il modulo che include i vari tipi di regressione.
Importare il dataset
Il secondo step necessario risulta quello di importare il dataset. Lanciamo la seguente stringa di codice (in quanto il dataset è salvato sottoforma di file csv):
Questo set di dati ha 12 colonne con 96.453 righe di dati, come si può vedere anche eseguendo le seguenti righe di codice:
Il risultato è il seguente:
Analizziamo il dataset
Quando si eseguono analisi su dataset è sempre opportuno verificare e preparare i dati per eliminare righe vuote o colonne prive di dati.
Guardando bene al dataset, si può notare che alcune colonne non contengono dati, come Loud Cover, e dovrebbero essere rimosse dal set di dati, tuttavia, poiché vengono usati solo dati di umidità e temperatura, la colonna non verrà eliminata.
Verifichiamo ora la presenza di celle nulle e se una riga qualsiasi contiene null, elimineremo la riga. Per farlo eseguiamo la seguente riga di codice:
Otteniamo il seguente risultato, che ci indica che la colonna delle precipitazioni (Precip Type) ha righe nulle, dal valore True ottenuto di fianco:
Pertanto provvediamo ad eliminare tali righe attraverso la funzione dropna():
Creiamo la mappa di calore
Prima di creare il modello di regressione, è buona norma verificare la correlazione tra le variabili, magari facendoci aiutare da una mappa di calore che mostra le varie correlazioni come mostrato di seguito.
In questo script prima di tutto ci copiamo di dati nella variabile modeling_data. E in questo dataset copiato eliminiamo le colonne “Daily Summary” e “Loud Cover”.
Dopodichè trasformiamo, attraverso la classe Label Encoder, le colonne “Summary” e “Precip Type” da variabili stringa a variabili numeriche in modo da facilitare i calcoli al modello.
Il Label Encoder ci aiuterà a convertire questo tipo di dati di testo categoriali in dati numerici comprensibili al modello: tutto ciò che dobbiamo fare, per etichettare le colonne, è importare la classe LabelEncoder dalla libreria sklearn, adattare e trasformare le colonne, e quindi sostituire i dati di testo esistenti con i nuovi dati codificati.
Siamo pronti ora a creare la mappa di calore. Digitiamo il seguente script:
Come possiamo vedere, viene utilizzato il dataset copiato modeling_data. Esso ci crea l’array corr. Successivamente, viene creato un array di zeri con la stessa dimensione di quello appena creato, come prevede la funzione zeros_like di numpy, mentre con la funzione triu_indices_from troviamo gli indici dell’array del triangolo in alto necessari a creare la mappa di calore.
Anche le altre righe di codice servono per impostare la mappa di calore. Grazie alle librerie matplotlib e seaborn, si definisce la struttura e la forma del grafico (per maggiori informazioni si veda questo link).
Come risultato otteniamo il seguente grafico. Sia sull’asse x che sull’asse y abbiamo i campi del dataset copiato (modeling_data). I colori a forma di quadrato che si formano ci indicano il valore di correlazione tra le variabili in essere. In particolare:
- più ci si avvicina al verde più le variabili sono correlate tra loro,
- variabili con correlazione nulla avranno colore quasi vicino al bianco;
- variabili con correlazione inversa avranno colore tendente al rosa/porpora.
Guardando attentamente il grafico possiamo notare che:
- I dati di temperatura e temperatura apparente hanno dati simili poiché la correlazione tra loro è elevata;
- I dati di pressione hanno una correlazione molto scarsa con i dati di temperatura e ciò può essere dovuto all’esistenza di righe con valore di pressione pari a zero;
- La temperatura e l’umidità hanno una correlazione inversa.
Test train Data
Prima di creare il modello cancelliamo anche le colonne “Apparent Temperature”, “Formatted Date” e “Summary” dal dataset. E consideriamo solo i valori della colonna “Humidity” che sono maggiori di zero.
Una volta fatto ciò, possiamo provvedere a suddividere il dataset in set di dati di test e di allenamento. In questo caso consideriamo il 33% del set di dati come dato di test, mentre il 66% sarà il set di dati di addestramento.
Creiamo il modello di regressione
Siamo pronti per creare il modello di regressione. Eseguiamo il seguente script:
Assegniamo alla variabile reg il valore del modello di regressione. Eseguiamo poi l’adattamento del modello di regressione ai dati.
Col termine reg.coef invece stimiamo i coefficienti del problema di regressione. Vediamo poi stampati dalle successive righe di codice il coefficiente di determinazione R2 (la prima mi dice il coefficiente di determinazione relativo al dataset di addestramento, mentre la seconda il coefficiente previsto del dataset di test).
Vediamo di rappresentare quanto trovato. Eseguendo le seguenti righe di codice:
Vengono impostati i caratteri, le etichette, i titoli e le varie dimensioni del grafico ed otteniamo il seguente risultato (dove i dati del modello sono mostrati dai pallini blu, mentre la retta di regressione dalla linea rossa):
Possiamo notare che il valore che otteniamo è un basso valore del coefficiente di correlazione (R2 = 0,404). Da ciò si può dedurre che l’umidità influenza poco la variabile temperatura.
Infine se volessimo calcolare il valore dei residui, ossia una stima osservabile dell’errore statistico, si può eseguire il seguente codice:
Anche in questo caso vengono definite le caratteristiche dei grafici: il primo rappresenta la distribuzione dei residui per la temperatura mentre il secondo il grafico dei residui per quanto riguarda l’umidità.
Tale script da come output il seguente grafico:
Conclusione
In quest’articolo abbiamo visto come creare un modello di regressione con Python.
La regressione è un metodo molto comune per predire una variabile conoscendone la relazione con altre, ed è molto utile per poter prevedere effetti o impatti nei cambiamenti delle situazioni reali.
Per il dataset analizzato, il modello di regressione creato non è un buon predittore siccome solamente il 40% della varianza della temperatura è prevedibile dall’umidità.