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

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

Graf zpoždění letu

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í.

Graf sestavy Power BI

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.

  1. Na levé straně vyberte Datové centrum OneLake.

  2. Vyberte Lakehouse, který jste připojili k poznámkovému bloku.

  3. V pravém horním rohu vyberte Otevřít.

    Snímek obrazovky ukazuje, kde se má lakehouse otevřít.

  4. Nahoře vyberte Nová datová sada Power BI.

  5. Jako novou datovou sadu vyberte nycflight13 a pak vyberte Potvrdit.

  6. Vaše datová sada Power BI se vytvoří. Nahoře vyberte Nová sestava.

  7. Sestavu vytvoříte výběrem nebo přetažením polí z podokna dat a vizualizací na plátno sestavy.

Graf datové sady Power BI

K vytvoření sestavy zobrazené na začátku této části použijte následující vizualizace a data:

  1. Skládaný pruhový graf s:
    1. Osa Y: carrier_name.
    2. Osa X: let. Jako agregaci vyberte Počet .
    3. Legenda: origin_name
  2. Skládaný pruhový graf s:
    1. Osa Y: dest_name.
    2. Osa X: let. Jako agregaci vyberte Počet .
    3. Legenda: origin_name.
  3. Průřez s:
    1. Pole: _pred_class
  4. Průřez s:
    1. Pole: _pred_late

Další kroky