Freigeben über


Lernprogramm: Verwenden von R zum Vorhersagen der Flugverzögerung

Dieses Lernprogramm zeigt ein End-to-End-Beispiel für einen Synapse Data Science-Workflow in Microsoft Fabric. Es verwendet die nycflights13 Daten und R, um vorherzusagen, ob ein Flugzeug mehr als 30 Minuten verspätet eintrifft. Anschließend werden die Vorhersageergebnisse verwendet, um ein interaktives Power BI-Dashboard zu erstellen.

In diesem Lernprogramm erfahren Sie, wie Sie:

  • Verwenden Sie tidymodels-Pakete (recipes, parsnip, rsample, workflows), um Daten zu verarbeiten und ein Maschinenlernmodell zu trainieren.
  • Schreiben der Ausgabedaten als Deltatabelle in Lakehouse
  • Erstellen Sie einen visuellen Power BI-Bericht, um direkt auf Daten in diesem Lakehouse zuzugreifen

Voraussetzungen

  • Öffnen oder Erstellen eines Notizbuchs Informationen dazu finden Sie unter Verwenden von Microsoft Fabric-Notizbüchern.

  • Legen Sie die Sprachoption auf SparkR (R)- fest, um die primäre Sprache zu ändern.

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

Installieren von Paketen

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

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

Erkunden der Daten

Die nycflights13 Daten enthalten Informationen zu 325.819 Flügen, die 2013 in der Nähe von New York City angekommen sind. Sehen Sie sich zunächst die Verteilung von Flugverzögerungen an. Dieses Diagramm zeigt, dass die Verteilung der Ankunftsverzögerungen nach rechts verzerrt ist. Sie hat ein langes Ende in den hohen Werten.

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

Screenshot, der ein Diagramm mit Flugverzögerungen zeigt.

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, sollten Sie einige bestimmte Variablen berücksichtigen, die sowohl für die Vorverarbeitung als auch für die Modellierung wichtig sind.

Variable arr_delay ist eine Faktorvariable. Für die Schulung des Logistischen Regressionsmodells ist es wichtig, dass die Ergebnisvariable eine Faktorvariable ist.

glimpse(flight_data)

Etwa 16% der Flüge in diesem Dataset kamen mehr als 30 Minuten spät an.

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

Das feature dest verfügt über 104 Flugziele.

unique(flight_data$dest)

Es gibt 16 unterschiedliche Träger.

unique(flight_data$carrier)

Teilen der Daten

Teilen Sie dieses 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 Schulungsdatensatz bei. Verwenden Sie das Schulungsdatenset, um das Modell anzupassen, und verwenden Sie das Testdatenset, um die Modellleistung zu messen.

Verwenden Sie das rsample-Paket, um ein Objekt zu erstellen, das Informationen zum Teilen der Daten enthält. Verwenden Sie dann zwei weitere rsample Funktionen, um DataFrames für die Schulungs- 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 eines Rezepts und einer Rolle

Erstellen Sie ein Rezept für ein einfaches logistisches Regressionsmodell. Bevor Sie das Modell trainieren, verwenden Sie ein Rezept zum Erstellen neuer Vorhersager, und führen Sie die Vorverarbeitung durch, die das Modell erfordert.

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

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)

Features erstellen

Führen Sie ein Feature engineering aus, um Ihr Modell zu verbessern. Das Flugdatum kann eine angemessene Auswirkung auf die Wahrscheinlichkeit einer verspäteten Ankunft haben.

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

Es kann hilfreich sein, Modellbegriffe hinzuzufügen, die vom Datum abgeleitet sind, das für das Modell potenziell wichtig ist. Leiten Sie die folgenden aussagekräftigen Features von der einzelnen Datumsvariable 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 zu bündeln (flights_rec):

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

flights_wflow

Trainieren des Modells

Diese Funktion kann das Rezept vorbereiten und das Modell aus den resultierenden Prädiktoren trainieren:

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

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

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

Vorhersagen von Ergebnissen

Ein einzelner Aufruf von predict() verwendet den trainierten Workflow (flights_fit), um Vorhersagen mit den nicht angezeigten Testdaten zu erstellen. Die predict() Methode wendet das Rezept auf die neuen Daten an und übergibt dann die Ergebnisse an das passende Modell.

predict(flights_fit, test_data)

Rufen Sie die Ausgabe von predict() ab, um die vorhergesagte Klasse zurückzugeben: late im Vergleich zu on_time. Verwenden Sie jedoch augment() mit dem Modell, in Kombination mit den Testdaten, um die vorhergesagten Klassenwahrscheinlichkeiten für jeden Flug zusammen zu speichern.

flights_aug <- 
  augment(flights_fit, test_data)

Überprüfen Sie die Daten:

glimpse(flights_aug)

Auswerten des Modells

Wir haben jetzt ein Tibble mit den vorhergesagten Klassenwahrscheinlichkeiten. In den ersten paar Zeilen hat das Modell ordnungsgemäß fünf pünktliche Flüge vorhergesagt (Werte von .pred_on_time sind p > 0.50). Wir müssen jedoch insgesamt 81.455 Zeilen vorhersagen.

Wir benötigen eine Metrik, die angibt, wie gut das Modell späte Ankunft im Vergleich zum tatsächlichen Status Ihrer Ergebnisvariablen arr_delayprognostiziert.

Verwenden Sie den Bereich unter der ROC-Kurve (Receiver Operating Characteristic Curve) (AUC-ROC). Berechnen Sie sie mit 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 Ergebnisse der Flugverzögerungsvorhersage, 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. Das Dashboard kann nach den Ergebnissen der Verzögerungsvorhersage filtern.

Screenshot mit Balkendiagrammen für die Anzahl der Flüge nach Fluggesellschaft und Anzahl der Flüge nach Ziel in einem Power BI-Bericht.

Fügen Sie den Namen des Netzbetreibers und den Flughafennamen in das Vorhersageergebnis-Dataset 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 Sie die 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 Delta-Tabelle in Ihrem Seehaus:

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

Verwenden Sie die Delta-Tabelle, um ein Semantikmodell zu erstellen.

  1. Wählen Sie links OneLake.

  2. Wählen Sie das Seehaus aus, das Sie an Ihr Notizbuch angefügt haben.

  3. Wählen Sie Öffnen aus.

    Screenshot: Schaltfläche zum Öffnen eines Lakehouse

  4. Wählen Sie neues semantisches Modell

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

  6. Ihr Semantikmodell wird erstellt. Wählen Sie Neuen Bericht

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

    Screenshot mit Daten- und Visualisierungsdetails für einen Bericht.

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

  1. Ein gestapeltes Balkendiagramm mit:
    1. y-Achse: carrier_name
    2. x-Achse: Flight. Wählen Sie Anzahl für die Aggregation aus.
    3. Legende: origin_name
  2. Gestapeltes Balkendiagramm mit:
    1. Y-Achse: dest_name
    2. x-Achse: Flight. Wählen Sie Anzahl für die Aggregation aus.
    3. Legende: origin_name
  3. Datenschnitt mit:
    1. Feld: _pred_class
  4. Datenschnitt mit:
    1. Feld: _pred_late