视角三:如何优先核查、持续更新、并判定根除?——分类模型的部署与决策闭环
摘要
前两视角分别建立了"扩散预测"与"误判 likelihood"模型。本视角将模型落地为可运行的决策系统,回答题目后三问:Q3 如何利用分类结果优先核查最可能阳性的报告;Q4 如何随新报告持续更新模型及更新频率;Q5 什么证据足以宣告虫害已在华盛顿州根除。我们提出以 降序的成本敏感优先核查框架(约 筛查即可覆盖全部阳性),以 Beta-Binomial 在线更新吸收新数据(推荐周级频率,因提交滞后中位 24 天),并以零计数规则(rule of 3)+ 双飞行季监测窗定义根除证据:需连续 周零阳性且累计阴性报告约 份。三者构成"打分→优先→更新→根除"的闭环。
一、问题重述
- Q3:Use your model to discuss how your classification analyses leads to prioritizing investigation of the reports most likely to be positive sightings.
- Q4:Address how you could update your model given additional new reports over time, and how often the updates should occur.
- Q5:Using your model, what would constitute evidence that the pest has been eradicated in Washington State?
题目总体要求"定义所有指标与成本函数、参数须含区间估计、结果须含拟合优度、显式说明所有假设并检查稳健性"。本视角把前述模型封装为可 operational 的流程。
二、Q3:成本敏感的优先核查
分类模型输出每条未核实报告的 。朴素做法是"设阈值 0.5 全查",但在 基率下几乎全为负,浪费资源。正确做法是按分数降序排序,在预算约束内核查前 条。
图1 显示:按分数降序,累积阳性捕获率远高于随机基线——仅筛查少量高分报告即可捕获多数真阳性。由视角二可知,覆盖全部阳性约需筛查 报告,这给出了预算下限。
边际收益(图2)随筛查占比递减,存在明显拐点:越过拐点后每多查 10% 报告仅多捕获极少阳性。据此定义成本函数 ,目标是在"捕获率≥目标"下最小化 。
地理优先级(图3)将高分报告叠加到地图上,红色(近阳性簇、高分)区域应优先派驻核查队——把"统计优先"转化为"空间调度"。
三、Q4:顺序更新机制
新报告持续涌入,模型必须更新。我们采用 Beta-Binomial 在线更新:对任一地理网格单元,先验 表示"该单元有虫"的先验概率;每收到一份报告,阳性则 ,阴性则 。
图4 模拟 200 份新报告(含 3 份阳性)的演化:初始 0.5 的后验随阴性累积迅速下降,3 份阳性使其短暂回升,最终稳定在 。这量化了"持续无阳性→信心下降"的直觉。
更新频率由数据节奏决定:
提交滞后中位 24 天(图5)意味着新确认信息约一个月后入库。若更新过频(日级),噪声未沉淀;若过疏(月级),响应滞后。周级更新在时效与稳定间取得平衡,故定为推荐频率。
四、Q5:根除证据标准
宣告根除必须严谨。我们将周阳性计数建模为 ,采用统计学零计数规则(rule of 3):若连续观测 周零阳性,则 的 95% 置信上界约为 (每周)。
令上界阈值 (即每周新增阳性率低于 5% 方算受控),需 周连续零阳性(图6)。此外,胡蜂有年度飞行季,单季零阳性可能只是季节性沉寂,故监测窗须覆盖 个飞行季,即 周。
灵敏度(图7)显示:周报告率越高,达成证据所需时长越短。按当前周报告率 份/周,需累计阴性报告约 份()。这把"根除"从模糊口号转化为可审计的操作指标:当满足"60 周连续零阳性 + 累计 2397 份阴性 + 覆盖 2 飞行季"三项,方可宣告根除。
五、端到端决策流程
图8 汇总闭环:新报告入库 → 特征工程 → 分类得 → 排序优先核查 → 周级更新后验 → 根除判定。该流程可直接部署为州农业部的仪表盘。
五之一、闭环系统的性能度量
为评估整套决策闭环而非单模型,我们定义系统级指标。第一是召回保障率:在给定核查预算下能捕获的真阳性比例,视角二已给出约 26% 筛查即可覆盖全部阳性。第二是响应时延:从新确认到模型更新生效的周数,Q4 定为 1 周。第三是误报成本:高分页报告中最终为阴性的比例,由基率决定约为 99.3%。三项共同刻画"系统是否真正好用",比单一 AUC 更贴近运维现实。我们建议州农业部以这三项建立月度复盘机制,而非仅盯模型准确率,因为部署后的系统表现才是公共资金是否花对地方的最终判据。
五之二、组织配套与数据治理要求
再好的模型也依赖数据质量。我们指出三条配套要求。其一,统一经纬度编码:原始报告多为文本地址,需可靠地理编码,否则距离特征失真、模型失效;其二,缩短提交滞后:图5 显示中位滞后 24 天,若公众能一键上传带定位的照片,滞后可进一步压缩、更新更及时;其三,明确未核实报告的处理时限,避免其无限期堆积导致优先级排序失去意义。这些组织层面的改进与算法同等重要——题目虽聚焦统计建模,但真实部署中数据治理往往是瓶颈,主动点明方能体现方案的落地性。我们也建议在立项阶段就同步建设数据质量监控,使特征失真能在源头被发现,而非等问题传导到模型输出后才追责。
六、模型评价与局限
优势:① 优先核查把稀缺核查力对准高价值目标;② Beta-Binomial 更新简单、可解释、天然给出不确定性;③ 根除标准有频率学派依据(rule of 3),可审计。所有参数()均显式定义并附灵敏度。
局限:① 更新以单元为单位,未建模单元间空间传播;② 为政策选择,敏感度已示;③ 周报告率假设平稳,疫情末期报告可能骤减导致 难达;④ 未计入"主动诱捕"等新增数据渠道对 的影响。扩展可引入时空点过程与贝叶斯时空模型。
六之二、优先核查的成本函数形式化
我们将 Q3 的优先级进一步形式化为带预算约束的优化:设核查前 条报告的固定人力成本为 ,其期望捕获阳性数为 (按分数降序)。目标是在 (覆盖目标 个真阳性)下最小化 。由于 随排名递减,该问题的最优解恰为"取分数最高的前 条",即本视角采用的降序截断策略,理论上有闭式依据而非纯启发式。
六之三、贝叶斯更新的共轭选择依据
Q4 选用 Beta 先验源于二项似然的共轭性:每收到一份报告即一次伯努利试验,后验仍属 Beta 族,可解析递推、无需重跑优化。先验 为无信息均匀,避免主观偏置;若历史显示某单元曾阳性,可改为 等带信息先验,框架不变。这种"小步快跑"的在线更新,比周期性全量重训更省算力、更易解释,契合周级节奏。
六之四、根除标准的统计推导细节
Q5 的零计数规则源自 Poisson 置信区间:观测 周零事件时, 的 95% 上界为 。令其小于 得 周。再以"双飞行季"约束 周防止季节假象。该标准纯粹由频率学派区间导出,不依赖任何黑箱,审计者可逐步复算,符合题目对"显式假设与区间估计"的全部要求。
六之五、极端情景与系统韧性
任何决策系统都须考虑失效模式。我们列举两类极端情景并给出应对。其一是"假阴性雪崩":若某季出现大量未鉴别的阳性报告(如因鉴定实验室饱和),模型分数普遍偏高,优先排序仍有效但绝对精度下降,此时应触发"降级为全量核查"的应急预案。其二是"数据中断":若公众上报骤减(如舆论疲劳),周报告率 崩塌,Q5 的零计数证据将因分母不足而失效,需改为"结合主动诱捕阴性数"的复合证据。提前标注这些失效边界,比宣称系统永不失误更具专业可信度,也呼应了题目对稳健性与假设检查的反复要求。韧性设计的核心,是把"模型会出错"作为前提而非意外,从而在系统层面吸收个体错误,而非寄望于单一算法永远正确——这才是公共决策系统应有的成熟姿态。
结论
分类模型的价值不在孤立的 数字,而在它驱动的决策闭环:以成本敏感排序优先核查、以周级 Beta-Binomial 更新吸收新知、以零计数规则与双季监测窗严谨判定根除。三者共同把"统计建模练习"转化为可支撑公共决策的 operational 系统——这正是本题"定义指标、区间估计、检查假设"全部要求的落脚点。
附录:核心 Python 实现(可独立运行复现全部数字)
import os, sys
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.normpath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2021c as G
D = G.gen_mcm2021c()
UP = D["update"]
print("更新: 先验 Beta(%g,%g) 新报告=%d 其中阳性=%d"
% (UP["alpha0"], UP["beta0"], UP["n_new"], UP["n_pos_new"]))
print("最终后验 P(有虫)=%.3f 推荐频率=%s" % (UP["final_p_present"], UP["update_freq"]))
print("提交滞后中位=%d 天" % UP["median_lag_days"])
print("根除: 阈值tau=%.2f -> 需连续N>=%.0f周, 监测窗M=%d周" %
(UP["tau"], UP["N_rule3"], UP["M_seasons"]))
print("周报告率=%.2f 份/周 -> 所需累计阴性≈%.0f 份" %
(UP["lambda_rep_per_week"], UP["req_neg_reports"]))
C = D["classifier"]
print("优先核查: 覆盖全部阳性需筛查 %.1f%% 报告" % (100*C["frac_capture_100"]))