共用方式為


教學課程:使用 R 預測航班延誤

本教學課程提供 Microsoft Fabric 中 Synapse 資料科學工作流程的端對端範例。 它會使用 nycflights13 資料和 R 來預測飛機是否晚點 30 分鐘以上。 然後,它會使用預測結果來建置互動式 Power BI 儀表板。

在本教學課程中,您會了解如何:

  • 使用 tidymodels 套件 (配方、parsniprsample工作流程) 來處理資料並定型機器學習模型
  • 將輸出資料寫入 Lakehouse 作為差異資料表
  • 建置 Power BI 視覺報表以直接存取該 Lakehouse 中的資料

必要條件

  • 開啟或建立筆記本。 若要了解操作說明,請參閱如何使用 Microsoft Fabric 筆記本

  • 將語言選項設定為 SparkR (R),以變更主要語言。

  • 將筆記本連結至 Lakehouse。 在左側,選取 [新增],以新增現有的 Lakehouse 或建立 Lakehouse。

安裝套件

安裝 nycflights13 套件,以在本教學課程中使用程式碼。

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

探索資料

這些 nycflights13 資料有關於 2013 年抵達紐約市附近 325,819 個航班的資訊。 首先,檢視航班延誤的分佈。 此圖表顯示了抵達延遲的分佈偏斜。 它在高值中有長尾。

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

顯示航班延誤圖表的螢幕擷取畫面。

載入資料,並對變數進行一些變更:

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)

在建置模型之前,請考慮一些對於前置處理和模型而言很重要的特定變數。

變數 arr_delay 屬於因素變數。 對於羅吉斯迴歸模型定型,結果變數是因素變數很重要。

glimpse(flight_data)

此資料集中大約 16% 的航班已晚抵達 30 分鐘以上。

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

dest 功能有 104 個航班目的地。

unique(flight_data$dest)

有 16 家不同的航空公司。

unique(flight_data$carrier)

分割資料

將單一資料集分割成兩組:定型集和測試集。 在定型資料集中保留原始資料集的大部分資料列 (以隨機選擇的子集的形式)。 使用定型資料集來配合模型,並使用測試資料集來測量模型效能。

使用 rsample 套件來建立物件,其中包含如何分割資料的相關資訊。 然後,再使用兩個 rsample 函式來建立定型和測試集的 DataFrame:

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)

建立配方與角色

建立簡單羅吉斯迴歸模型的配方。 在定型模型之前,請使用配方來建立新的預測值,並執行模型所需的前置處理。

使用 update_role() 函式,讓配方知道 flighttime_hour 是變數,並具有稱為 ID 的自訂角色。 角色可以具有任一字元值。 此公式包含了定型集中的所有變數 (而非 arr_delay) 作為預測值。 配方會保留這兩個識別碼變數,但不會將它們當做結果或預測值使用。

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

若要檢視目前的一組變數和角色,請使用 summary() 函式:

summary(flights_rec)

建立功能

執行一些特徵工程以改善您的模型。 航班日期可能會對遲到的可能性產生合理影響。

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

新增由日期衍生、對模型有潛在重要性的模型詞彙可能會有幫助。 從單一日期變數衍生下列有意義的功能:

  • 星期幾
  • Month
  • 日期是否對應假日

將三個步驟新增至配方:

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

使用配方來調整模型

使用羅吉斯迴歸來建立飛行資料的模型。 首先,使用 parsnip 套件來建置模型規格:

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

使用 workflows 套件將 parsnip 模型 (lr_mod) 與您的配方 (flights_rec) 進行捆綁:

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

flights_wflow

定型模型

此函式可準備配方,並從產生的預測值定型模型:

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

使用協助程式函式 xtract_fit_parsnip()extract_recipe(),並從工作流程中擷取模型或配方物件。 在此範例中,提取適合的模型物件,然後使用 broom::tidy() 函式來取得整齊的模型係數:

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

預測結果

predict() 的單一呼叫會使用已定型的工作流程 (flights_fit) 來使用未顯示的測試資料進行預測。 predict() 方法會將配方套用至新資料,然後將結果傳遞至適合的模型。

predict(flights_fit, test_data)

predict() 取得輸出以傳回預測類別:lateon_time。 不過,針對每個飛行的預測類別機率,請搭配模型使用 augment(),結合測試資料,將它們儲存在一起:

flights_aug <- 
  augment(flights_fit, test_data)

檢閱資料:

glimpse(flights_aug)

評估模型

我們現在有一個包含預測類別機率的 tibble。 在前幾個資料列中,該模型正確預測了五個準時航班 (.pred_on_time 的值為 p > 0.50)。 不過,我們總共有 81,455 個資料列可預測。

我們需要一個計量,來顯示與結果變數 arr_delay 的真實狀態相比,模型預測的延誤情況。

使用「接收者作業特性曲線下方的面積」(AUC-ROC) 作為計量。 使用 roc_curve() 套件中的 roc_auc()yardstick 計算:

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

建置 Power BI 報告

模型結果看起來很不錯。 使用航班延誤預測結果來建置互動式 Power BI 儀表板。 儀表板會顯示依航空公司的航班數目,以及依目的地的航班數目。 儀表板可以依延遲預測結果進行篩選。

此螢幕擷取畫面顯示 Power BI 報表中依航空公司的航班數目和依目的地的航班數目的橫條圖。

在預測結果資料集中包含航空公司名稱和機場名稱:

  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)

檢閱資料:

glimpse(flights_clean)

將資料轉換成 Spark DataFrame:

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

將資料寫入 Lakehouse 中的差異資料表:

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

使用差異資料表來建立語意模型。

  1. 在左側,選取 [OneLake]

  2. 選取您連結至筆記本的 Lakehouse

  3. 選取 [開啟]

    顯示開啟 Lakehouse 按鈕的螢幕擷取畫面。

  4. 選取 [新語意模型]

  5. 針對新的語意模型選取 nycflight13,然後選取 [確認]

  6. 您的語意模型已建立。 選取 [新增報告]

  7. 從 [資料] 和 [視覺效果] 窗格選取或拖曳欄位到報表畫布上,以建置報表

    顯示報表資料與視覺效果詳細資料的螢幕擷取畫面。

若要建立本節開頭顯示的報表,請使用下列視覺效果和資料:

  1. 堆疊橫條圖與:
    1. Y 軸:carrier_name
    2. X 軸:航班。 為彙總選取 [計數]
    3. 圖例:origin_name
  2. 堆疊橫條圖與:
    1. Y 軸:dest_name
    2. X 軸:航班。 為彙總選取 [計數]
    3. 圖例:origin_name
  3. 交叉分析篩選器與:
    1. 欄位:_pred_class
  4. 交叉分析篩選器與:
    1. 欄位:_pred_late