教學課程:使用 R 預測航班延誤
本教學課程提供 Microsoft Fabric 中 Synapse 資料科學 工作流程的端對端範例。 它會使用 nyc利安13 數據和 R 來預測飛機是否晚到 30 分鐘以上。 然後,它會使用預測結果來建置互動式Power BI儀錶板。
在本教學課程中,您會了解如何:
- 使用 tidymodels 套件 (配方、parsnip、rsample、工作流程)來處理數據並定型機器學習模型
- 將輸出數據寫入 Lakehouse 作為差異數據表
- 建置 Power BI 視覺效果報表以直接存取該 Lakehouse 中的數據
必要條件
取得 Microsoft Fabric 訂用 帳戶。 或者,註冊免費的 Microsoft Fabric 試用版。
登入 Microsoft Fabric。
使用首頁左側的體驗切換器,切換至 Synapse 資料科學 體驗。
開啟或建立筆記本。 若要瞭解如何,請參閱 如何使用 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)
載入數據,並對變數進行一些變更:
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()
式,讓配方知道 flight
和 time_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()
以傳回預測類別: late
與 on_time
。 不過,針對每個飛行的預測類別機率,請搭配模型使用 augment()
,結合測試數據,將它們儲存在一起:
flights_aug <-
augment(flights_fit, test_data)
檢閱資料:
glimpse(flights_aug)
評估模型
我們現在有一個可比對預測類別機率。 在前幾個數據列中,模型正確預測了五個準時航班(值為 .pred_on_time
p > 0.50
)。 不過,我們總共有81,455個數據列可預測。
我們需要一個計量,指出模型預測延遲抵達與結果變數 arr_delay
的真實狀態相比有多好。
使用曲線接收器操作特性下的區域 (AUC-ROC) 作為計量。 使用和 roc_auc()
從套件計算yardstick
:roc_curve()
flights_aug %>%
roc_curve(truth = arr_delay, .pred_late) %>%
autoplot()
建置 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")
使用差異數據表來建立語意模型。
在左側,選取 OneLake 數據中樞
選取您附加至筆記本的 Lakehouse
選取 [ 開啟]
選取 [新增語意模型]
針對新的語意模型選取 nycflight13 ,然後選取 [ 確認]
您的語意模型已建立。 選取 [新增報告]
從 [數據和視覺效果] 窗格選取或拖曳字段到報表畫布上,以建置報表
若要建立本節開頭顯示的報表,請使用下列視覺效果和數據:
堆疊條形圖與:
- Y 軸: carrier_name
- X 軸: 正式發行前小眾測試版。 選取 匯總的 [計數 ]
- 圖例: origin_name
堆疊條形圖與:
- Y 軸: dest_name
- X 軸: 正式發行前小眾測試版。 選取 匯總的 [計數 ]
- 圖例: origin_name
交叉分析篩選器搭配:
- 欄位: _pred_class
交叉分析篩選器搭配:
- 欄位: _pred_late
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應