練習目標與可觀察成果
你將使用 300 筆固定亂數種子產生的虛構資料,建立一個辨識「預測時點後 30 天內未續保」的二元分類示範。完成後,你應能:
- 按時間先後切分訓練、驗證與測試資料,並說明為何不能隨機打散。
- 只從訓練集估計特徵平均數與標準差,再將同一組參數套用至驗證集和測試集。
- 以訓練集擬合邏輯斯迴歸,並只依驗證集 F1 選分類閾值。
- 在測試集只做一次最終評估,解讀混淆矩陣、precision、recall、F1 與 Brier score 的意義和限制。
重要界線:模型輸出只可作為人工客服安排關懷順序的教學示範,不得用來決定保費、核保、理賠或任何個人權益。這些合成結果不代表真實續保效益,也不能證明模型在真實資料上的表現。
欄位與時間範圍
附件以固定亂數種子 20261007 產生 10 個月份、每月 30 筆觀測,共 300 筆;時間標記是合成資料中的月份索引,不對應任何真實日期或保戶。目標標籤 churn 表示該筆觀測的預測時點之後 30 天內是否未續保。
premium_change:合成的保費調整幅度特徵;數值單位沿用附件的合成設定。contacts_90d:截至預測時點之前 90 天內的客服聯絡次數。不可使用預測時點之後才發生的聯絡,否則會洩漏未來資訊。tenure_years:截至預測時點的保單年資(年)。churn:預測時點後 30 天內未續保的二元標籤;只作為訓練與離線評估的答案。
依原始時間順序切分:月份索引 0–5 的前 180 筆為 train、6–7 的 60 筆為 validation、8–9 的最後 60 筆為 test,不洗牌。這個順序讓測試資料代表較晚的合成時間窗;附件刻意讓不同月份的保費調整分布改變,供觀察可能的資料漂移。
實作流程
- 檢查資料與標籤:確認 300 筆、欄位定義及標籤時間窗;先辨認任何可能在預測時點後才可取得的資料。
- 依時間切分:保留原始列順序,切成 train/valid/test = 180/60/60;不要隨機切分或把未來樣本混入訓練資料。
- 估計標準化參數:只用 train 計算三個特徵的平均數與標準差。valid/test 只能套用 train 得到的數值,不能各自重新計算 scaler。
- 訓練模型:只以標準化後的 train 訓練邏輯斯迴歸;同時建立 baseline,以訓練集正例率作為每筆測試資料的預測機率。
- 選擇閾值:用模型對 valid 產生的機率比較候選閾值,依 validation F1 選擇。閾值與其他設定到此為止;不可查看 test 結果後再調整。
- 一次性最終評估:將已選定的模型與閾值套用至 test 一次,計算混淆矩陣、precision、recall、F1 和 Brier score,並記錄限制。
防止資料洩漏:Scaler 僅 fit 在 train;valid/test 僅 transform。閾值僅由 validation 選定;test 不參與選擇或調參。
contacts_90d 的觀察窗必須完全截止於預測時點之前。如何解讀指標
- 閾值:將預測機率轉成「是否列入關懷排序」的操作界線;降低閾值通常會找出更多正例,也可能增加誤報。0.25 是本合成附件在 validation 上依 F1 選出的示例,不是通用或營運建議。
- Precision:被模型列為正例的觀測中,實際正例所占比例;低 precision 代表需要留意誤報帶來的客服工作量。
- Recall:所有實際正例中被模型找出的比例;低 recall 代表較多正例未被排序出來。
- F1:precision 與 recall 的調和平均,會隨閾值改變;它不包含誤報、漏報的實際成本,也不應脫離應用情境單獨決定流程。
- Brier score:預測機率與二元標籤的平均平方誤差,數值越低代表此測試樣本上的平方誤差較小;單一 Brier 數值不能證明機率已校準,仍需可靠度圖、分群檢查與外部驗證。
| 方法 | 閾值 | TP | FP | FN | TN | Precision | Recall | F1 | Brier |
|---|---|---|---|---|---|---|---|---|---|
| Baseline(訓練集正例率機率) | 0.50 | 0 | 0 | 12 | 48 | 0.000 | 0.000 | 0.000 | 0.160 |
| 邏輯斯迴歸 | 0.25 | 12 | 32 | 0 | 16 | 0.273 | 1.000 | 0.429 | 0.157 |
此固定示例的正例數為 train/valid/test = 32/18/12,test 平均 premium_change 為 0.165;validation 最佳 F1 為 0.522,據此選出的閾值為 0.25。模型在 test 捕捉到全部 12 個正例,但同時有 32 個 FP;不可只憑 recall=1.000 就說模型適合實務使用。測試集來自較晚的合成時間窗,分布變化也可能影響表現。
限制:以上數字來自固定亂數種子的合成資料與單次時間切分,不代表真實世界泛化能力或續保成效。Brier score 0.157 略低於此例 baseline 的 0.160,也不能單獨證明校準良好。
自我驗收
- 我保留時間順序,並使用 180/60/60 的 train/valid/test 切分。
- 我只用 train fit scaler,沒有用 valid/test 統計量重算平均或標準差。
- 我的
contacts_90d只涵蓋預測時點之前的 90 天。 - 我只在 validation 依 F1 選閾值,test 沒有用來調參,且只做一次最終評估。
- 我能分辨 FP、FN、precision、recall、F1 和 Brier,並說明單次合成結果的限制。
- 我能清楚說明模型僅供人工客服排序示範,不會決定保費、核保或理賠。
延伸思考
- 若誤報會大量占用客服容量,應如何在 validation 上比較其他閾值或成本導向指標?採用前還需要哪些實際成本資料與人工審核?
- 若月份較晚時
premium_change分布改變,如何用多個時間窗的回測、監控與重新驗證來評估漂移,而不是只依賴一次 test? - 若要檢查機率是否可信,你會補上哪些可靠度圖、分群評估與外部驗證?有哪些資料治理、授權、去識別與存取控制前提?