Zdieľať cez


Kurz: Použitie jazyka R na predpovedanie oneskorenia letu

Tento kurz predstavuje komplexný príklad pracovného postupu synapse Data Science v službe Microsoft Fabric. Používa nycflights13 dát, a R, predpovedať, či lietadlo príde viac ako 30 minút neskoro. Následne použije výsledky predpovede na vytvorenie interaktívnej tabule služby Power BI.

V tomto kurze sa naučíte:

  • Na spracovanie údajov a trénovanie modelu strojového učenia použite balíky recepty , rsample, pracovné postupy) .
  • Zapísanie výstupných údajov do jazera ako delta tabuľky
  • Vytvorenie zostavy vizuálu služby Power BI na priamy prístup k údajom v tomto jazere

Predpoklady

  • Získajte predplatné služby Microsoft Fabric . Alebo si zaregistrujte bezplatnú skúšobnú služby Microsoft Fabric.

  • Prihláste sa do služby Microsoft Fabric.

  • Pomocou prepínača skúseností v ľavej dolnej časti domovskej stránky sa prepnete na službu Fabric.

    Snímka obrazovky ponuky prepínača prostredí zobrazujúca, kde vybrať položku Dátová veda.

  • Otvorte alebo vytvorte poznámkový blok. Ďalšie informácie nájdete v téme Ako používať poznámkové bloky služby Microsoft Fabric.

  • Ak chcete zmeniť primárny jazyk, nastavte možnosť jazyka na SparkR (R).

  • Pripojte svoj notebook k jazeru. Na ľavej strane vyberte položku Pridať a pridajte existujúci lakehouse alebo vytvorte lakehouse.

Inštalácia balíkov

Nainštalujte si balík nycflights13, aby ste mohli použiť kód v tomto kurze.

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

Preskúmanie údajov

Údaje nycflights13 obsahujú informácie o 325 819 letoch, ktoré dorazili neďaleko New Yorku v roku 2013. Po prvé, pozrite si distribúciu meškaní letov. Tento graf ukazuje, že distribúcia oneskorenia príchodu je správne skreslená. Má dlhý chvost vo vysokých hodnotách.

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

Snímka obrazovky znázorňujúca graf zdržania letov.

Načítajte údaje a vykonajte niekoľko zmien premenný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),
    # 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)

Skôr než vytvoríme model, zvážte niekoľko konkrétnych premenných, ktoré sú dôležité pre predprocesovanie aj modelovanie.

Premenná arr_delay je premenná faktora. Pri trénovaní logistického regresného modelu je dôležité, aby premenná výsledku bola premennou faktora.

glimpse(flight_data)

Približne 16% letov v tejto množine údajov prišlo s viac ako 30 minútami neskoro.

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

Funkcia dest má 104 letových destinácií.

unique(flight_data$dest)

Existuje 16 rôznych dopravcov.

unique(flight_data$carrier)

Rozdelenie údajov

Jednu množinu údajov rozdeľte na dve množiny: množinu trénovania a množinu testovania . Väčšina riadkov v pôvodnej množine údajov (ako náhodne vybratej podmnožine) ponechajte v tréningovej množine údajov. Na prispôsobenie modelu použite tréningová množina údajov a na meranie výkonu modelu použite testovaciu množinu údajov.

Pomocou balíka rsample vytvorte objekt, ktorý obsahuje informácie o tom, ako rozdeliť údaje. Potom pomocou ďalších dvoch funkcií rsample vytvorte údajové rámce na trénovanie a testovanie množín:

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)

Vytvorenie receptu a rolí

Vytvorte recept na jednoduchý logistický regresný model. Pred trénovaním modelu použite recept na vytvorenie nových prediktorov a vykonajte predprocesovanie, ktoré model vyžaduje.

Použite funkciu update_role() tak, aby recepty vedeli, že flight a time_hour sú premenné s vlastnou rolou s názvom ID. Rola môže mať ľubovoľnú hodnotu znaku. Vzorec obsahuje všetky premenné z tréningovej množiny okrem arr_delayako prediktory. Recept udržuje tieto dve ID premenné, ale nepoužíva ich ako výsledky alebo prediktory.

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

Ak chcete zobraziť aktuálnu množinu premenných a rolí, použite funkciu summary():

summary(flights_rec)

Vytváranie funkcií

Zdokonaľte sa s niektorými technickými funkciami na vylepšenie modelu. Dátum letu môže mať primeraný vplyv na pravdepodobnosť neskorého príletu.

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

Môže pomôcť pridať výrazy modelu odvodené od dátumu, ktoré potenciálne majú význam pre model. Z premennej s jedným dátumom môžete odvodiť tieto zmysluplné funkcie:

  • Deň v týždni
  • Mesiac
  • Určuje, či dátum zodpovedá sviatku alebo nie

Do receptu pridajte tri kroky:

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

Fit model s receptom

Na modelovanie údajov o lete použite logistickú regresiu. Najskôr vytvorte špecifikáciu modelu s balíkom parsnip:

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

Balík workflows použite na vytvorenie zväzku parsnip modelu (lr_mod) s receptom (flights_rec):

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

flights_wflow

Trénovať model

Táto funkcia dokáže pripraviť recept a trénovať model z výsledných prediktorov:

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

Použite pomocné funkcie xtract_fit_parsnip() a extract_recipe() na extrakciu modelu alebo objektov receptu z pracovného postupu. V tomto príklade potiahnite namontovaný objekt modelu a pomocou funkcie broom::tidy() získate upratané dlaždicu koeficientov modelu:

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

Predpovedať výsledky

Jedno volanie funkcie predict() používa trénovaný pracovný postup (flights_fit) na vytvorenie predpovedí so neviditeľnými testovacími údajmi. Metóda predict() použije recept na nové údaje a potom odovzdá výsledky do vybaveného modelu.

predict(flights_fit, test_data)

Získajte výstup z predict() a vráťte predpokladanú triedu: late v porovnaní s on_time. Pre predpovedané pravdepodobnosti tried pre každý let však použite augment() s modelom v kombinácii s testovacími údajmi a uložte ich dokopy:

flights_aug <- 
  augment(flights_fit, test_data)

Kontrola údajov:

glimpse(flights_aug)

Vyhodnotenie modelu

Teraz máme dlaždicu s predpovedanými pravdepodobnosťami triedy. V prvých riadkoch model správne predpovedal päť letov súčasne (hodnoty .pred_on_timep > 0.50). Na predpovedanie máme však celkovo 81 455 riadkov.

Potrebujeme metriku, ktorá určuje, ako dobre model predpovedal neskoré príchody v porovnaní so skutočným stavom premennej výsledku, arr_delay.

Ako metriku použite oblasť pod charakteristikou prijímača krivky (AUC-ROC). Vypočítajte ho pomocou roc_curve() a roc_auc()z balíka yardstick:

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

Vytvorenie zostavy Power BI

Výsledok modelu vyzerá dobre. Interaktívnu tabuľu Služby Power BI vytvoríte pomocou výsledkov predpovede o meškaní letu. Tabuľa zobrazuje počet letov podľa dopravcu a počet letov podľa cieľa. Tabuľa môže filtrovať podľa výsledkov predpovede oneskorenia.

Snímka obrazovky zobrazujúca pruhové grafy počtu letov podľa dopravcu a počtu letov podľa cieľa v zostave služby Power BI.

Do množiny údajov výsledkov predpovede zadajte názov dopravcu a názov letiska:

  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)

Kontrola údajov:

glimpse(flights_clean)

Konverzia údajov na údajový rámec Spark:

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

Zapíšte údaje do tabuľky delta v dome lakehouse:

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

Na vytvorenie sémantického modelu použite delta tabuľky.

  1. Na ľavej strane vyberte OneLake

  2. Vyberte jazero, ktoré ste pripojili k poznámkovým blokom

  3. Vyberte položku Otvoriť

    Snímka obrazovky zobrazujúca tlačidlo na otvorenie jazera.

  4. Vyberte Nový sémantický model

  5. Vyberte položku nycflight13 pre nový sémantický model a potom vyberte položky Potvrdiť

  6. Vytvorí sa sémantický model. Vyberte položky Nová zostavy

  7. Vyberte alebo potiahnite polia zo Údaje a Tably Vizualizácie na plátno na vytváranie zostáv a vytvorte zostavu.

    Snímka obrazovky, ktorá zobrazuje podrobnosti údajov a vizualizácií zostavy.

Ak chcete vytvoriť zostavu zobrazenú na začiatku tejto časti, použite tieto vizualizácie a údaje:

  1. skladaný pruhový graf s:
    1. Os y: carrier_name
    2. Os x: let. Výber položky Počet pre agregáciu
    3. Legenda: origin_name
  2. skladaný pruhový graf s:
    1. Os y: dest_name
    2. Os x: let. Výber položky Počet pre agregáciu
    3. Legenda: origin_name
  3. rýchly filter s:
    1. Pole: _pred_class
  4. rýchly filter s:
    1. Pole: _pred_late