卷 V · 交代CH 21工位 21/24

Step 9:部署、监控、维护、增强

工位 STEP 9 行动 论文必写 评分员在找:具体的机制,不是「定期重新训练模型」这种空话。监控什么指标、多久算一次、超过多少怎么办——三句话。

Step 9 在四次迭代里不单独计分,只在研究论文里要求(Steps 1–9)。所以它常被写成三行客套话。但它是全课最不依赖数据和代码的一步——在第 2 周就能想清楚,而且想清楚之后会反过来改进你的 Step 1。这一章给你四个小节各一段可抄的模板,以及一个能在没有标签的情况下发现模型变坏的真指标。

部署PSI模型退化重训触发未来增强

9.1 应用与部署:先说清「部署」在你的场景里是什么

很多学生一想到部署就写 REST API、Docker、云服务。但你的模型如果是给年度预算会用的,它根本不需要服务——它需要的是一个每年跑一次的脚本和一张 Excel 名单。

决策频率合适的部署形态要写什么
年度/季度(本例)批量脚本 + 报表谁在什么时候运行、输入从哪来、输出给谁、以什么格式
每周/每日调度任务(cron/Airflow)+ 仪表板加上失败告警与数据延迟处理
实时API 服务 + 特征存储延迟要求、并发、降级策略

本例的模板(含前面几章的产出):

9.1 应用与部署

部署形态:年度批量评分。每年 10 月(预算会前一个月)由数据
分析岗执行评分脚本,输入为当年度更新后的地区指标表,输出为
一份 CSV:地区名、未达标概率、风险等级(按 8.4 的阈值 0.15
划分)、以及贡献最大的三个特征(用于解释)。

交付对象与形式:资源调配组,附一页说明书,含 8.2 的增益表与
9.1 的投放规则(前两个等分投放、第三等分起停止)。

阈值可调:脚本以配置文件暴露阈值参数,决策者可根据当年可投
名额调整(0.15 对应约 40% 名单,0.30 对应约 20%)。

不做的事:本方案不自动执行任何投放决策,仅提供排序与建议;
最终名单由人工复核后确定(理由见 9.2 与伦理讨论)。

最后那段「不做的事」很重要。它同时回答了伦理问题(人在环内)和责任问题,而且这门课第 12 周专门有一讲数据伦理——提前在 9.1 埋一句,论文里会很好接。

9.2 监控:没有标签也能发现它变坏

部署之后的核心难题是:真实结果要等很久才知道。今年 10 月给出的名单,要到明年才知道预测对不对。那这一年里怎么知道模型还能用?

答案是监控输入分布。最常用的指标是 PSI(Population Stability Index,总体稳定性指数):把参考期的分布分成十个箱,看当前期的数据落在各箱的比例变化了多少。下面这台真的算了 PSI:

PSI行业惯例判定动作
< 0.1稳定无需动作
0.1 – 0.25需关注记录并加密监控频率
> 0.25已漂移触发重训,并重跑 Step 7 的测试设计

示例数据里,把 2015–2017 当参考期、2022–2023 当当前期,疫苗覆盖率的 PSI 是 2.168——远超 0.25。看分箱明细:最高那一箱的占比从 0.105 涨到 0.51,均值从 68.3 升到 77.5。

这是好事(现实在改善),但对模型是坏消息:它在 2015–2017 的分布上学到的那条阈值,放到 2022 年的数据上已经切错位置了。「输入分布变化」和「模型变差」是两件事,但前者是后者最早的信号,而且不需要等标签。

Demo 里还有两个对照:把当前期换成参考期自己(PSI 应该接近 0,这是你实现监控代码后该跑的第一个自检),以及人为把当前期整体乘 0.85 模拟口径变化(PSI 0.19,落在「需关注」)。后者说明 PSI 对系统性偏移很敏感——这正是你要的。

模型退化的样子,可能和你想的不一样

下面这台做了一个真实的时间实验:在 2015–2019 年的数据上训练,然后拿 2020 之后的数据当「未来」来评估:

时间窗实际未达标率准确率精确率召回率
2015–19(训练期自身)45.6%0.8960.9130.854
2020–2139.8%0.9260.9270.884
2022–2336.3%0.8730.7860.892

准确率几乎没掉(0.896 → 0.873),但精确率掉了 12.7 个百分点。

看第二列就明白了:实际未达标率从 45.6% 降到 36.3%——现实在改善,可预测的「阳性」变少了,而模型还按老阈值报警,于是误报占比上升。

两个教训,直接写进 9.2 和 9.3:

  • 只监控准确率会让你完全看不见这次退化。所以要监控一组指标,外加输入分布(PSI)和目标基础率。
  • 模型退化不总是「变笨」,也可能是世界变好了而模型没跟上。这句话比「定期重新训练模型」强十倍,因为它说明了为什么要重训。
◆ 9.2 只要三句话
9.2 监控

监控什么(月度/季度计算并记录):
· 输入侧:每个特征的 PSI(参考期=训练集分布)、缺失率、
  取值域越界计数;
· 输出侧:模型评分的分布(均值与十分位),以及被判为高风险
  的地区比例;
· 结果侧(有标签后):准确率、精确率、召回率、F1、AUC,
  以及增益表第一等分的提升度。

多久算一次:输入侧与输出侧月度自动计算;结果侧在每年度实际
数据回流后计算一次。

超过多少怎么办:
· 任一特征 PSI > 0.25,或高风险比例相对基期变化超过 ±30%
  → 触发人工复查;
· 结果侧精确率或召回率相对基线下降超过 0.10,或增益表第一
  等分提升度低于 1.5 → 触发重训(见 9.3)。

那三个阈值(0.25 / ±30% / 0.10)是可以讨论的,但必须有一个具体数字。「持续监控模型表现」不是监控方案,「PSI > 0.25 触发重训」才是。

9.3 维护:重训不是重跑一遍

这一节最容易写的空话是「每年用新数据重新训练模型」。要写得有分量,得说清重训之后要重做哪些步骤

重训时必须重做为什么
Step 3 的填补统计量中位数会变。旧中位数用在新数据上就是一种漂移
Step 7.1 的划分与验证新数据的正例比例可能变了(本例从 45.6% 降到 36.3%),指标不能和旧的直接比
Step 8.4 的阈值这是最容易漏的一条。基础率变了,同一个阈值对应的名单长度和精确率都会变
Step 2.4 的质量检查新一批数据可能有新的脏法(新的哨兵值、新的类别写法)
Step 1 与 Step 5一般不需要——除非业务决策本身变了

另外要写版本与回滚:模型文件、训练数据快照、参数配置三样一起存档并编号;新模型上线前与旧模型在同一份最新数据上对比;如果新模型没有明显更好,就不换(避免为了重训而重训)。

9.4 未来增强:把你做不到的事写成路线图

这一节是免费的分,因为它允许你把整个学期遇到的所有限制变成「下一步」。每条写成「现在的限制 → 需要什么 → 能带来什么」:

限制(来自前面各章)需要什么能带来什么
无法回答因果问题(第 20 章的符号翻转)随机对照的干预投放数据升级为增量响应(uplift)模型,区分「会未达标」与「会因干预而改善」(第 14 章)
粒度太粗(地区-年)设施-月级别的数据样本量增加约两个数量级,此时才真正需要 Spark(第 3 章那段可扩展性论证的兑现)
literacy 非随机缺失(第 9 章)补齐调查或换用普查数据消除低识字率地区被系统性低估的偏差
模型几乎是单变量规则(第 15 章:一列占 92.9% 重要度)更多维度的特征(交通可达性、医疗设施数、气候)降低对单一数据源口径变化的脆弱性
只用了结构化数据基层报告文本、投诉记录文本分析可提供预警信号(第 14 章)

这张表有一个隐藏好处:它把你在报告各处写下的「局限性」全部回收成了正面内容。评分员读到这里会看到一条完整的思路,而不是一堆免责声明。

⇄ Step 9 在三条产线上的差别

Step 9 基本是文字工作,三条线共用同一段内容。但每条线可以补一句自己的部署细节,这能让四份报告看起来不是复制粘贴:

  • ISAS「SPSS Modeler 的流可导出为可调度的作业(.str + Batch 模式),也可通过 Modeler Server 部署;模型块(nugget)可直接嵌入新的评分流。」
  • OSAS「Python 方案以 joblib 持久化整个 Pipeline(含填补与缩放参数),确保评分时的预处理与训练完全一致;Tableau 仪表板连接评分输出的 CSV 供决策者查看。」
  • BDAS「PySpark 方案将 Pipeline 保存至 S3(model.write().save(path)),由 EMR/EC2 上的批处理作业按月执行;GitHub 仓库保存代码与配置,实现版本可追溯。」

那句「Pipeline 持久化含预处理参数」在三条线上都值一提,因为它正是第 13 章预处理泄漏的镜像问题:训练时怎么变换,评分时就必须一模一样地变换。

▣ 本章交付物 —— 报告里放什么(论文必需)

1. 9.1:部署形态(批量/调度/实时,按决策频率选)、执行者与时点、输入输出格式、交付对象、阈值可调、以及「不自动执行决策」那一句。

2. 9.2:三句话模板——监控什么(输入/输出/结果三层)、多久一次、超过多少怎么办(带具体数字)。

3. 9.3:重训时要重做的步骤清单(尤其是重新校准阈值)+ 版本与回滚规则。

4. 9.4:五行「限制 → 需要 → 收益」路线图,回收全报告的局限性。

5. 一张退化实验表(可选,很值):按时间切分训练/评估,展示指标随时间的变化。这是把 Step 9 从「设想」变成「有证据」的唯一办法,而它只需要你把已有数据按年份重切一次。

这一章的一句话

监控不能只看准确率:本例里准确率从 0.896 只掉到 0.873,而精确率掉了 12.7 个百分点,原因是现实在改善、基础率从 45.6% 降到 36.3% 而阈值没跟上;PSI 能在标签回流之前就发现输入分布变了(疫苗覆盖率 PSI 2.168),所以 9.2 要写成「监控什么 + 多久一次 + 超过多少怎么办」三句带数字的话。

卷 V 结束,九步走完了。最后一卷回到工具层面:同一条流在 ISAS 和 OSAS 上怎么各搭一遍,BDAS 那次的 EC2 与 PySpark 怎么不翻车,以及最后那 17% 的论文怎么写。