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
En Power BI Premium prenumeration. Om du inte har någon läser du Så här köper du Power BI Premium.
En Power BI-arbetsyta med tilldelad Premium-kapacitet. Om du inte har en arbetsyta använder du stegen i Skapa en arbetsyta för att skapa en och tilldela den till en Premium-kapacitet.
Logga in på Microsoft Fabric.
Ö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)
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.
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.
Till vänster väljer du OneLake-datahubben.
Välj det Lakehouse som du har kopplat till anteckningsboken.
Välj Öppna längst upp till höger.
Längst upp väljer du Ny Power BI-datauppsättning.
Välj nycflight13 för den nya datauppsättningen och välj sedan Bekräfta.
Din Power BI-datauppsättning skapas. Längst upp väljer du Ny rapport.
Markera eller dra fält från fönstret data och visualiseringar till rapportarbetsytan för att skapa rapporten.
Om du vill skapa rapporten som visas i början av det här avsnittet använder du följande visualiseringar och data:
Staplat stapeldiagram med:
- Y-axel: carrier_name.
- X-axel: flyg. Välj Antal för aggregeringen.
- Förklaring: origin_name
Staplat stapeldiagram med:
- Y-axel: dest_name.
- X-axel: flyg. Välj Antal för aggregeringen.
- Förklaring: origin_name.
Utsnitt med:
- Fält: _pred_class
Utsnitt med:
- Fält: _pred_late