跳到主要內容

DS 201 · 模組 2

評估、解釋與部署判斷

把 Module 1 的預測循環延伸到分類與 threshold、overfitting 與 cross-validation、feature importance 與 fairness,最後走到 error analysis、drift 與部署判斷。

開始第一節
已完成 0 / 5
同步我的進度加入梯次後,進度可跨裝置保存,講師也能看到

資訊

加入後,你已完成的模組編號會連同「學員代碼」傳送給講師,講師可以看到你的進度。請使用講師提供的代碼,不要輸入姓名、公司機密或其他個資。進度資料與該梯次的其他資料一起保存。

學習目標

  • 理解機率分數、threshold、confusion matrix、precision、recall、specificity
  • 在 training data 使用 CV,test 保持未接觸,限制過度調參
  • 將 importance 視為預測貢獻而非因果,檢查子群錯誤
  • 檢查錯誤分布、成本、drift、監測與人工 fallback
  • 交付 baseline、模型、評估、錯誤分析、限制與部署判斷依據

Classification 與 Threshold

40 分鐘

Classification 與 Threshold

學習目標:理解機率分數、threshold、confusion matrix、precision、recall、specificity。

分類模型輸出的不是「是」或「否」,而是一個 0 到 1 之間的機率分數。要把它變成一個可以行動的決策,還需要選一個 threshold:分數高於這個門檻就判定為「將超過容量門檻」。改變 threshold 不會改變模型本身,卻會大幅改變 precision 與 recall 之間的取捨。

Confusion matrix 的四個格子
預測 \ 實際實際為超過門檻實際為未超過門檻
預測為超過門檻True Positive(抓到)False Positive(誤報)
預測為未超過門檻False Negative(漏抓)True Negative(正確排除)
在不同 threshold 下計算 precision 與 recall
from sklearn.metrics import precision_score, recall_score

proba = model_clf.predict_proba(valid[feature_cols])[:, 1]
for threshold in [0.3, 0.5, 0.7]:
    pred = (proba >= threshold).astype(int)
    precision = precision_score(valid["target_binary"], pred)
    recall = recall_score(valid["target_binary"], pred)
    print(threshold, round(precision, 3), round(recall, 3))

選擇 threshold 之前,先把兩種錯誤的實際成本寫下來:漏抓一個真的會超過容量的據點,可能代表服務品質下降或緊急調度成本;誤報一個其實還好的據點,則是浪費了提前調度的資源。把這兩個成本量化後,threshold 的選擇就從「感覺」變成可以被檢視的決策。

Precision(精確率)

  • 問的是:被模型判為超過門檻的案例中,有多少真的超過門檻
  • threshold 拉高,precision 通常上升
  • 重視「不要誤報」的情境優先看這個指標

Recall(召回率)

  • 問的是:所有真的超過門檻的案例中,有多少被模型抓到
  • threshold 拉低,recall 通常上升
  • 重視「不能漏抓」的情境優先看這個指標
案例:成本不對等時怎麼選 threshold(模擬)

假設漏抓一次的代價是臨時調度的加班成本,估計約為誤報一次成本的三倍。這種情況下,團隊通常會選擇較低的 threshold,犧牲一些 precision 來換取更高的 recall,因為漏抓的代價明顯更高。這個選擇必須寫進部署文件,並說明背後的成本假設。

  • 選 threshold 時只看哪個數字「看起來順」,沒有對照實際的業務成本
  • 用同一個 threshold 套用到所有據點,卻沒有檢查不同據點的成本結構是否一樣
  • 只報告 accuracy,沒有同時報告在選定 threshold 下的 precision 與 recall
  • threshold 選定後沒有重新檢查在各 group_attribute 子群上是否公平

注意

threshold 沒有「標準答案」,必須根據業務成本決定:漏抓一個真的會超過容量的據點(False Negative)與誤報一個其實還好的據點(False Positive),兩者的代價往往不對等。
自我檢測

把分類 threshold 從 0.5 調低到 0.3,最可能觀察到什麼變化?

把分類 threshold 從 0.5 調低到 0.3,最可能觀察到什麼變化?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Overfitting、CV 與 Tuning

40 分鐘

Overfitting、Cross-Validation 與 Tuning

學習目標:在 training data 使用 CV,test 保持未接觸,限制過度調參。

同事把模型複雜度不斷調高,訓練集上的表現越來越好,但驗證集上的表現卻開始變差。這是 overfitting 的典型跡象:模型記住了訓練資料的雜訊,而不是學到能推廣到新資料的模式。Cross-validation(CV)能讓你在只使用訓練資料的情況下,更穩健地評估不同參數設定的表現。

在 training data 上用 CV 挑選超參數,test 保持未接觸
from sklearn.model_selection import TimeSeriesSplit, cross_val_score

tscv = TimeSeriesSplit(n_splits=5)
for depth in [2, 4, 8]:
    scores = cross_val_score(make_model(max_depth=depth), train[feature_cols], train["target_numeric"], cv=tscv, scoring="neg_mean_absolute_error")
    print(depth, round(-scores.mean(), 2))
# test set 在整個調參過程中完全沒有被用到

除了調整模型複雜度,常見的因應 overfitting 的方式還包括:增加正則化(regularization)、減少 feature 數量、或是增加訓練資料。Cross-validation 的價值在於它用多組切分方式估計出一個更穩健的表現範圍,而不是只依賴單一一次切分可能出現的運氣成分。

Underfitting、Good Fit、Overfitting 的訊號
情況訓練集表現驗證集表現
Underfitting差差(兩者接近)
Good fit好好(兩者接近)
Overfitting非常好明顯變差(兩者差距擴大)
案例:CV 分數的變異也是資訊(模擬)

某次 5-fold cross-validation 的 MAE 分別是 8.1、8.4、8.0、15.2、8.3。單看平均值可能只會注意到整體偏高一點,但其中一折的分數明顯偏離其他四折,代表某一段時間的資料可能存在異常(例如特殊事件造成的需求暴增),值得進一步檢查,而不是只報告一個平均數。

  • 只看平均 CV 分數,沒有檢查每一折之間的變異是否過大
  • 用非時間感知的 KFold 切分有時間順序的資料,造成切分內仍有 leakage
  • 調參次數沒有限制,持續嘗試到驗證分數「剛好」變好為止
  • test set 在整個調參過程中被意外用到(例如寫程式時筆誤引用了 test 變數)

注意

調參的次數本身也是一種風險:嘗試的參數組合越多,越有機會「剛好」在驗證集上挑到一組表現特別好、但其實只是雜訊的參數。限制調參的搜尋範圍、並保留 test set 完全不碰,才能得到誠實的最終評估。
自我檢測

模型在訓練集上的 MAE 是 2.1,在驗證集上的 MAE 是 15.8,差距非常大。這最可能代表什麼?

模型在訓練集上的 MAE 是 2.1,在驗證集上的 MAE 是 15.8,差距非常大。這最可能代表什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Feature Importance 與 Fairness

35 分鐘

Feature Importance、Interpretation 與 Fairness

學習目標:將 importance 視為預測貢獻而非因果,檢查子群錯誤。

模型的 feature importance 顯示 features_staffing_level 是最重要的預測因子,同事立刻下結論:「所以增加人力配置就能降低案件量。」Feature importance 只描述一個變數對模型預測結果的貢獻程度,並不能證明改變這個變數就會改變真實世界的結果: 這和 Module 2 的相關與因果限制是同一個陷阱。

檢查整體 importance,並依 group_attribute 檢查子群誤差
importances = pd.Series(model.feature_importances_, index=feature_cols).sort_values(ascending=False)
print(importances.head())

# 依 group_attribute 檢查各子群的 MAE 是否一致
valid_pred = model.predict(valid[feature_cols])
valid.assign(abs_error=(valid["target_numeric"] - valid_pred).abs()).groupby("group_attribute")["abs_error"].mean()

Feature importance 的計算方式本身也會影響結論:以樹模型內建的 importance、permutation importance 或 SHAP 值計算出來的排序,有時會不一致。報告 importance 時,最好說明用的是哪一種計算方式,並且把它當作「模型目前依賴這個變數的程度」,而不是「這個變數在真實世界有多重要」。

Feature importance 能回答與不能回答的問題
能回答不能回答
這個 feature 對模型預測結果的貢獻有多大改變這個 feature 是否會因果地改變真實結果
哪些 feature 是模型目前最依賴的模型是否對所有子群都一樣公平
移除這個 feature 後模型表現會不會下降這個 feature 背後的業務原因是什麼
案例:高 importance 不等於可以用來做決策(模擬)

features_staffing_level 的 importance 很高,但進一步檢查發現,人力配置本身是依照「過去的案件量」事後排定的,也就是說它和 target 高度相關,部分原因是人力配置本身就反映了歷史案件量,而不是人力配置「造成」了案件量下降。要驗證因果關係,需要額外的實驗設計,不是單靠 feature importance 就能回答。

  • 把高 importance 的 feature 直接當作因果結論的證據,對外宣稱「改變它就能改變結果」
  • 只看整體 importance 排序,沒有檢查這個排序在不同子群上是否一致
  • 只用一種 importance 計算方式,沒有交叉確認結果是否穩定
  • 檢查子群誤差時,樣本量太小就直接下結論,沒有註明不確定性

注意

只看整體誤差指標,可能掩蓋了模型對某個子群系統性地表現較差。依 group_attribute 等子群屬性檢查誤差分布,是負責任模型評估的必要步驟,而不是可有可無的加分項。
自我檢測

模型整體的 MAE 表現良好,但依 group_attribute 拆解後發現某個子群的 MAE 是其他子群的三倍。最適當的下一步是什麼?

模型整體的 MAE 表現良好,但依 group_attribute 拆解後發現某個子群的 MAE 是其他子群的三倍。最適當的下一步是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Error Analysis、Drift 與部署判斷

40 分鐘

Error Analysis、Drift 與 Deployment Decision

學習目標:檢查錯誤分布、成本、drift、監測與人工 fallback。

模型上線三個月後,表現逐漸變差,但沒有人注意到,因為當初只看了一次離線分數就直接部署,之後再也沒有監測。這是「test 表現好就直接自動部署」最常見的後果:真實世界的資料分布會隨時間改變(drift),一個當初表現良好的模型,並不保證能一直維持這個表現。

監測計畫至少要回答三個問題:用什麼指標偵測表現衰退(例如持續追蹤的 MAE 或誤報率)、多久檢查一次(每日、每週),以及誰負責在指標異常時介入。沒有寫清楚這三件事的「監測」,往往只是形式上存在,實際上沒有人會真的去看。

部署前必須額外檢查的四件事
檢查項目問題
錯誤分布與成本誤差是平均分布,還是集中在特定情境(例如特定 group_attribute 或特定案件量區間)?漏抓與誤報的成本分別是什麼?
Drift 風險未來的資料分布是否可能和訓練資料不同(例如季節性、政策改變)?
監測機制上線後要用什麼指標、多久檢查一次,才能發現表現衰退?
人工 fallback當模型信心不足或監測發現異常時,是否有明確的人工覆核或退回流程?
檢查誤差是否集中在特定案件量區間
valid_pred = model.predict(valid[feature_cols])
errors = (valid["target_numeric"] - valid_pred).abs()
high_demand = valid["target_numeric"] > valid["target_numeric"].quantile(0.9)
print("高需求案例的平均誤差:", round(errors[high_demand].mean(), 2))
print("其餘案例的平均誤差:", round(errors[~high_demand].mean(), 2))
# 如果高需求案例的誤差明顯更大,代表模型在最需要準確的情境反而最不可靠
案例:drift 悄悄發生的徵兆(模擬)

某個服務據點附近新開了一個類似的服務點,原本的案件量模式開始改變,但模型仍沿用舊資料訓練出的參數。三週後監測指標顯示誤差持續上升,而不是單次異常,這正是需要重新訓練或至少重新檢視模型是否還適用的訊號。如果沒有監測機制,這個變化可能要等到使用者抱怨才會被發現。

  • 部署前只檢查了一次整體誤差,沒有檢查誤差是否集中在特定情境
  • 沒有寫下漏抓與誤報各自的業務成本,導致 threshold 或決策依據不透明
  • 監測指標沒有設定明確的異常門檻,導致「看起來怪怪的」卻沒有人採取行動
  • 沒有人工 fallback 機制,模型異常時只能等下一次排程重新訓練

注意

test 表現好不等於可以自動部署。部署判斷還需要成本評估、drift 風險、監測計畫與人工覆核機制;沒有這些配套,一個離線分數再好的模型,上線後也可能悄悄失效而無人察覺。
自我檢測

一個模型的 test 表現達到預期門檻,團隊準備直接自動部署、不再額外設置監測。這個決定最大的風險是什麼?

一個模型的 test 表現達到預期門檻,團隊準備直接自動部署、不再額外設置監測。這個決定最大的風險是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Independent Lab

55 分鐘

Independent Lab:Predictive Analytics Use Case

學習目標:獨立交付 baseline、模型、評估、錯誤分析、限制與部署判斷依據。

資訊

實作任務:使用實作資料,獨立選定一個服務需求預測問題,完整走過本課程的循環:Frame → Baseline → Split → Train → Evaluate → Error Analysis → Deployment Decision,並交付一份有界限的 Predictive Analytics Use Case + Model Card。沒有公布答案,你的推理過程與驗證才是被檢視的重點。
  1. 定義預測問題
    寫下預測單位、target(回歸或分類)、決策與 prediction time 可用的 features。
  2. 建立 baseline
    為你選定的 target 建立至少一個 naive/majority/mean baseline。
  3. 正確切分並訓練
    依時間切分 train/validation/test,訓練模型並在 validation 上調參。
  4. 評估並比較
    用 MAE/RMSE 或 precision/recall 比較模型與 baseline,並檢查 threshold 或模型複雜度的取捨。
  5. 錯誤分析
    依 group_attribute 或案件量區間檢查誤差是否集中,並找出至少一個需要進一步調查的模式。
  6. 做出部署判斷
    根據表現、成本、drift 風險與監測可行性,寫下一個有理由的 go/no-go 判斷,不宣稱普遍成立。
  • 一個清楚陳述的預測問題與決策
  • 至少一個 baseline 及其表現
  • 正確的時間切分方式與 leakage 檢查紀錄
  • 模型表現與 baseline 的比較,包含至少兩個評估指標
  • 至少一項子群或情境層級的錯誤分析
  • 至少一項限制與一個部署判斷(含成本、drift、監測與人工 fallback 的考量)
  • AI 協助情形的紀錄(若有使用)與你自己驗證了什麼
  • 部署判斷必須寫清楚假設的成本與監測方式,而不是只給一個「go」或「no-go」的結論
  • 子群錯誤分析的樣本量過小時,要註明這一點而不是直接下定論
  • Model Card 中的限制欄位必須具體,像是「在資料量少於 N 筆的子群上誤差較不穩定」,而不是空泛的「可能有限制」

注意

在調整模型時如果反覆查看 test set 分數來決定下一步,就等於把 test set 變成了另一個驗證集,最終回報的分數會失去意義。所有調整都應該在 train/validation 上完成,test 只在最後查看一次。

完成

如果 AI 協助撰寫模型程式碼或草擬 Model Card 文字,請自己逐項核對:切分是否依時間正確、baseline 是否確實計算、指標選擇是否符合這個決策情境,以及部署判斷是否誠實反映了限制而非過度承諾。AI 可以加快草擬速度;驗證與最終判斷仍是人的責任。

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

接下來做什麼?