Předpověď zpoždění letu
Tento článek používá data nycflights13 k předpovídání, jestli letadlo přiletí o více než 30 minut později. Výsledky předpovědi pak použijeme k vytvoření interaktivního řídicího panelu Power BI.
Důležité
Microsoft Fabric je v současné době ve verzi PREVIEW. Tyto informace se týkají předběžného vydání produktu, který může být před vydáním podstatně změněn. Společnost Microsoft neposkytuje na zde uvedené informace žádné záruky, ať už vyjádřené nebo předpokládané.
V tomto kurzu se naučíte:
- Ke zpracování dat a trénování modelu strojového učení použijte balíčky tidymodels , jako jsou recepty, parsnip, rsample a pracovní postupy .
- Zapište výstupní data do lakehouse jako rozdílovou tabulku.
- Vytvořte vizuální sestavu Power BI v režimu Zobrazit prostřednictvím přímého přístupu k datům v lakehouse.
Požadavky
Předplatné Power BI Premium. Pokud ho nemáte, podívejte se na článek Jak koupit Power BI Premium.
Pracovní prostor Power BI s přiřazenou kapacitou Premium Pokud pracovní prostor nemáte, vytvořte ho podle kroků v tématu Vytvoření pracovního prostoru a přiřaďte ho ke kapacitě Premium.
Přihlaste se k Microsoft Fabric.
Otevřete nebo vytvořte poznámkový blok. Postup najdete v tématu Používání poznámkových bloků Microsoft Fabric.
Změňte primární jazyk nastavením možnosti jazyka na SparkR (R).
Připojte poznámkový blok k lakehouse. Na levé straně vyberte Přidat a přidejte existující lakehouse nebo vytvořte lakehouse.
- Připojte poznámkový blok k lakehouse. Na levé straně vyberte Přidat a přidejte existující lakehouse nebo vytvořte lakehouse.
Instalace balíčku
Pokud chcete použít kód v tomto článku, nainstalujte balíček nycflights13.
install.packages("nycflights13")
# load the packages
library(tidymodels) # for tidymodels packages
library(nycflights13) # for flight data
Zkoumání dat
Data nycflights13
obsahují informace o 325 819 letech, které v roce 2013 odletěly poblíž New Yorku. Pojďme se nejprve podívat na distribuci zpoždění letu. Následující obrázek ukazuje, že rozdělení zpoždění doručení je vpravo zkosené, má dlouhé chvosty ve vysokých hodnotách.
ggplot(flights, aes(arr_delay)) + geom_histogram(color="blue", bins = 300)
Načtěte data a proveďte několik změn proměnných:
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)
Než začnete vytvářet model, pojďme se rychle podívat na několik konkrétních proměnných, které jsou důležité pro předzpracování i modelování.
Všimněte si, že proměnná s názvem arr_delay
je proměnná faktoru. i Je důležité, aby proměnná výsledku pro trénování logistického regresního modelu byla faktorem.
glimpse(flight_data)
Uvidíte, že přibližně 16 % letů v této sadě dat dorazilo o více než 30 minut se zpožděním.
flight_data %>%
count(arr_delay) %>%
mutate(prop = n/sum(n))
Součástí je 104 letových destinací.dest
unique(flight_data$dest)
Existuje 16 různých operátorů.
unique(flight_data$carrier)
Rozdělování dat
Začněte tím, že rozdělíte tuto jednu datovou sadu na dvě: trénovací sadu a testovací sadu. V trénovací sadě ponechejte většinu řádků v původní datové sadě (náhodně zvolená podmnožina). Trénovací data se používají k přizpůsobení modelu a testovací sada se používá k měření výkonu modelu.
rsample
Pomocí balíčku vytvořte objekt, který obsahuje informace o tom, jak rozdělit data, a pak další rsample
dvě funkce k vytvoření datových rámců pro trénovací a testovací sady:
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)
Vytvoření receptu a rolí
Vytvořte recept na jednoduchý logistický regresní model. Před trénováním modelu pomocí receptu vytvořte několik nových prediktorů a proveďte předzpracování, které model vyžaduje.
update_role()
Pomocí funkce dejte receptům vědět, že flight
a time_hour
jsou proměnné s vlastní rolí s názvem ID
(role může mít libovolnou hodnotu znaku). Vzorec zahrnuje všechny proměnné v trénovací sadě kromě arr_delay
prediktorů. Tento recept tyto dvě proměnné ID uchovává, ale nepoužívá je jako výsledky ani jako predikce.
flights_rec <-
recipe(arr_delay ~ ., data = train_data) %>%
update_role(flight, time_hour, new_role = "ID")
K zobrazení aktuální sady proměnných a rolí použijte summary()
funkci:
summary(flights_rec)
Vytváření funkcí
Vylepšete svůj model pomocí přípravy funkcí. Možná je vhodné, aby datum letu mělo vliv na pravděpodobnost pozdního příletu.
flight_data %>%
distinct(date) %>%
mutate(numeric_date = as.numeric(date))
Možná bude lepší přidat termíny modelu odvozené od data, které mají lepší potenciál být pro model důležité. Z proměnné s jedním datem odvozujte následující smysluplné funkce:
- Den v týdnu
- Month (Měsíc)
- Určuje, jestli datum odpovídá svátku.
Proveďte všechny tři kroky přidáním kroků do receptu:
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())
Přizpůsobení modelu receptem
Využijte logistickou regresi k modelování letových dat. Začněte vytvořením specifikace modelu pomocí parsnip
balíčku:
lr_mod <-
logistic_reg() %>%
set_engine("glm")
Pak pomocí workflows
balíčku sbalte model parsnip
(lr_mod
) s vaším receptem (flights_rec
).
flights_wflow <-
workflow() %>%
add_model(lr_mod) %>%
add_recipe(flights_rec)
flights_wflow
Trénování modelu
Tady je jedna funkce, kterou můžete použít k přípravě receptu a trénování modelu z výsledných prediktorů:
flights_fit <-
flights_wflow %>%
fit(data = train_data)
Pomocí pomocných funkcí xtract_fit_parsnip()
a extract_recipe()
extrahujte objekty modelu nebo receptu z pracovního postupu. Tady například vytáhnete fitovaný objekt modelu a pak pomocí broom::tidy()
funkce získáte přehledný přehled o koeficientech modelu:
flights_fit %>%
extract_fit_parsnip() %>%
tidy()
Předpověď výsledků
Teď pomocí natrénovaného pracovního postupu (flights_fit
) předpovídáte s neviditelnými testovacími daty, což provedete jediným voláním predict()
. Metoda predict()
aplikuje recept na nová data a pak je předá do fit modelu.
predict(flights_fit, test_data)
Teď získejte výstup z predict()
vrácení předpovězené třídy: late
versus on_time
. Pokud místo toho chcete pravděpodobnosti předpovězené třídy pro jednotlivé testovací lety, uložte augment()
je společně s modelem a testovacími daty:
flights_aug <-
augment(flights_fit, test_data)
Data vypadají takto:
glimpse(flights_aug)
Vyhodnocení modelu
Teď máte přehled o předpovězených pravděpodobnostech tříd. Z těchto prvních několika řádků vidíte, že váš model správně předpověděl 5 v časových .pred_on_time
letech (hodnoty jsou p > 0,50). Ale také víte, že máme celkem 81 455 řádků, abychom mohli předpovědět.
Chcete metriku, která udává, jak dobře model předpověděl pozdní příchody v porovnání se skutečným stavem proměnné výsledku. arr_delay
Jako naši metriku vypočítanou pomocí roc_curve()
a roc_auc()
z balíčku použijte oblast pod křivkou yardstick
ROC.
flights_aug %>%
roc_curve(truth = arr_delay, .pred_late) %>%
autoplot()
Vytvoření sestavy Power BI
Výsledek modelu není tak špatný! Výsledky předpovědi zpoždění letů použijte k vytvoření interaktivního řídicího panelu Power BI, který zobrazuje počet letů podle dopravce a počet letů podle cíle. Řídicí panel je také schopen filtrovat podle výsledků predikce zpoždění.
Nejprve do datové sady výsledků předpovědi zadejte název dopravce a název letiště.
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 vypadají takto:
glimpse(flights_clean)
Převeďte data na datový rámec Sparku:
sparkdf <- as.DataFrame(flights_clean)
display(sparkdf)
Zapište data do tabulky delta v lakehouse:
# write data into delta table
temp_delta<-"Tables/nycflight13"
write.df(sparkdf, temp_delta ,source="delta", mode = "overwrite", header = "true")
Tuto tabulku teď můžete použít k vytvoření datové sady Power BI.
Na levé straně vyberte Datové centrum OneLake.
Vyberte Lakehouse, který jste připojili k poznámkovému bloku.
V pravém horním rohu vyberte Otevřít.
Nahoře vyberte Nová datová sada Power BI.
Jako novou datovou sadu vyberte nycflight13 a pak vyberte Potvrdit.
Vaše datová sada Power BI se vytvoří. Nahoře vyberte Nová sestava.
Sestavu vytvoříte výběrem nebo přetažením polí z podokna dat a vizualizací na plátno sestavy.
K vytvoření sestavy zobrazené na začátku této části použijte následující vizualizace a data:
Skládaný pruhový graf s:
- Osa Y: carrier_name.
- Osa X: let. Jako agregaci vyberte Počet .
- Legenda: origin_name
Skládaný pruhový graf s:
- Osa Y: dest_name.
- Osa X: let. Jako agregaci vyberte Počet .
- Legenda: origin_name.
Průřez s:
- Pole: _pred_class
Průřez s:
- Pole: _pred_late