Förutsägelse av flygförsening

Den här artikeln använder data för nycflights13 för att förutsäga om ett plan anländer mer än 30 minuter för sent. Sedan använder vi förutsägelseresultatet för att skapa en interaktiv Power BI-instrumentpanel.

Viktigt

Microsoft Fabric är en förhandsversion.

I den här guiden får du lära dig att:

  • Använd tidymodels-paket , till exempel recept, palsternacka, rsample , arbetsflöden för att bearbeta data och träna en maskininlärningsmodell.
  • Skriv utdata till lakehouse som deltatabell.
  • Skapa en visuell Power BI-rapport via Läget Visa genom direkt åtkomst till data i lakehouse.

Förutsättningar

  • Öppna eller skapa en notebook-fil. Mer information finns i Så här använder du Microsoft Fabric-notebook-filer.

  • Ändra det primära språket genom att ange språkalternativet till SparkR (R).

  • Bifoga anteckningsboken i ett sjöhus. Till vänster väljer du Lägg till för att lägga till ett befintligt sjöhus eller skapa ett sjöhus.

  • Bifoga anteckningsboken i ett sjöhus. Till vänster väljer du Lägg till för att lägga till ett befintligt sjöhus eller skapa ett sjöhus.

Installera paket

Om du vill använda kod i den här artikeln installerar du paketet nycflights13.

install.packages("nycflights13")
# load the packages
library(tidymodels)      # for tidymodels packages
library(nycflights13)    # for flight data

Datagranskning

Uppgifterna nycflights13 innehåller information om 325 819 flygningar som avgick nära New York City 2013. Först tar vi en titt på fördelningen av flygförsening. Bilden nedan visar att fördelningen av den ankomna fördröjningen är rätt skev, den har lång svans i de höga värdena.

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

Diagram över flygförsening.

Läs in data och gör några ändringar i variablerna:

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),
    # we will use the date (not date-time) in the recipe below
    date = lubridate::as_date(time_hour)
  ) %>% 
  # include the weather data
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  # only retain the specific columns we will 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 is better to have qualitative columns
  # encoded as factors (instead of character strings)
  mutate_if(is.character, as.factor)

Innan du börjar skapa din modell ska vi ta en snabb titt på några specifika variabler som är viktiga för både förbearbetning och modellering.

Observera att variabeln som kallas arr_delay är en faktorvariabel. iDet är viktigt att din resultatvariabel för träning av en logistisk regressionsmodell är en faktor.

glimpse(flight_data)

Du ser att cirka 16 % av flygningarna i den här datamängden kom mer än 30 minuter för sent.

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

Det finns 104 flygdestinationer i dest.

unique(flight_data$dest)

Det finns 16 olika transportföretag.

unique(flight_data$carrier)

Datadelning

Kom igång genom att dela upp den här enskilda datauppsättningen i två: en träningsuppsättning och en testuppsättning . Behåll de flesta rader i den ursprungliga datauppsättningen (delmängden väljs slumpmässigt) i träningsuppsättningen. Träningsdata används för att passa modellen och testuppsättningen används för att mäta modellens prestanda.

rsample Använd paketet för att skapa ett -objekt som innehåller information om hur du delar upp data och sedan ytterligare rsample två funktioner för att skapa dataramar för tränings- och testuppsättningarna:

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

# create data frames for the two sets:
train_data <- training(data_split)
test_data  <- testing(data_split)

Skapa recept och roller

Skapa ett recept för en enkel logistisk regressionsmodell. Innan du tränar modellen använder du ett recept för att skapa några nya prediktorer och utföra viss förbearbetning som krävs av modellen.

Använd funktionen för att informera recepten update_role() om att flight och time_hour är variabler med en anpassad roll som heter ID (en roll kan ha valfritt teckenvärde). Formeln innehåller alla variabler i träningsuppsättningen förutom arr_delay som prediktorer. Receptet behåller dessa två ID-variabler men använder dem inte som resultat eller prediktorer.

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

Om du vill visa den aktuella uppsättningen variabler och roller använder du summary() funktionen :

summary(flights_rec)

Skapa funktioner

Gör vissa funktionsframställning för att förbättra din modell. Kanske är det rimligt att datumet för flygningen påverkar sannolikheten för en sen ankomst.

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

Det kan vara bättre att lägga till modelltermer som härletts från det datum som har en bättre potential att vara viktiga för modellen. Härled följande meningsfulla funktioner från variabeln single date:

  • Veckodag
  • Månad
  • Om datumet motsvarar en helgdag eller inte.

Gör alla tre genom att lägga till steg i ditt recept:

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

Anpassa en modell med ett recept

Använd logistisk regression för att modellera flygdata. Börja med att skapa modellspecifikationen med hjälp av parsnip paketet:

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

workflows Använd sedan paketet för att paketera din parsnip modell (lr_mod) med ditt recept (flights_rec).

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

flights_wflow

Träna modellen

Här är en enda funktion som kan användas för att förbereda receptet och träna modellen från de resulterande prediktorerna:

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

Använd hjälpfunktionerna xtract_fit_parsnip() och extract_recipe() för att extrahera modell- eller receptobjekt från arbetsflödet. Här kan du till exempel hämta det anpassade modellobjektet och sedan använda broom::tidy() funktionen för att få en prydlig tibble av modellkoefficienter:

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

Förutsäga resultat

Använd nu det tränade arbetsflödet (flights_fit) för att förutsäga med osedda testdata, vilket du gör med ett enda anrop till predict(). Metoden predict() tillämpar receptet på nya data och skickar dem sedan till den anpassade modellen.

predict(flights_fit, test_data)

Hämta nu utdata från predict() den förutsagda klassen: late jämfört med on_time. Om du vill ha de förutsagda klassannolikheterna för varje flygning i stället använder augment() du med modellen plus testdata för att spara dem tillsammans:

flights_aug <- 
  augment(flights_fit, test_data)

Data ser ut så här:

glimpse(flights_aug)

Utvärdera modellen

Nu har du en tibble med dina förutsagda klassannolikheter. Från de första raderna ser du att din modell förutsade 5 på tidsflygningar korrekt (värdena .pred_on_time för är p > 0,50). Men du vet också att vi har totalt 81 455 rader att förutsäga.

Du vill ha ett mått som anger hur väl din modell förutsagde sena ankomster, jämfört med den sanna statusen för utfallsvariabeln, arr_delay.

Använd området under ROC-kurvan som vårt mått, beräknat med och roc_curve()roc_auc() från yardstick paketet.

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

Skapa en Power BI-rapport

Modellresultatet är inte så dåligt! Använd förutsägelseresultatet för flygförsening för att skapa en interaktiv Power BI-instrumentpanel som visar antalet flygresor per flygbolag och antalet flygningar per mål. Instrumentpanelen kan också filtrera efter resultatet av förutsägelsefördröjningen.

Diagram över Power BI-rapport.

Inkludera först transportföretagets namn och flygplatsnamnet i datamängden för förutsägelseresultatet.

  flights_clean <- flights_aug %>% 
  # include the airline data
  left_join(airlines, c("carrier"="carrier"))%>% 
  rename("carrier_name"="name") %>%
  # include the airports data for origin
  left_join(airports, c("origin"="faa")) %>%
  rename("origin_name"="name") %>%
  # include the airports data for destination
  left_join(airports, c("dest"="faa")) %>%
  rename("dest_name"="name") %>%
  # only retain the specific columns we will 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)

Data ser ut så här:

glimpse(flights_clean)

Konvertera data till Spark-dataramen:

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

Skriv data till en deltatabell i lakehouse:

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

Nu kan du använda den här tabellen för att skapa en Power BI-datauppsättning.

  1. Till vänster väljer du OneLake-datahubben.

  2. Välj det Lakehouse som du har kopplat till anteckningsboken.

  3. Välj Öppna längst upp till höger.

    Skärmbild som visar var du kan öppna lakehouse.

  4. Längst upp väljer du Ny Power BI-datauppsättning.

  5. Välj nycflight13 för den nya datauppsättningen och välj sedan Bekräfta.

  6. Din Power BI-datauppsättning skapas. Längst upp väljer du Ny rapport.

  7. Markera eller dra fält från fönstret data och visualiseringar till rapportarbetsytan för att skapa rapporten.

Diagram över Power BI-datauppsättning.

Om du vill skapa rapporten som visas i början av det här avsnittet använder du följande visualiseringar och data:

  1. Staplat stapeldiagram med:
    1. Y-axel: carrier_name.
    2. X-axel: flyg. Välj Antal för aggregeringen.
    3. Förklaring: origin_name
  2. Staplat stapeldiagram med:
    1. Y-axel: dest_name.
    2. X-axel: flyg. Välj Antal för aggregeringen.
    3. Förklaring: origin_name.
  3. Utsnitt med:
    1. Fält: _pred_class
  4. Utsnitt med:
    1. Fält: _pred_late

Nästa steg