---
# System prepended metadata

title: 國道車流

---

# 國道車流資料整理

## 主題

國道五號的 南港-頭城
預測未來10~30分鐘是否會塞車 會塞多久 進一步去預估行車時間

## 待討論事項

1. 氣象資料是否需使用(氣象會影響數據結果，但現階段資料不好處理)
2. 查找文獻資料，討論使用哪些模型
3. 討論機器學習流程

## 已完成事項

1. M05A、幾何資料的資料前處理（處理後的完整資料已上傳雲端）

## 使用資料

[雲端硬碟](https://drive.google.com/drive/folders/19Ntd-GlvBV9qI-oz9BwCJCgrmPICsuos?usp=sharing)

https://tisvcloud.freeway.gov.tw/documents/TDCS%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8Av41b.pdf 

---

[點擊下載：原始幾何資料](https://freeway2025.tw/2025_Route_Geometry.zip)

❌[各類車種通行量統計各類車種 (M03A)](https://tisvcloud.freeway.gov.tw/history/TDCS/M03A/)

依車輛種類通過單一偵測站統計之交通量
––欄位:
––TimeInterval： 報表產製時間(每5分鐘統計)
––GantryID： 測站編號，例如01F0005N即為[基隆-基隆端]
––Direction： 車行方向，S南、N北
––VehicleType： 車種，31小客車、32小貨車、41大客車、42大貨車、5聯結車
––Traffic： 交通量：計算單一偵測站於此時階範圍內所經過之車流總量

----------------------------
    國道五號（南港-頭城）
    [偵測站代碼](https://www.freeway.gov.tw/UserFiles/TDCS%20operaion%20manual.pdf)：
    GantryID：
    05F0000S (南港系統-石碇)      0.0----1
    05F0001N (石碇-南港系統)      150.0----5
    05F0055N (坪林行控專用道-石碇) 5550.0----6
    05F0055S (石碇-坪林行控專用道) 5500.0----2
    05F0287N (頭城-坪林行控專用道) 28750.0----7
    05F0287S(坪林行控專用道-頭城)  28790.0----3
    05F0309N	宜蘭(四城、大福)-頭城 30000----8
    05F0309S	頭城-宜蘭(四城、大福) 30000----4

速限：
坪林(15K)以北 80
坪林(15K)以南 90


 
        門架緯度   門架經度     最近里程  最近里程緯度 最近里程經度    距離(km)
    0  25.035089  121.622931      0.0  25.035497  121.623476  0.071254
    1  25.034972  121.624861    150.0  25.035071  121.624872  0.010990
    2  24.996156  121.652097   5550.0  24.996037  121.652245  0.019928
    3  24.996467  121.652058   5500.0  24.996499  121.652162  0.011083
    4  24.842639  121.789286  28750.0  24.842743  121.789355  0.013447
    5  24.842569  121.788967  28790.0  24.842387  121.789298  0.039127
    6  24.823706  121.786214  30000.0  24.831312  121.790912  0.969572
[站間各車種中位數行駛車速 (M05A)](https://tisvcloud.freeway.gov.tw/history/TDCS/M05A/)

––TimeInterval： 報表產製時間(每5分鐘統計)
––GantryFrom： 上游測站編號，例如01F0017N即為[八堵-基隆]
––GantryTo： 下游測站編號，例如01F0005N即為[基隆-基隆端]
––VehicleType： 車種，31小客車、32小貨車、41大客車、42大貨車、5聯結車
––SpaceMeanSpeed： -單一車輛計算車速：相鄰上下游偵測站之門架距離/旅行時間(km/hr)
––中位數車速:該時階各車種所有車輛車速之中位數
––Traffic： 交通量：計算單一偵測站於此時階範圍內所經過之車流總量

❌[路段即時路況動態資訊(v2.0)(Section)](https://tisvcloud.freeway.gov.tw/history/motc20/Section/)

––UpdateTime：本平台資料更新時間(ISO8601格式:yyyy-MM-ddTHH:mm:sszzzz)
––UpdateInterval：本平台資料更新週期(秒)
––AuthorityCode：業管機關簡碼
––LinkVersion：路段編號版本
––SectionID：機關發布路段代碼
––TravelTime：路段平均旅行時間, 單位:秒
––TravelSpeed：路段平均旅行速度, 單位:KM/Hr, 另數值250表示為道路封閉
––CongestionLevelID：壅塞水準組別代碼
––CongestionLevel：壅塞級別 = ['-99:路段即時資料異常', '-1:道路封閉'] 

    壅塞級別 = ['0: 未知/資料不足', '1: 順暢', '2: 車多', '3: 車多', '4: 壅塞', '5: 壅塞'] 
    壅塞級別 = ['0: 未知/資料不足', '80km/hr以上: 順暢', '60~79km/hr: 車較多', '40~59km/hr: 車多', '20~39km/hr: 較壅塞', '0~19km/hr: 壅塞']  
––HasHistorical：是否包含歷史資料 = ['0: 不包含', '1: 包含']
––HasVD：是否包含VD資料(車輛偵測器) = ['0: 不包含', '1: 包含']
––HasAVI：是否包含AVI資料(自動車輛辨識) = ['0: 不包含', '1: 包含']
––HasETAG：是否包含ETag資料(eTag電子辨識) = ['0: 不包含', '1: 包含']
––HasGVP：是否包含GVP資料(GPS Vehicle Probe) = ['0: 不包含', '1: 包含']
––HasCVP：是否包含CVP資料(Cellular Vehicle Probe) = ['0: 不包含', '1: 包含']
––HasOthers：是否包含其他多元路況資料 = ['0: 不包含', '1: 包含']
––DataCollectTime：資料蒐集時間(ISO8601格式:yyyy-MM-ddTHH:mm:sszzzz)

❌氣象
<station>
    <StationID>466881</StationID>
    <StationName>新北</StationName>
    <StationNameEN>New Taipei</StationNameEN>
    <StationAltitude>24.1</StationAltitude>
    <StationLongitude>121.520000</StationLongitude>
    <StationLatitude>24.959300</StationLatitude>
    <CountyName>新北市</CountyName>
    <Location>新店區莒光路29號</Location>
    <StationStartDate>2023-01-01</StationStartDate>
    <StationEndDate/>
    <status>現存測站</status>
    <Notes>為臺北氣象站板橋站區(站碼466880)遷移之新站，於2023/01/03上午11時取代舊站開始提供觀測資料。</Notes>
    <OriginalStationID>466880</OriginalStationID>
    <NewStationID/>
</station>
找出Location包含"南港"、"石碇"、"坪林"、"頭城"的資料，並且status="現存測站"

❌一年觀測資料測站地點:"宜蘭"

## 研究流程
第一階段：找壅塞的時段與路段，並找出哪些特徵影響壅塞
第二階段：預測未來速度、流量

### 分類任務

#### 實驗步驟：
1.定義問題：二分類 or 多分類
2.資料前處理
>將M05A中包含目標門架的代碼選出(參考上方GantryID)，並把volume(車流量)=0的資料整筆刪除，
做特徵工程

時間窗口
> 時間序列中，一個時間點的狀態往往與之前幾分鐘/幾小時有關，因此可以對 Speed / Volume 做滑動窗口計算，然後篩選重要的時間窗口特徵。

滯後特徵
> 把「過去的數值」當成新的欄位給模型用，讓它知道歷史狀態

變化率特徵
>新增欄位:量化「變快還是變慢，以及變多少」

3.特徵選取策略

頻域特徵FTT

> 全部特徵
> 基於統計相關性（例如皮爾森/卡方）
> 基於模型重要度（RF / XGB feature_importances_）
> 遞迴特徵消除（RFE）
> 僅時間特徵 vs 僅交通特徵 vs 全部混合

4.模型組合
>機器學習：DT、RF、XGB
>深度學習：RNN、LSTM、GRU
>找最佳超參數：Optuna

5.模型訓練與交叉驗證

> 訓練時間
> 預測時間
> 模型大小
> 分類指標（Accuracy, F1, Precision, Recall）
> 混淆矩陣（看不同壅塞等級的辨識情況）

6.分析結果 產出報告 / 可視化

### 回歸任務

### 資料前處理
將M05A中包含目標門架的代碼選出(參考上方GantryID)，並把volume(車流量)=0的資料整筆刪除，
做特徵工程

#### 程式碼說明
1.merge_MA.py（把一天的24個檔案合并為一個）

2.download_data.py (下載路段即時路況動態資訊(v2.0))

3.MA_download.py（下載M03A、M05A）

4.pre_mainroad.py（主道資料處理）

5.pre_ramp.py（匝道資料處理）

---

#### M03A

原本下載的資料為一天一個多個檔案（以小時劃分）（2024/01/06~2025/06/15），我們將全部的檔案合并成一個csv，並根據GantryID篩選所需資料。

#### M05A

同 M03A

#### 路段即時路況

先下載，然後解壓縮，每分鐘會有一個xml檔案，透過SectionID:365~370篩選資料，匯入至一天一個的csv
最後再把每天合并成一個

#### 00道路幾何特性資料

手動刪除部分序列（非南港-頭城路段之資料）
使用雲端硬碟的程式碼（pre_mainroad.py, pre_ramp.py）刪除部分欄位（匝道.csv）

### 模型訓練

### h3

📅 處理日期：20250315
❌ 當日無符合條件 Section 資料：20250315
📅 處理日期：20250316
❌ 當日無符合條件 Section 資料：20250316
📅 處理日期：20250322


https://chatgpt.com/share/688a287a-5050-800b-8f70-8606e81772d0



https://data.zhupiter.com/oddt/7739175/03F0698N/

https://data.nat.gov.tw/dataset/21165

https://chatgpt.com/share/689243cd-f83c-8000-852e-14411b111c56
典: https://chatgpt.com/share/689df29d-dab4-800d-b3e5-812cf63fa8e1
AML：https://chatgpt.com/share/689b6974-ae5c-800b-9a94-8ee6168d506c
GRU：https://chatgpt.com/share/689e131f-5750-800b-8161-a42b96611b43
生成GRU code：https://chatgpt.com/share/689f517e-9f20-800b-b74f-f63acd44e4ff
XGB：https://chatgpt.com/share/68a1cfaf-f834-800b-8a61-bc3fd8813052
RF、DT：https://chatgpt.com/share/68a342c0-e770-800b-b107-d8c9a301e171

❌氣象資料:宜蘭

### [RF.py](https://drive.google.com/file/d/1w-9x0k4rQlQ4TkfMwcT73NJnBNkXkNZe/view?usp=drive_link)
### [GRU.py](https://drive.google.com/file/d/1USoUp_lf7q9CBP-3m-8dL-p1NMHMJcp1/view?usp=drive_link)

1.是否賽車(塞車1/順暢0)可以換分級(順暢1/車略多2/車多3/壅塞4/大壅塞5)

多步預測

### 分類任務

### 

import pandas as pd

# 讀取你的 optuna 結果
df = pd.read_csv("results.csv")

# 依 test_rmse 排序，選前 10 個
top_candidates = df.sort_values("test_rmse").head(10)

# 計算 cv 和 test 差距
top_candidates["gap"] = top_candidates["test_rmse"] - top_candidates["cv_rmse"]

# 按照 test_rmse + gap 排序
best = top_candidates.sort_values(["test_rmse", "gap"]).iloc[0]

print("最佳模型：")
print(best)


Word：https://1drv.ms/w/c/095c45f0b6059a6b/EcSDKeNPL0NEumLCY90mrlwB1D9EKwABpxBU7AUhI0XsVg