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
Erhalten Sie ein Microsoft Fabric-Abonnement. Oder registrieren Sie sich für eine kostenlose Microsoft Fabric-Testversion.
Melden Sie sich bei Microsoft Fabrican.
Verwenden Sie den Erfahrungsschalter auf der unteren linken Seite Ihrer Startseite, um zu Fabric zu wechseln.
Ö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)
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 ID
genannt 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_delay
prognostiziert.
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.
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.
Wählen Sie links OneLake.
Wählen Sie das Seehaus aus, das Sie an Ihr Notizbuch angefügt haben.
Wählen Sie Öffnen aus.
Wählen Sie neues semantisches Modell
Wählen Sie nycflight13 für Ihr neues semantisches Modell und dann Bestätigen aus.
Ihr Semantikmodell wird erstellt. Wählen Sie Neuen Bericht
Wählen oder ziehen Sie Felder aus den Daten- und Visualisierungsbereichen in die Berichtscanvas, um den Bericht zu erstellen.
Verwenden Sie die folgenden Visualisierungen und Daten, um den am Anfang dieses Abschnitts angezeigten Bericht zu erstellen:
Ein gestapeltes Balkendiagramm mit:
- y-Achse: carrier_name
- x-Achse: Flight. Wählen Sie Anzahl für die Aggregation aus.
- Legende: origin_name
Gestapeltes Balkendiagramm mit:
- Y-Achse: dest_name
- x-Achse: Flight. Wählen Sie Anzahl für die Aggregation aus.
- Legende: origin_name
Datenschnitt mit:
- Feld: _pred_class
Datenschnitt mit:
- Feld: _pred_late