Del via


Selvstudium: Brug R til at forudsige flyforsinkelse

I dette selvstudium præsenteres et helt til slut-eksempel på en Synapse Data Science-arbejdsproces i Microsoft Fabric. Den bruger nycflights13 data og R til at forudsige, om et fly ankommer mere end 30 minutter for sent. Derefter bruges forudsigelsesresultaterne til at oprette et interaktivt Power BI-dashboard.

I dette selvstudium lærer du, hvordan du:

  • Brug tidymodels pakker (opskrifter, parsnip, rsample, arbejdsprocesser) til at behandle data og oplære en model til maskinel indlæring
  • Skriv outputdataene til et lakehouse som en deltatabel
  • Opret en power BI-visualiseringsrapport for at få direkte adgang til data i det pågældende lakehouse

Forudsætninger

  • Åbn eller opret en notesbog. Du kan få mere at vide under Sådan bruger du Microsoft Fabric-notesbøger.

  • Angiv sprogindstillingen for at SparkR (R) for at ændre det primære sprog.

  • Vedhæft din notesbog til et lakehouse. I venstre side skal du vælge Tilføj for at tilføje et eksisterende lakehouse eller for at oprette et lakehouse.

Installér pakker

Installér nycflights13-pakken for at bruge koden i dette selvstudium.

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

Udforsk dataene

De nycflights13 data indeholder oplysninger om 325.819 fly, der ankom i nærheden af New York City i 2013. Først skal du se fordelingen af flyforsinkelser. Denne graf viser, at fordelingen af ankomstforsinkelser er skæv. Den har en lang hale i de høje værdier.

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

Skærmbillede, der viser en graf over flyforsinkelser.

Indlæs dataene, og foretag et par ændringer af variablerne:

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)

Før vi bygger modellen, skal du overveje et par specifikke variabler, der er vigtige for både forbehandling og modellering.

Variablen arr_delay er en faktorvariabel. I forbindelse med oplæring af logistisk regressionsmodel er det vigtigt, at resultatvariablen er en faktorvariabel.

glimpse(flight_data)

Omkring 16% af flyvningerne i dette datasæt ankom mere end 30 minutter for sent.

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

Funktionen dest har 104 flightdestinationer.

unique(flight_data$dest)

Der er 16 forskellige transportører.

unique(flight_data$carrier)

Opdel dataene

Opdel det enkelte datasæt i to sæt: et trænings--sæt og et test sæt. Bevar de fleste rækker i det oprindelige datasæt (som et tilfældigt valgt undersæt) i træningsdatasættet. Brug oplæringsdatasættet, så det passer til modellen, og brug testdatasættet til at måle modellens ydeevne.

Brug rsample-pakken til at oprette et objekt, der indeholder oplysninger om, hvordan dataene opdeles. Brug derefter to yderligere rsample funktioner til at oprette DataFrames til oplærings- og testsættene:

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)

Opret en opskrift og roller

Opret en opskrift på en simpel logistisk regressionsmodel. Før du oplærer modellen, skal du bruge en opskrift til at oprette nye forudsigelser og udføre den forbehandling, som modellen kræver.

Brug funktionen update_role(), så opskrifterne ved, at flight og time_hour er variabler med en brugerdefineret rolle kaldet ID. En rolle kan have en vilkårlig tegnværdi. Formlen indeholder alle variabler i oplæringssættet, bortset fra arr_delay, som forudsigelser. Opskriften bevarer disse to id-variabler, men bruger dem ikke som enten resultater eller forudsigelser.

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

Hvis du vil have vist det aktuelle sæt variabler og roller, skal du bruge funktionen summary():

summary(flights_rec)

Opret funktioner

Gør noget funktionskonstruktion for at forbedre din model. Flydatoen kan have en rimelig indvirkning på sandsynligheden for en sen ankomst.

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

Det kan hjælpe at tilføje modelord, der er afledt af den dato, der potentielt har betydning for modellen. Aflede følgende meningsfulde funktioner fra variablen enkelt dato:

  • Ugedag
  • Måned
  • Om datoen svarer til en helligdag eller ej

Føj de tre trin til din opskrift:

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

Tilpas en model med en opskrift

Brug logistisk regression til at modellere flightdataene. Først skal du oprette en modelspecifikation med parsnip-pakken:

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

Brug workflows-pakken til at samle din parsnip model (lr_mod) med din opskrift (flights_rec):

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

flights_wflow

Oplær modellen

Denne funktion kan forberede opskriften og oplære modellen ud fra de resulterende forudsigelser:

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

Brug hjælpefunktionerne xtract_fit_parsnip() og extract_recipe() til at udtrække model- eller opskriftsobjekter fra arbejdsprocessen. I dette eksempel skal du trække i det monterede modelobjekt og derefter bruge funktionen broom::tidy() til at få en ryddelig tibble af modelkoefficienter:

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

Forudsig resultater

Et enkelt kald til predict() bruger den oplærte arbejdsproces (flights_fit) til at foretage forudsigelser med de usete testdata. Metoden predict() anvender opskriften på de nye data og overfører derefter resultaterne til den monterede model.

predict(flights_fit, test_data)

Hent outputtet fra predict() for at returnere den forudsagte klasse: late i forhold til on_time. Men for de forudsagte klassesandsynligheder for hvert fly skal du bruge augment() med modellen kombineret med testdata til at gemme dem sammen:

flights_aug <- 
  augment(flights_fit, test_data)

Gennemse dataene:

glimpse(flights_aug)

Evaluer modellen

Vi har nu en tibble med de forudsagte klasse sandsynligheder. I de første par rækker forudsagde modellen korrekt fem flyvninger til tiden (værdier for .pred_on_time er p > 0.50). Vi har dog 81.455 rækker i alt at forudsige.

Vi har brug for en metrikværdi, der fortæller, hvor godt modellen forudsagde forsinkede ankomster sammenlignet med den sande status for resultatvariablen arr_delay.

Brug Area Under the Curve Receiver Operating Characteristic (AUC-ROC) som metrikværdi. Udregn den med roc_curve() og roc_auc()fra yardstick-pakken:

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

Opret en Power BI-rapport

Modelresultatet ser godt ud. Brug resultaterne af flyforsinkelsen til at oprette et interaktivt Power BI-dashboard. Dashboardet viser antallet af flyafgange efter luftfartsselskab og antallet af flyvninger efter destination. Dashboardet kan filtrere efter resultaterne af forsinkelsesforudsigelsen.

Skærmbillede, der viser liggende søjlediagrammer for antallet af flyafgange efter operatør og antallet af flyafgange efter destination i en Power BI-rapport.

Medtag luftfartsselskabets navn og lufthavnsnavn i datasættet for forudsigelsesresultatet:

  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)

Gennemse dataene:

glimpse(flights_clean)

Konvertér dataene til en Spark DataFrame:

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

Skriv dataene i en deltatabel i lakehouse:

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

Brug deltatabellen til at oprette en semantisk model.

  1. Vælg OneLake til venstre

  2. Vælg det lakehouse, du har knyttet til din notesbog

  3. Vælg Åbn

    Skærmbillede, der viser knappen for at åbne et lakehouse.

  4. Vælg ny semantisk model

  5. Vælg nycflight13- for din nye semantiske model, og vælg derefter Bekræft

  6. Din semantiske model oprettes. Vælg ny rapport

  7. Vælg eller træk felter fra Data og Visualiseringer ruder til rapportlærredet for at oprette din rapport

    Skærmbillede, der viser data- og visualiseringsoplysninger for en rapport.

Hvis du vil oprette den rapport, der vises i begyndelsen af dette afsnit, skal du bruge disse visualiseringer og data:

  1. stablet liggende søjlediagram med:
    1. Y-akse: carrier_name
    2. X-akse: flight. Vælg Antal for sammenlægningen
    3. Forklaring: origin_name
  2. stablet liggende søjlediagram med:
    1. Y-akse: dest_name
    2. X-akse: flight. Vælg Antal for sammenlægningen
    3. Forklaring: origin_name
  3. udsnitsværktøj med:
    1. Felt: _pred_class
  4. udsnitsværktøj med:
    1. Felt: _pred_late