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.
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)
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
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_delay
ako 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_time
sú p > 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.
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.
Na ľavej strane vyberte OneLake
Vyberte jazero, ktoré ste pripojili k poznámkovým blokom
Vyberte položku Otvoriť
Vyberte Nový sémantický model
Vyberte položku nycflight13 pre nový sémantický model a potom vyberte položky Potvrdiť
Vytvorí sa sémantický model. Vyberte položky Nová zostavy
Vyberte alebo potiahnite polia zo Údaje a Tably Vizualizácie na plátno na vytváranie zostáv a vytvorte zostavu.
Ak chcete vytvoriť zostavu zobrazenú na začiatku tejto časti, použite tieto vizualizácie a údaje:
-
skladaný pruhový graf s:
- Os y: carrier_name
- Os x: let. Výber položky Počet pre agregáciu
- Legenda: origin_name
-
skladaný pruhový graf s:
- Os y: dest_name
- Os x: let. Výber položky Počet pre agregáciu
- Legenda: origin_name
-
rýchly filter s:
- Pole: _pred_class
-
rýchly filter s:
- Pole: _pred_late