Applicazioni pratiche di machine learning/Previsioni sugli incendi

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search

Indice del libro

Caricamento librerie[modifica]

 library(dplyr)
 library(ggplot2)
 library(h2o)


Parte 1: Dati[modifica]

Il dataset "forestfires.csv", scaricabile da qui: https://archive.ics.uci.edu/ml/datasets/forest+fires è costituito da 513 righe e 13 variabili e contiene i dati sugli incendi boschivi provenienti dal parco naturale Montesinho, dal Trás-os-Montes regione nord-orientale del Portogallo . Le 13 variabili in questione del dataset sono le seguenti :

  • X - Coordinata spaziale dell'asse X all'interno della mappa del parco Montesinho con valori compresi tra 1 e 9
  • Y - Coordinata spaziale dell'asse Y all'interno della mappa del parco Montesinho con valori compresi tra 2 e 9
  • month - mese dell'anno: da "gen" a "dec"
  • day - giorno della settimana: da "mon" a "sun"
  • FFMC - Indice FFMC del sistema FWI: 18.7 a 96.20
  • DMC - Indice DMC del sistema FWI: da 1.1 a 291.3
  • DC - Indice DC del sistema FWI: da 7,9 a 860,6
  • ISI - Indice ISI del sistema FWI: da 0,0 a 56,10
  • temp - temperatura in gradi Celsius: da 2,2 a 33,30
  • RH - umidità relativa in %: da 15,0 a 100
  • wind - velocità del vento in km/h: da 0.40 a 9.40
  • rain - pioggia esterna in mm/m^2: da 0,0 a 6,4
  • area - l'area bruciata della foresta (in ha-ettari): da 0,00 a 1090,84 (questa variabile di output è molto proiettata verso lo 0, quindi potrebbe avere senso modellare con la trasformazione del logaritmo log(X+1)).

Il Forest Fire Weather Index (FWI) è il sistema canadese per la classificazione del pericolo di incendio e comprende sei componenti : FFMC rappresenta il contenuto di umidità dei rifiuti di superficie e influenza l'accensione e la propagazione del fuoco, DMC e DC rappresentano il contenuto di umidità degli strati organici superficiali e profondi che influenzano l'intensità del fuoco. L'ISI è un punteggio correlato alla diffusione della velocità del fuoco.

Caricamento dei dati:

 forestfires <- read.csv("forestfires.csv")

Ricerca valori mancanti:

 colSums(is.na(forestfires))
   X     Y month   day  FFMC   DMC    DC   ISI  temp 
   0     0     0     0     0     0     0     0     0 
  RH  wind  rain  area 
   0     0     0     0 

Ricerca valori anomali o outliers:

 forestfires %>%
  ggplot(aes(1:517,area)) +
  geom_boxplot()
Outliers

Dal grafico si vede che ci sono almeno 3 outliers relativi ad un'area superiore a 250 ettari, ma comunque non è necessario cancellarli.

 forestfires %>%
  filter(area>250)
  X Y month day FFMC   DMC    DC  ISI temp RH wind rain    area 
1 6 5   sep sat 92.5 121.1 674.4  8.6 25.1 27  4.0    0 1090.84 
2 8 6   aug thu 94.8 222.4 698.6 13.9 27.5 27  4.9    0  746.28 
3 7 4   jul mon 89.2 103.9 431.6  6.4 22.6 57  4.9    0  278.53 

Parte 2: Domanda di ricerca[modifica]

Si vuole prevedere l'area bruciata in ettari dagli incendi boschivi. Tale conoscenza è particolarmente utile per la gestione delle risorse antincendio e quindi per definire gli obiettivi prioritari delle autobotti e degli equipaggiamenti di terra (pianificazione delle risorse).

Parte 3: Esplorazione dei dati[modifica]

Come si vede dal seguente grafico la maggiorparte degli incendi avviene nei mesi di agosto e settembre, mentre a novembre e gennaio non ce ne sono.

 forestfires %>%
  group_by(month) %>%
  summarise(total=sum(area)) %>%
  mutate(month=reorder(month,total))  %>%
  ggplot(aes(month,total)) +
  geom_bar(stat="identity", fill="red") +
  coord_flip()
Forestfires.png

Creo una nuova variabile per poter valutare il tipo di danno:

 danno <- rep(NA,nrow(forestfires))
 for (i in 1:nrow(forestfires)) {
  if (forestfires[i,13]==0)
      danno[i]="Nessun danno"
  else if (forestfires[i,13]<1)
      danno[i]="Danno basso"
  else if (forestfires[i,13]<25)
      danno[i]="Danno moderato"
  else if (forestfires[i,13]<100)
      danno[i]="Danno alto"
  else danno[i]="Danno molto elevato"
 }
 forestfires <- cbind(forestfires,danno)


Come si vede dal seguente grafico i danni alti o molto elevati avvengono nei mesi di luglio, agosto e settembre.

 forestfires %>%
  ggplot(aes(month,area, fill=danno)) +
  geom_bar(stat="identity") +
  coord_flip()
Forestfires2.png

Parte 4: Modellizzazione e previsione[modifica]

Per creare un modello previsionale si utilizza la libreria "H2o" che consente con la sua funzione autoML di selezionare automaticamente l'algoritmo di machine learning migliore, cioè quello nel caso specifico che da un più basso valore dell'errore previsionale RMSE.

 h2o.init()
H2O is not running yet, starting it now...
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Ubuntu-0ubuntu1.118.04)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Ubuntu-0ubuntu1.118.04, mixed mode, sharing)
Starting H2O JVM and connecting: ..... Connection successful!
R is connected to the H2O cluster: 
   H2O cluster uptime:         7 seconds 720 milliseconds 
   H2O cluster timezone:       Europe/Rome 
   H2O data parsing timezone:  UTC 
   H2O cluster version:        3.28.0.2 
   H2O cluster version age:    11 days  
   H2O cluster name:           H2O_started_from_R_gian_wze918 
   H2O cluster total nodes:    1 
   H2O cluster total memory:   1.92 GB 
   H2O cluster total cores:    2 
   H2O cluster allowed cores:  2 
   H2O cluster healthy:        TRUE 
   H2O Connection ip:          localhost 
   H2O Connection port:        54321 
   H2O Connection proxy:       NA 
   H2O Internal Security:      FALSE 
   H2O API Extensions:         Amazon S3, XGBoost, Algos, AutoML, Core V3, TargetEncoder, Core V4 
   R Version:                  R version 3.6.2 (2019-12-12) 
Show in New WindowClear OutputExpand/Collapse Output
 train <- h2o.importFile("forestfires.csv")
 y <- "area"
 x <- setdiff(names(train), y)

 aml <- h2o.automl(x = x, y = y,
                  training_frame = train,
                  max_runtime_secs = 30)

Di seguito in ordine i migliori algoritmi selezionati da H2o, tra cui il primo è GLM_1_AutoML_20200201_222130 cioè un algoritmo GLM (Generalized Linear Models)

lb <- aml@leaderboard
lb
                                            model_id mean_residual_deviance     rmse       
1                        GLM_1_AutoML_20200201_222130               4045.990 63.60810 
2                        GBM_5_AutoML_20200201_222130               4055.079 63.67950 
3                    XGBoost_2_AutoML_20200201_222130               4064.721 63.75516 
4               DeepLearning_1_AutoML_20200201_222130               4069.798 63.79497 
5                        XRT_1_AutoML_20200201_222130               4126.609 64.23869 
6 StackedEnsemble_BestOfFamily_AutoML_20200201_222130               4133.725 64.29405 


L'errore previsionale RMSE dell'algoritmo GLM selezionato è pari a 63,23 ettari...

 model <- aml@leader
 model
 p1 = h2o.predict(model, newdata=train)
 p1_df <- as.data.frame(p1)
 cat("RMSE=",sqrt(mean((p1_df$predict-forestfires$area)^2)))
RMSE= 63.23721