Step 9:部署、监控、维护、增强
Step 9 在四次迭代里不单独计分,只在研究论文里要求(Steps 1–9)。所以它常被写成三行客套话。但它是全课最不依赖数据和代码的一步——在第 2 周就能想清楚,而且想清楚之后会反过来改进你的 Step 1。这一章给你四个小节各一段可抄的模板,以及一个能在没有标签的情况下发现模型变坏的真指标。
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.896 | 0.913 | 0.854 |
| 2020–21 | 39.8% | 0.926 | 0.927 | 0.884 |
| 2022–23 | 36.3% | 0.873 | 0.786 | 0.892 |
准确率几乎没掉(0.896 → 0.873),但精确率掉了 12.7 个百分点。
看第二列就明白了:实际未达标率从 45.6% 降到 36.3%——现实在改善,可预测的「阳性」变少了,而模型还按老阈值报警,于是误报占比上升。
两个教训,直接写进 9.2 和 9.3:
- 只监控准确率会让你完全看不见这次退化。所以要监控一组指标,外加输入分布(PSI)和目标基础率。
- 模型退化不总是「变笨」,也可能是世界变好了而模型没跟上。这句话比「定期重新训练模型」强十倍,因为它说明了为什么要重训。
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 基本是文字工作,三条线共用同一段内容。但每条线可以补一句自己的部署细节,这能让四份报告看起来不是复制粘贴:
- 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% 的论文怎么写。