Udostępnij za pośrednictwem


Samouczek: przewidywanie opóźnienia lotu przy użyciu języka R

Ten samouczek przedstawia pełny przykład przepływu pracy usługi Synapse Nauka o danych w usłudze Microsoft Fabric. Używa on danych nycflights13 i R, aby przewidzieć, czy samolot przybywa ponad 30 minut późno. Następnie użyje wyników przewidywania do utworzenia interaktywnego pulpitu nawigacyjnego usługi Power BI.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Używanie pakietów tidymodels (przepisy, parsnip, rsample, przepływy pracy) do przetwarzania danych i trenowania modelu uczenia maszynowego
  • Zapisywanie danych wyjściowych w usłudze Lakehouse jako tabeli różnicowej
  • Tworzenie raportu wizualizacji usługi Power BI w celu bezpośredniego uzyskiwania dostępu do danych w tym lakehouse

Wymagania wstępne

  • Uzyskaj subskrypcję usługi Microsoft Fabric. Możesz też utworzyć konto bezpłatnej wersji próbnej usługi Microsoft Fabric.

  • Zaloguj się do usługi Microsoft Fabric.

  • Użyj przełącznika środowiska po lewej stronie głównej, aby przełączyć się na środowisko usługi Synapse Nauka o danych.

    Screenshot of the experience switcher menu, showing where to select Data Science.

  • Otwórz lub utwórz notes. Aby dowiedzieć się, jak używać notesów usługi Microsoft Fabric, zobacz Jak używać notesów usługi Microsoft Fabric.

  • Ustaw opcję języka na SparkR (R), aby zmienić język podstawowy.

  • Dołącz notes do magazynu lakehouse. Po lewej stronie wybierz pozycję Dodaj , aby dodać istniejący obiekt lakehouse lub utworzyć jezioro.

Instalowanie pakietów

Zainstaluj pakiet nycflights13, aby użyć kodu w tym samouczku.

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

Eksplorowanie danych

Dane nycflights13 zawierają informacje o 325 819 lotach, które przybyły w pobliżu Nowego Jorku w 2013 roku. Najpierw wyświetl rozkład opóźnień lotów. Ten wykres pokazuje, że rozkład opóźnień przylotów jest pochyły. Ma długi ogon w wysokich wartościach.

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

Screenshot that shows a graph of flight delays.

Załaduj dane i wprowadź kilka zmian w zmiennych:

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)

Przed utworzeniem modelu należy wziąć pod uwagę kilka określonych zmiennych, które są ważne zarówno w przypadku przetwarzania wstępnego, jak i modelowania.

Zmienna arr_delay jest zmienną współczynnikową. W przypadku trenowania modelu regresji logistycznej ważne jest, aby zmienna wynikowa była zmienną czynnikową.

glimpse(flight_data)

Około 16% lotów w tym zestawie danych przybyło ponad 30 minut późno.

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

Ta dest funkcja ma 104 miejsca docelowe lotów.

unique(flight_data$dest)

Istnieje 16 odrębnych przewoźników.

unique(flight_data$carrier)

Dzielenie danych

Podziel pojedynczy zestaw danych na dwa zestawy: zestaw treningowy i zestaw testowy. Zachowaj większość wierszy w oryginalnym zestawie danych (jako losowo wybrany podzestaw) w zestawie danych trenowania. Użyj zestawu danych trenowania, aby dopasować model i użyć zestawu danych testowego do mierzenia wydajności modelu.

rsample Użyj pakietu, aby utworzyć obiekt zawierający informacje o sposobie dzielenia danych. Następnie użyj dwóch kolejnych rsample funkcji, aby utworzyć ramki danych dla zestawów trenowania i testowania:

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)

Tworzenie przepisu i ról

Utwórz przepis na prosty model regresji logistycznej. Przed rozpoczęciem trenowania modelu użyj przepisu, aby utworzyć nowe czynniki prognostyczne i przeprowadzić wstępne przetwarzanie wymagane przez model.

update_role() Użyj funkcji , aby przepisy wiedziały, że flight zmienne i time_hour są zmiennymi z rolą niestandardową o nazwie ID. Rola może mieć dowolną wartość znaku. Formuła zawiera wszystkie zmienne w zestawie treningowym innym niż arr_delay, jako predyktory. Przepis przechowuje te dwie zmienne identyfikatorów, ale nie używa ich jako wyników lub predyktorów.

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

Aby wyświetlić bieżący zestaw zmiennych i ról, użyj summary() funkcji :

summary(flights_rec)

Tworzenie cech

Wykonaj kilka inżynierii cech, aby ulepszyć model. Data lotu może mieć rozsądny wpływ na prawdopodobieństwo późnego przyjazdu.

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

Może to pomóc w dodaniu terminów modelu pochodzących z daty, która potencjalnie ma znaczenie dla modelu. Uzyskiwanie następujących znaczących cech z pojedynczej zmiennej daty:

  • Dzień tygodnia
  • Month
  • Określa, czy data odpowiada wakacjom

Dodaj trzy kroki do swojego przepisu:

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

Dopasuj model z przepisem

Użyj regresji logistycznej, aby modelować dane lotu. Najpierw skompiluj specyfikację modelu przy użyciu parsnip pakietu:

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

workflows Użyj pakietu, aby powiązać parsnip model (lr_mod) z przepisem (flights_rec):

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

flights_wflow

Szkolenie modelu

Ta funkcja może przygotować przepis i wytrenować model z wynikowych predyktorów:

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

Użyj funkcji xtract_fit_parsnip() pomocnika i extract_recipe() wyodrębnij obiekty modelu lub przepisu z przepływu pracy. W tym przykładzie pobierz dopasowany obiekt modelu, a następnie użyj broom::tidy() funkcji , aby uzyskać tidy tibble współczynników modelu:

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

Przewidywanie wyników

Pojedyncze wywołanie do predict() użycia wytrenowanego przepływu pracy (flights_fit) w celu przewidywania z niezaznaczonymi danymi testowymi. Metoda predict() stosuje przepis do nowych danych, a następnie przekazuje wyniki do dopasowanego modelu.

predict(flights_fit, test_data)

Pobierz dane wyjściowe z predict() , aby zwrócić przewidywaną klasę: late a on_time. Jednak w przypadku prawdopodobieństwa przewidywanej klasy dla każdego lotu użyj modelu augment() w połączeniu z danymi testowymi, aby je zapisać razem:

flights_aug <- 
  augment(flights_fit, test_data)

Przejrzyj dane:

glimpse(flights_aug)

Ocenianie modelu

Mamy teraz piszczel z przewidywanymi prawdopodobieństwami klas. W pierwszych kilku wierszach model prawidłowo przewidział pięć lotów na czas (wartości .pred_on_time to p > 0.50). Mamy jednak 81 455 wierszy do przewidzenia.

Potrzebujemy metryki, która informuje, jak dobrze model przewidział późne przybycie w porównaniu z rzeczywistym stanem zmiennej wyniku. arr_delay

Jako metrykę użyj obszaru pod krzywą odbiornika charakterystyki operacyjnej (AUC-ROC). Oblicz go za pomocą elementów roc_curve() i roc_auc()z yardstick pakietu :

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

Tworzenie raportu usługi Power BI

Wynik modelu wygląda dobrze. Użyj wyników przewidywania opóźnienia lotu, aby utworzyć interaktywny pulpit nawigacyjny usługi Power BI. Na pulpicie nawigacyjnym jest wyświetlana liczba lotów według przewoźnika oraz liczba lotów według miejsca docelowego. Pulpit nawigacyjny może filtrować według wyników przewidywania opóźnień.

Screenshot that shows bar charts for number of flights by carrier and number of flights by destination in a Power BI report.

Uwzględnij nazwę przewoźnika i nazwę lotniska w zestawie danych wyników przewidywania:

  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)

Przejrzyj dane:

glimpse(flights_clean)

Przekonwertuj dane na ramkę danych platformy Spark:

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

Zapisz dane w tabeli delty w usłudze Lakehouse:

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

Użyj tabeli różnicowej, aby utworzyć model semantyczny.

  1. Po lewej stronie wybierz pozycję OneLake Data Hub

  2. Wybierz usługę Lakehouse dołączoną do notesu

  3. Wybierz pozycję Otwórz

    Screenshot that shows the button to open a lakehouse.

  4. Wybierz pozycję Nowy model semantyczny

  5. Wybierz pozycję nycflight13 dla nowego modelu semantycznego, a następnie wybierz pozycję Potwierdź

  6. Zostanie utworzony model semantyczny. Wybierz pozycję Nowy raport

  7. Wybieranie lub przeciąganie pól z okienka Dane i wizualizacje na kanwę raportu w celu skompilowania raportu

    Screenshot that shows data and visualization details for a report.

Aby utworzyć raport pokazany na początku tej sekcji, użyj tych wizualizacji i danych:

  1. Skumulowany wykres słupkowy z:
    1. Oś Y: carrier_name
    2. Oś X: lot. Wybierz pozycję Liczba dla agregacji
    3. Legenda: origin_name
  2. Skumulowany wykres słupkowy z:
    1. Oś Y: dest_name
    2. Oś X: lot. Wybierz pozycję Liczba dla agregacji
    3. Legenda: origin_name
  3. Fragmentator z:
    1. Pole: _pred_class
  4. Fragmentator z:
    1. Pole: _pred_late