Condividi tramite


Esercitazione: usa R per prevedere il ritardo di un volo

Questa esercitazione presenta un esempio end-to-end di un flusso di lavoro di data science Synapse in Microsoft Fabric. Usa i dati nycflights13 e R per stimare se un aereo arriva più di 30 minuti di ritardo. Usa quindi i risultati della stima per creare un dashboard interattivo di Power BI.

In questa esercitazione apprenderai a:

  • Usare pacchetti tidymodels (ricette, parsnip, rsample, flussi di lavoro) per elaborare i dati ed eseguire il training di un modello di Machine Learning
  • Scrivere i dati di output in una lakehouse come tabella delta
  • Creare un report visivo di Power BI per accedere direttamente ai dati in tale lakehouse

Prerequisiti

  • Aprire o creare un notebook. Per istruzioni, vedere Come usare i notebook di Microsoft Fabric.

  • Impostare l'opzione del linguaggio su SparkR (R) per modificare il linguaggio primario.

  • Collegare il notebook a un lakehouse. Sul lato sinistro, selezionare Aggiungi per aggiungere un lakehouse esistente o creare un lakehouse.

Installare i pacchetti

Installare il pacchetto nycflights13 per usare il codice in questa esercitazione.

install.packages("nycflights13")
# Load the packages
library(tidymodels)      # For tidymodels packages
library(nycflights13)    # For flight data

Esplorare i dati

I dati nycflights13 contengono informazioni su 325.819 voli arrivati vicino a New York Nel 2013. Prima di tutto, visualizzare la distribuzione dei ritardi dei voli. Questo grafico mostra che la distribuzione dei ritardi di arrivo è a destra asimmetrica. Ha una coda lunga nei valori alti.

ggplot(flights, aes(arr_delay)) + geom_histogram(color="blue", bins = 300)

Screenshot that shows a graph of flight delays.Screenshot che mostra un grafico dei ritardi dei voli.

Caricare i dati e apportare alcune modifiche alle variabili:

set.seed(123)

flight_data <- 
  flights %>% 
  mutate(
    # Convert the arrival delay to a factor
    arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),
    arr_delay = factor(arr_delay),
    # You'll use the date (not date-time) for the recipe that you'll create
    date = lubridate::as_date(time_hour)
  ) %>% 
  # Include weather data
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  # Retain only the specific columns that you'll use
  select(dep_time, flight, origin, dest, air_time, distance, 
         carrier, date, arr_delay, time_hour) %>% 
  # Exclude missing data
  na.omit() %>% 
  # For creating models, it's better to have qualitative columns
  # encoded as factors (instead of character strings)
  mutate_if(is.character, as.factor)

Prima di compilare il modello, considerare alcune variabili specifiche importanti sia per la pre-elaborazione che per la modellazione.

La variabile arr_delay è una variabile di fattore. Per il training del modello di regressione logistica, è importante che la variabile di risultato sia una variabile di fattore.

glimpse(flight_data)

Circa il 16% dei voli in questo set di dati è arrivato più di 30 minuti in ritardo.

flight_data %>% 
  count(arr_delay) %>% 
  mutate(prop = n/sum(n))

La funzionalità dest ha 104 destinazioni di volo.

unique(flight_data$dest)

Ci sono 16 vettori distinti.

unique(flight_data$carrier)

Suddividere i dati

Suddividere il singolo set di dati in due: un set di training e un set di test. Mantenere la maggior parte delle righe nel set di dati originale (come subset scelto in modo casuale) nel set di dati di training. Usare il set di dati di training per adattare il modello e usare il set di dati di test per misurare le prestazioni del modello.

Usare il pacchetto rsample per creare un oggetto contenente informazioni su come suddividere i dati. Usare quindi altre due funzioni rsample per creare dataframe per i set di training e test:

set.seed(123)
# Keep most of the data in the training set 
data_split <- initial_split(flight_data, prop = 0.75)

# Create DataFrames for the two sets:
train_data <- training(data_split)
test_data  <- testing(data_split)

Creare una ricetta e ruoli

Creare una ricetta per un semplice modello di regressione logistica. Prima di eseguire il training del modello, usare una ricetta per creare nuovi predittori ed eseguire la pre-elaborazione richiesta dal modello.

Usare la funzione update_role() in modo che le ricette riconoscano che flight e time_hour sono variabili, con un ruolo personalizzato denominato ID. Un ruolo può avere qualsiasi valore di carattere. La formula include tutte le variabili nel set di training, diverse da arr_delay, come predittore. La ricetta mantiene queste due variabili ID, ma non le usa come risultati o predittori.

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") 

Per visualizzare il set corrente di variabili e ruoli, usare la funzione summary():

summary(flights_rec)

Creare caratteristiche

Eseguire alcune attività di progettazione delle funzionalità per migliorare il modello. La data del volo potrebbe avere un effetto ragionevole sulla probabilità di arrivo in ritardo.

flight_data %>% 
  distinct(date) %>% 
  mutate(numeric_date = as.numeric(date)) 

Può essere utile aggiungere termini di modello derivati dalla data che potenzialmente hanno importanza per il modello. Derivare le funzionalità significative seguenti dalla singola variabile di data:

  • Giorno della settimana
  • Mese
  • Indica se la data corrisponde o meno a una festività

Aggiungere i tre passaggi alla ricetta:

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") %>% 
  step_date(date, features = c("dow", "month")) %>%               
  step_holiday(date, 
               holidays = timeDate::listHolidays("US"), 
               keep_original_cols = FALSE) %>% 
  step_dummy(all_nominal_predictors()) %>% 
  step_zv(all_predictors())

Adattare un modello con una ricetta

Usare la regressione logistica per modellare i dati dei voli. Prima di tutto, compilare una specifica del modello con il pacchetto parsnip:

lr_mod <- 
  logistic_reg() %>% 
  set_engine("glm")

Usare il pacchetto workflows per aggregare il modello parsnip (lr_mod) con la ricetta (flights_rec):

flights_wflow <- 
  workflow() %>% 
  add_model(lr_mod) %>% 
  add_recipe(flights_rec)

flights_wflow

Eseguire il training del modello

Questa funzione può preparare la ricetta ed eseguire il training del modello dai predittori risultanti:

flights_fit <- 
  flights_wflow %>% 
  fit(data = train_data)

Usare le funzioni helper xtract_fit_parsnip() e extract_recipe() per estrarre gli oggetti modello o ricetta dal flusso di lavoro. In questo esempio, eseguire il pull dell'oggetto modello montato, quindi usare la funzione broom::tidy() per ottenere una tibble ordinata dei coefficienti del modello:

flights_fit %>% 
  extract_fit_parsnip() %>% 
  tidy()

Stimare i risultati

Una singola chiamata a usa il flusso di lavoro sottoposto a predict() training (flights_fit) per eseguire stime con i dati di test non rilevati. Il metodo predict() applica la ricetta ai nuovi dati, quindi passa i risultati al modello adattato.

predict(flights_fit, test_data)

Ottenere l'output da predict() per restituire la classe stimata: late rispetto a on_time. Tuttavia, per le probabilità della classe stimata per ogni volo, usare augment() con il modello, in combinazione con i dati di test, per salvarle insieme:

flights_aug <- 
  augment(flights_fit, test_data)

Esaminare i dati:

glimpse(flights_aug)

Valutare il modello

È ora disponibile una variabile con le probabilità della classe stimata. Nelle prime righe il modello ha stimato correttamente cinque voli puntuali (i valori di .pred_on_time sono p > 0.50). Tuttavia, sono presenti 81.455 righe totali da stimare.

È necessaria una metrica che indica in che modo il modello ha stimato gli arrivi in ritardo, rispetto al vero stato della variabile di risultato, arr_delay.

AUC è l'area sottesa alla curva ROC (Receiver Operating Characteristic). Calcolarlo con roc_curve() e roc_auc(), dal pacchetto yardstick:

flights_aug %>% 
  roc_curve(truth = arr_delay, .pred_late) %>% 
  autoplot()

Creare un report Power BI

Il risultato del modello ha un aspetto ottimale. Usare i risultati della stima dei ritardi dei voli per creare una dashboard interattiva di Power BI. La dashboard mostra il numero di voli per vettore e il numero di voli per destinazione. La dashboard può filtrare in base ai risultati della stima ritardata.

Screenshot that shows bar charts for number of flights by carrier and number of flights by destination in a Power BI report.Screenshot che mostra i grafici a barre per il numero di voli in base al vettore e al numero di voli per destinazione in un report di Power BI.

Includere il nome del vettore e il nome dell'aeroporto nel set di dati dei risultati della stima:

  flights_clean <- flights_aug %>% 
  # Include the airline data
  left_join(airlines, c("carrier"="carrier"))%>% 
  rename("carrier_name"="name") %>%
  # Include the airport data for origin
  left_join(airports, c("origin"="faa")) %>%
  rename("origin_name"="name") %>%
  # Include the airport data for destination
  left_join(airports, c("dest"="faa")) %>%
  rename("dest_name"="name") %>%
  # Retain only the specific columns you'll use
  select(flight, origin, origin_name, dest,dest_name, air_time,distance, carrier, carrier_name, date, arr_delay, time_hour, .pred_class, .pred_late, .pred_on_time)

Esaminare i dati:

glimpse(flights_clean)

Convertire i dati a un DataFrame Spark:

sparkdf <- as.DataFrame(flights_clean)
display(sparkdf)

Scrivere dati in una tabella delta nel lakehouse:

# Write data into a delta table
temp_delta<-"Tables/nycflight13"
write.df(sparkdf, temp_delta ,source="delta", mode = "overwrite", header = "true")

Usare la tabella delta per creare un modello semantico.

  1. A sinistra selezionare OneLake

  2. Selezionare la lakehouse collegata al notebook

  3. Selezionare Open (Apri)

    Screenshot that shows the button to open a lakehouse.Screenshot che mostra il pulsante per aprire una lakehouse.

  4. Selezionare Nuovo modello semanticol

  5. Selezionare nycflight13 per il nuovo modello semantico, quindi selezionare Conferma

  6. Viene creato il modello semantico. Selezionare Nuovo report

  7. Selezionare o trascinare i campi dai riquadri Dati e Visualizzazioni nell'area di disegno del report per compilare il report

    Screenshot that shows data and visualization details for a report.Screenshot che mostra i dettagli di dati e visualizzazione per un report.

Per creare il report visualizzato all'inizio di questa sezione, usare queste visualizzazioni e dati:

  1. Grafico a barre in pila con:
    1. Asse Y: carrier_name
    2. Asse X: volo. Selezionare Conteggio per aggregazione
    3. Legenda: origin_name
  2. Grafico a barre in pila con:
    1. Asse Y: dest_name
    2. Asse X: volo. Selezionare Conteggio per aggregazione
    3. Legenda: origin_name
  3. Filtro dei dati con:
    1. Campo: _pred_class
  4. Filtro dei dati con:
    1. Campo: _pred_late