共用方式為


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

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

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

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

必要條件

  • 開啟或建立筆記本。 若要瞭解如何,請參閱 如何使用 Microsoft Fabric 筆記本

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

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

安裝套件

安裝ny13 套件,以在本教學課程中使用程序代碼。

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)

Screenshot that shows a graph of flight delays.

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

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

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

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使用套件將模型 parsniplr_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)

評估模型

我們現在有一個可比對預測類別機率。 在前幾個數據列中,模型正確預測了五個準時航班(值為 .pred_on_timep > 0.50)。 不過,我們總共有81,455個數據列可預測。

我們需要一個計量,指出模型預測延遲抵達與結果變數 arr_delay的真實狀態相比有多好。

使用曲線接收器操作特性下的區域 (AUC-ROC) 作為計量。 使用和 roc_auc()從套件計算yardstickroc_curve()

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

建置 Power BI 報表

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

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

在預測結果數據集中包含貨運公司名稱和機場名稱:

  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. 選取 [ 開啟]

    Screenshot that shows the button to open a lakehouse.

  4. 選取 [新增語意模型]

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

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

  7. 從 [數據和視覺效果] 窗格選取或拖曳字段到報表畫布上,以建置報表

    Screenshot that shows data and visualization details for a report.

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

  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