實務練習 07:保單續保流失風險

獨立實務練習(非 ISLP 章節)⏱️ 約 45–60 分鐘純合成資料
時間序列切分邏輯斯迴歸分類評估
下載 Jupyter Notebook(policy-renewal-churn.ipynb) 下載程式套件(policy-renewal-churn-package.zip)

Notebook 適合逐段閱讀與執行;ZIP 包含標準函式庫程式、測試、執行說明及範例輸出,不需安裝第三方套件。

練習目標與可觀察成果

你將使用 300 筆固定亂數種子產生的虛構資料,建立一個辨識「預測時點後 30 天內未續保」的二元分類示範。完成後,你應能:

重要界線:模型輸出只可作為人工客服安排關懷順序的教學示範,不得用來決定保費、核保、理賠或任何個人權益。這些合成結果不代表真實續保效益,也不能證明模型在真實資料上的表現。

欄位與時間範圍

附件以固定亂數種子 20261007 產生 10 個月份、每月 30 筆觀測,共 300 筆;時間標記是合成資料中的月份索引,不對應任何真實日期或保戶。目標標籤 churn 表示該筆觀測的預測時點之後 30 天內是否未續保。

依原始時間順序切分:月份索引 0–5 的前 180 筆為 train、6–7 的 60 筆為 validation、8–9 的最後 60 筆為 test,不洗牌。這個順序讓測試資料代表較晚的合成時間窗;附件刻意讓不同月份的保費調整分布改變,供觀察可能的資料漂移。

實作流程

  1. 檢查資料與標籤:確認 300 筆、欄位定義及標籤時間窗;先辨認任何可能在預測時點後才可取得的資料。
  2. 依時間切分:保留原始列順序,切成 train/valid/test = 180/60/60;不要隨機切分或把未來樣本混入訓練資料。
  3. 估計標準化參數:只用 train 計算三個特徵的平均數與標準差。valid/test 只能套用 train 得到的數值,不能各自重新計算 scaler。
  4. 訓練模型:只以標準化後的 train 訓練邏輯斯迴歸;同時建立 baseline,以訓練集正例率作為每筆測試資料的預測機率。
  5. 選擇閾值:用模型對 valid 產生的機率比較候選閾值,依 validation F1 選擇。閾值與其他設定到此為止;不可查看 test 結果後再調整。
  6. 一次性最終評估:將已選定的模型與閾值套用至 test 一次,計算混淆矩陣、precision、recall、F1 和 Brier score,並記錄限制。
防止資料洩漏:Scaler 僅 fit 在 train;valid/test 僅 transform。閾值僅由 validation 選定;test 不參與選擇或調參。contacts_90d 的觀察窗必須完全截止於預測時點之前。

如何解讀指標

附件固定亂數種子所產生的合成測試集示例(60 筆;不可視為真實績效)
方法閾值TPFPFNTNPrecisionRecallF1Brier
Baseline(訓練集正例率機率)0.500012480.0000.0000.0000.160
邏輯斯迴歸0.2512320160.2731.0000.4290.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,也不能單獨證明校準良好。

自我驗收

延伸思考

  1. 若誤報會大量占用客服容量,應如何在 validation 上比較其他閾值或成本導向指標?採用前還需要哪些實際成本資料與人工審核?
  2. 若月份較晚時 premium_change 分布改變,如何用多個時間窗的回測、監控與重新驗證來評估漂移,而不是只依賴一次 test?
  3. 若要檢查機率是否可信,你會補上哪些可靠度圖、分群評估與外部驗證?有哪些資料治理、授權、去識別與存取控制前提?