題幹與適用情境
你有 200 個城市兩年的每日叫車需求。正式環境每週一重新訓練一次,並為每個城市預測接下來 7 天。特徵包含歷史需求、星期、節日、天氣預報與價格活動計畫。團隊準備隨機切分訓練集與驗證集,再用整體 MAPE 最低的模型上線。
請設計一套沒有未來資訊洩漏的離線驗證方案,說明切分、特徵可用性、基準、指標、跨城市彙總、模型選擇與上線門檻。兩年、200 個城市、7 天與每週重新訓練都是面試假設,不是業界基準。
這道題適用於資料科學、機器學習與預測職位。核心能力是重現「在某個預測起點,當時真正知道哪些資訊」,因此歸入 data。
面試官考察點
第一,候選人能否把正式環境的預測流程轉成驗證協定。強回答會先固定預測起點、步長、重新訓練頻率與訓練視窗,再討論模型;只說「依時間切分」仍不完整。
第二,能否找出切分以外的洩漏。未來資訊可能透過全量標準化、跨過預測起點的滾動視窗、事後修訂資料、實際天氣、尚未核准的活動或以全量日期擬合的目標編碼進入訓練。
第三,指標能否對應決策。一個整體平均可能掩蓋遠期預測失敗、低量城市退步、持續偏高或區間校準失準。強回答會保留各預測步長、城市分群與時間折的結果,並與簡單基準並列。
第四,能否分開調參與最終估計。滾動驗證用於選擇模型和門檻;從未參與選擇的最後一段連續時間只用來估計選定流程的表現。反覆查看留出集再修改模型,會把它變成另一個驗證集。
回答前需要釐清的問題
- 真實預測起點是什麼? 若每週一 06:00 產生預測,切分必須在該時點凍結資料;每日滾動預測會產生不同起點與訓練成本。
- 7 天是一次直接輸出,還是每天遞迴一步? 多步策略會改變特徵產生方式,也要求分別評估第 1 到第 7 天。
- 哪些外生變數在預測時已知? 日曆通常已知;天氣預報可得,但實際天氣未知;只有已核准並發布的價格活動才能使用。
- 標籤多久才完整? 若需求資料晚到兩天,訓練尾端與測試起點間至少要有等效 gap,或使用當時的資料快照。
- 高估與低估的成本是否相同? 運力規劃可能有缺車與閒置兩種方向性成本,MAE 無法單獨表達。
- 城市是否同等重要? 每城等權的宏平均反映覆蓋,依實際量加權反映整體影響,兩者不能互相取代。
- 上線後會使用多長歷史? 固定視窗能較快適應結構改變;穩定的年度季節性可能需要較長歷史。
30 秒回答框架
「我會從正式流程反推滾動起點回測。每個歷史週一只使用當時已到達且標籤完整的資料,依正式訓練視窗擬合,預測未來 7 天,再把起點向前移。所有前處理、落後特徵與調參都只在各訓練折內完成;未來實際天氣不能取代當時的預報。我會與季節性樸素基準比較,並依第 1 到第 7 天、城市與時間折報告 MAE、偏差與業務損失;百分比指標必須定義零值處理。模型選定後只在未參與調參的連續留出區間評估一次,關鍵城市、尖峰週與區間覆蓋均通過預設門檻才上線。」
分步深入解答
第一步:把一次正式環境執行定義成一個預測折。
設預測起點為 t。訓練資料只能包含在 t 時已可用且標籤完整的紀錄,測試區間為 t+1 到 t+7。每次把起點往前移 7 天,模擬每週重新訓練。早期訓練集若不足以涵蓋必要季節週期,就不納入評分。
擴張視窗使用最早日期到 t 的全部歷史,資料利用率高,但會保留舊機制。固定視窗只用最近一段歷史,能更快適應結構變化,卻可能捨棄年度季節性。回測策略必須與正式環境一致,不能看完最終留出集才挑選。
第二步:建立「預測時可用」的特徵合約。
每個特徵記錄事件時間、系統可用時間、修訂規則與缺值處理。對每個起點重建當時快照:
- 落後一天的需求只能來自
t或更早,7 日滾動平均的視窗終點也不能跨過t; - 標準化、缺值填補、編碼、特徵選擇與目標轉換只在該折訓練資料擬合;
- 使用
t當時發布的天氣預報,不使用後來觀測到的實際天氣; - 未來活動特徵只包含
t前已確認的計畫; - 標籤晚到兩天時,訓練最多到
t-2,或套用等效 gap。
可執行檢查包括:斷言每個訓練欄位都有 available_at <= t、移除起點後的原始資料再重新產生特徵,以及從保存快照重播數個歷史起點。移除不可用未來資料後,歷史預測若改變,就有洩漏或無法重現的相依性。
第三步:建立不容易作弊的基準。
至少比較「上週同一天」的季節性樸素預測;年度季節性夠穩定時,可加入去年同期基準。複雜模型只有在相同起點、相同可用特徵與相同評分列上穩定勝出,才值得增加成本。異常巨大的提升應先觸發時間對齊與洩漏檢查。
第四步:讓指標對應失敗成本。
用 MAE 表示典型絕對誤差,用 RMSE 揭露大型失誤,用有正負號誤差的平均值觀察持續高估或低估。MAPE 在實際值為零時無定義,接近零時也會因小分母失真,因此不能作為唯一指標。跨尺度比較可使用 MASE,分母採訓練折內的季節性樸素誤差;總量規劃可補充 WAPE,但要說明高量城市會主導結果。
若模型輸出分位數,使用 pinball loss 分別評估每個分位數,並檢查例如 P90 的經驗覆蓋率是否接近目標。覆蓋率要和區間寬度一起看;極寬區間即使覆蓋良好,也可能沒有決策價值。
第五步:彙總前先保留誤差結構。
每筆評分資料保留 origin、horizon、city、實際值與預測值,再報告:
- 第 1 到第 7 天分開評分,避免近端準確掩蓋遠端崩壞;
- 同時提供每城等權宏平均與依實際量加權的結果;
- 顯示各時間折分布,不只提供跨折平均;
- 分開檢查尖峰、節日、低量城市、新城市與異常天氣視窗;
- 檢查同一城市是否連續出現同方向偏差。
第六步:在滾動折內選擇,鎖定最終測試。
用開發期滾動折選模型、視窗與超參數。比較次數很多時記錄每次實驗,避免反覆嘗試後只在少數折偶然獲勝。選定完整流程後凍結程式與參數,再於最後連續 8 到 12 週評估一次。這個長度也是面試假設,應依季節性與樣本需求調整。
預先定義上線門檻:整體業務損失優於季節性基準、關鍵城市沒有超過容忍值的退步、第 7 天仍可接受、偏差在運力容忍範圍內、區間覆蓋與寬度合格。平均勝出但關鍵門檻失敗時,不全量上線;只對通過的城市灰度,或保留基準。
第七步:把離線協定延伸到正式監控。
記錄模型版本、資料快照、預測起點、各步長預測與特徵版本。標籤成熟後回填相同指標,並與回測分布比較。監控資料可用性、缺值率、有方向的偏差、各步長誤差與相對基準差值。機制改變後要重新評估訓練視窗,不能假設頻繁重訓會自動修正協定問題。
高品質示範回答
「我會在一系列歷史起點重現一次正式環境執行。假設工作每週一 06:00 重新訓練並一次輸出 7 天,每個折只讀取該時點已到達且標籤完整的資料,用正式視窗訓練,再評分後面 7 天。標籤若晚到兩天,訓練就在起點前兩天結束;天氣使用當時的預報版本,不能使用實際觀測。
所有轉換都放在折內。縮放器、填補器、編碼器與特徵選擇只以訓練列擬合;落後與滾動視窗的終點不得晚於預測起點。我還會刪除起點後的原始資料再產生特徵,確認歷史預測完全不變。
第一個比較對象是上週同一天的季節性樸素基準。結果保留城市、起點與預測步長,再報告 MAE、RMSE、有方向的偏差與業務成本;城市同時做等權與總量加權。MAPE 遇到零值會失效,所以不會單獨使用。若輸出分位數,再看 pinball loss、各步長覆蓋率與區間寬度。
滾動折用於選流程,最後連續時間段只評估一次。上線前先鎖定門檻:整體勝過基準、關鍵城市沒有不可接受的退步、第 7 天與尖峰週通過、偏差和區間校準符合運力決策。上線後記錄起點與資料版本,標籤到齊再用相同切片回填誤差。這樣離線提升才可與實際運行條件比較。」
常見錯誤
- 隨機打亂日期 → 訓練會看到測試日期之後的機制與特徵統計 → 用符合正式執行的滾動起點回測。
- 先在全量資料產生特徵與標準化 → 驗證資訊已進入訓練 → 每折獨立擬合轉換,並按可用時間重播特徵。
- 用實際天氣取代天氣預報 → 離線擁有正式環境當時不存在的資訊 → 保存並使用各起點當時的預報版本。
- 只報一個整體 MAPE → 零值、小城市與遠期誤差被錯誤處理或隱藏 → 組合絕對誤差、偏差、業務損失與分層結果。
- 沒有季節性樸素基準 → 無法判斷複雜度是否帶來增益 → 在完全相同的折與樣本評分基準。
- 看完最終測試再改模型 → 留出集已參與選擇 → 凍結後只評一次;失敗後等待新的未來留出區間。
- 平均指標勝出就全量上線 → 高量城市可能掩蓋關鍵分組退步 → 預設分組、尖峰與步長門檻,按城市灰度。
追問及應對
若有一個訓練時從未出現的新城市,如何評估?
一般滾動折會讓相同城市同時出現在訓練與測試,因此無法估計冷啟動。加入城市留出評估:訓練共享模型時完全移除一組城市,再只使用上線時真正可得的靜態屬性或短期歷史。零歷史與少量歷史要分開報告,並與區域及全域樸素基準比較。
活動效果持續 14 天,而預測步長只有 7 天,需要 gap 嗎?
gap 取決於資訊可用性與標籤重疊,不能機械地等於預測步長。若訓練標籤或彙總會使用起點後 14 天的結果,就要截斷或留足間隔;若活動計畫在起點前已確認,特徵只表達該計畫,持續 14 天本身不構成洩漏。應逐欄位畫出時間線。
新模型只改善高量城市時,該怎麼選?
並列總量加權收益與每城等權退步,再把業務要求轉成門檻。可以只對高量城市上線新模型,其餘保留基準或分層模型;也可最佳化帶城市權重與最差分組限制的目標。單一加權平均不能證明所有城市都受益。
線上誤差明顯差於回測時,先檢查什麼?
先驗證可重現性:相同模型、預測起點、特徵快照與外生變數版本能否重建當時預測。接著區分資料延遲或定義改變、訓練與服務轉換不一致、連基準也同步變差的機制改變,以及只影響模型的漂移。先找出協定落差,再決定重新訓練、縮短視窗、回復或重做驗證。