預測問題:Target、Features、Prediction Time
學習目標:定義預測單位、target、時間範圍、決策與預測當下可取得資訊。
你的主管說:「我們來預測下週每個服務據點的案件量吧。」這句話聽起來像一個明確的任務,但實際上還缺很多定義:一筆「預測」到底對應到哪一個單位(一個據點、一天,還是一個時段)?target 是案件數量本身,還是超過門檻的二元判斷?「下週」的起點是什麼時候?更重要的是,在做這個預測的當下,哪些資訊你真的已經知道,哪些其實是事後才會出現的?
如果跳過這一步,直接把資料丟進模型,最常見的後果是:團隊用了「案件關閉後才產生」的欄位當 feature,模型在歷史資料上表現很好,但上線後卻完全對不上,因為正式運作時那個欄位在預測當下根本還不存在。先把預測單位、target、prediction time 寫清楚,才能避免這種「事後才發現」的代價。
模糊的任務描述
「預測案件量」: 沒有說清楚預測單位、target 定義、時間範圍,也沒有檢查預測當下真的能取得哪些欄位。
明確定義的預測問題
- 預測單位
- 一列 = 一個服務據點在某個 split_time 當下,對未來一段時間的一筆預測案例(case_id)。
- Target
- target_numeric 是未來時段的案件量(回歸);target_binary 是是否超過容量門檻(分類)。
- Prediction time
- 每筆 case_id 都有一個 split_time:只有在這個時間點之前就存在的 features_* 才能用來預測。
import pandas as pd
# clean:一份服務需求預測資料集,一列代表一筆預測案例
df = pd.read_csv("DS201_Service_Demand_Clean.csv", parse_dates=["created_at", "split_time"])
df.shape
df.dtypes
df[["case_id", "split_time", "target_numeric", "target_binary"]].head()
# 先問:哪些 features_* 欄位是在 split_time 之前就已知的?
[c for c in df.columns if c.startswith("features_")]| 問題 | 這個資料集的答案 |
|---|---|
| 預測單位是什麼? | 一個 case_id:某個服務據點在某個 split_time 的一筆需求預測 |
| target 是什麼? | target_numeric(未來案件量)或 target_binary(是否超過容量門檻) |
| 決策是什麼? | 要不要提前調度人力/資源給這個據點 |
| 預測當下能取得什麼? | 只有 split_time 之前產生的 features_*,target 本身在預測當下永遠不可得 |
假設 features_queue_length_at_split 記錄的是 split_time 當下的排隊人數,而 features_total_handling_time 記錄的是案件結案後加總的處理時數。前者在預測當下已經存在,可以當作 feature;後者要等案件結束才算得出來,屬於未來資訊,即使它和 target 的相關性很高,也不能使用。
- 把「預測」直接等同於「分析」,沒有先定義一個明確的 prediction time
- 只看欄位名稱判斷能不能用,而不是實際查核它的產生時間
- 把 target 本身的歷史值直接當作 feature,卻沒有檢查它是否會在預測當下洩漏答案
- 不同人對「一筆預測」的定義不一致,導致後續評估無法互相比較
注意
資訊
同事提議用「案件處理完成後才統計出的平均處理時間」當作預測「本週案件量」的一個 feature。這樣做最大的問題是什麼?