Tutorial: Verwenden Sie R zum Vorhersagen von Flugverspätungen

Dieses Tutorial stellt ein umfassendes Beispiel für einen Synapse Data Science-Workflow in Microsoft Fabric vor. Unter Verwendung der nycflights13-Daten und R wird vorhergesagt, ob ein Flugzeug mehr als 30 Minuten verspätet eintrifft. Dann wird anhand der Vorhersageergebnisse ein interaktives Power BI-Dashboard erstellt.

In diesem Tutorial lernen Sie Folgendes:

  • Verwendung von Tidymodels-Paketen (Rezepte, Parsnip, Rsample, Workflows) zum Verarbeiten von Daten und Trainieren eines Machine Learning-Modells
  • Schreiben der Ausgabedaten als Deltatabelle in ein Lakehouse
  • Erstellen eines grafischen Power BI-Berichts für den direkten Zugriff auf Daten in diesem Lakehouse

Voraussetzungen

  • Öffnen oder erstellen Sie ein Notebook. Informationen dazu finden Sie unter Verwenden von Microsoft Fabric-Notebooks.

  • Legen Sie zum Ändern der primären Sprache die Sprachoption auf SparkR (R) fest.

  • Fügen Sie Ihr Notebook an ein Lakehouse an. Wählen Sie auf der linken Seite Hinzufügen aus, um ein vorhandenes Lakehouse hinzuzufügen oder ein Lakehouse zu erstellen.

Installieren von Paketen

Installieren Sie das nycflights13-Paket, um den Code in diesem Tutorial zu verwenden.

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

Untersuchen der Daten

Die nycflights13 Daten enthalten Informationen über 325.819 Flüge, die im Jahr 2013 in der Nähe von New York City angekommen sind. Sehen Sie sich zunächst die Verteilung der Flugverspätungen an. Diese Abbildung zeigt, dass die Verteilung der verspäteten Ankünfte nach rechts verzerrt ist. Bei den hohen Werten gibt es lange Reihen.

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

Screenshot that shows a graph of flight delays.

Laden Sie die Daten und nehmen Sie einige Änderungen an den Variablen vor:

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)

Bevor wir das Modell erstellen, werfen wir einen kurzen Blick auf einige bestimmte Variablen, die sowohl für die Vorverarbeitung als auch für die Modellierung wichtig sind.

Variable arr_delay ist eine Faktorvariable. Für das Trainieren eines logistischen Regressionsmodells ist es wichtig, dass Ihre Ergebnisvariable eine Faktorvariable ist.

glimpse(flight_data)

Etwa 16 % der Flüge in diesem Dataset hatten bei der Ankunft mehr als 30 Minuten Verspätung.

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

Das dest-Feature verfügt über 104 Flugziele.

unique(flight_data$dest)

Es gibt 16 verschiedene Transportunternehmen.

unique(flight_data$carrier)

Teilen der Daten

Teilen Sie das einzelne Dataset in zwei auf: einen Trainingssatz und einen Testsatz. Behalten Sie die meisten Zeilen im ursprünglichen Dataset (als zufällig ausgewählte Teilmenge) im Trainingsdataset bei. Verwenden Sie das Trainingsdataset zum Anpassen des Modells und das Testdataset zum Messen der Modellleistung.

Verwenden Sie das rsample-Paket, um ein Objekt zu erstellen, das Informationen zum Aufteilen der Daten enthält. Verwenden Sie dann zwei weitere rsample-Funktionen, um DataFrames für die Trainings- und Testsätze zu erstellen:

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)

Erstellen von Rezepten und Rollen

Erstellen Sie ein Rezept für ein einfaches logistisches Regressionsmodell. Verwenden Sie vor dem Trainieren des Modells ein Rezept, um neue Prädiktoren zu erstellen und die für das Modell erforderliche Vorverarbeitung durchzuführen.

Verwenden Sie die update_role()-Funktion, damit die Rezepte wissen, dass flight und time_hour Variablen mit einer benutzerdefinierten Rolle namens ID sind. Eine Rolle kann einen beliebigen Zeichenwert aufweisen. Die Formel enthält alle Variablen im Trainingssatz außer arr_delay als Prädiktoren. Das Rezept behält diese beiden ID-Variablen bei, verwendet sie jedoch nicht als Ergebnisse oder Prädiktoren.

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

Verwenden Sie die summary()-Funktion, um den aktuellen Satz von Variablen und Rollen anzuzeigen:

summary(flights_rec)

Erstellen von Features

Führen Sie Featureentwicklung durch, um Ihr Modell zu verbessern. Das Datum eines Fluges könnte einen begründeten Einfluss auf die Wahrscheinlichkeit einer verspäteten Ankunft haben.

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

Es könnte hilfreich sein, aus dem Datum abgeleitete Modellbegriffe hinzuzufügen, die für das Modell potenziell wichtig sind. Leiten Sie die folgenden aussagekräftigen Features aus der einzelnen Datumsvariablen ab:

  • Wochentag
  • Monat
  • Gibt an, ob das Datum einem Feiertag entspricht

Fügen Sie Ihrem Rezept die drei Schritte hinzu:

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())

Anpassen eines Modells mit einem Rezept

Verwenden Sie die logistische Regression, um die Flugdaten zu modellieren. Erstellen Sie zunächst eine Modellspezifikation mit dem parsnip-Paket:

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

Verwenden Sie das workflows-Paket, um Ihr parsnip-Modell (lr_mod) mit Ihrem Rezept (flights_rec) zu bündeln:

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

flights_wflow

Modelltraining

Diese Funktion kann das Rezept vorbereiten und das Modell anhand der resultierenden Prädiktoren trainieren:

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

Verwenden Sie die Hilfsfunktionen xtract_fit_parsnip() und extract_recipe(), um die Modell- oder Rezeptobjekte aus dem Workflow zu extrahieren. In diesem Beispiel ziehen Sie das angepasste Modellobjekt heraus und verwenden dann die broom::tidy()-Funktion, um ein ordentliches Tibble der Modellkoeffizienten zu erhalten:

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

Vorhersagen von Ergebnissen

Mit einem einzigen Aufruf von predict() werden anhand des trainierten Workflows (flights_fit) Vorhersagen mit den unbesehenen Testdaten getroffen. Die predict()-Methode wendet das Rezept auf die neuen Daten an und übergibt dann die Ergebnisse an das angepasste Modell.

predict(flights_fit, test_data)

Rufen Sie die Ausgabe von predict() zur Rückgabe der vorhergesagten Klasse ab: late oder on_time. Verwenden Sie jedoch für die vorhergesagten Klassenwahrscheinlichkeiten für jeden Flug augment() mit dem Modell in Kombination mit Testdaten, um sie zusammen zu speichern:

flights_aug <- 
  augment(flights_fit, test_data)

Überprüfen der Daten:

glimpse(flights_aug)

Evaluieren des Modells

Jetzt haben wir ein Tibble mit den vorhergesagten Klassenwahrscheinlichkeiten. In den ersten Zeilen hat das Modell fünf pünktliche Flüge richtig vorhergesagt (Werte von .pred_on_time sind p > 0.50). Es gibt jedoch insgesamt 81.455 Zeilen für die Vorhersage.

Wir benötigen eine Metrik, die angibt, wie gut das Modell verspätete Ankünfte vorhergesagt hat, im Vergleich zu dem wahren Status Ihrer Ergebnisvariablen arr_delay.

Verwenden Sie die Receiver Operating Characteristic „Fläche unter der Kurve“ (AUC-ROC) als Metrik. Berechnen Sie sie anhand von roc_curve() und roc_auc() aus dem yardstick-Paket:

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

Erstellen eines Power BI-Berichts

Das Modellergebnis sieht gut aus. Verwenden Sie die Vorhersageergebnisse für Flugverspätungen, um ein interaktives Power BI-Dashboard zu erstellen. Das Dashboard zeigt die Anzahl der Flüge nach Fluggesellschaft und die Anzahl der Flüge nach Ziel an. Der Dashboard kann nach den Ergebnissen der Verspätungsvorhersage filtern.

Screenshot that shows bar charts for number of flights by carrier and number of flights by destination in a Power BI report.

Fügen Sie den Namen der Fluggesellschaft und den Namen des Flughafens in das Dataset für das Vorhersageergebnis ein:

  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)

Überprüfen der Daten:

glimpse(flights_clean)

Konvertieren Sie die Daten in einen Spark-DataFrame:

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

Schreiben Sie die Daten in eine Deltatabelle in Ihrem Lakehouse:

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

Verwenden Sie die Deltatabelle, um ein semantisches Modell zu erstellen.

  1. Wählen Sie links OneLake Data Hub aus

  2. Wählen Sie das Lakehouse aus, das Sie an Ihr Notebook angefügt haben

  3. Wählen Sie Öffnen aus

    Screenshot that shows the button to open a lakehouse.

  4. Wählen Sie Neues semantisches Modell aus

  5. Wählen Sie nycflight13 für Ihr neues semantisches Modell und dann Bestätigen aus

  6. Ihr semantisches Modell wird erstellt. Wählen Sie Neuer Bericht Auswahl

  7. Wählen oder ziehen Sie Felder aus den Bereichen Daten und Visualisierungen in den Berichtscanvas, um den Bericht zu erstellen

    Screenshot that shows data and visualization details for a report.

Verwenden Sie die diese Visualisierungen und Daten, um den am Anfang dieses Abschnitts angezeigten Bericht zu erstellen:

  1. Gestapeltes Balkendiagramm mit:
    1. Y-Achse: carrier_name
    2. X-Achse: Flug. Wählen Sie die Anzahl für die Aggregation aus
    3. Legende: origin_name
  2. Gestapeltes Balkendiagramm mit:
    1. Y-Achse: dest_name
    2. X-Achse: Flug. Wählen Sie die Anzahl für die Aggregation aus
    3. Legende: origin_name
  3. Slicer mit:
    1. Feld: _pred_class
  4. Slicer mit:
    1. Feld: _pred_late