
Top15%命中率98%——参保意愿预测模型在扩面动员中的完整落地100万待动员名单、实际动员能力只有15万人次——人力该往哪儿投这个项目用25183条真实动员台账训练参保意愿预测模型随机森林AUC 0.895、Top15%命中率98%随机只有45.2%——同等人力参保产出翻倍。这篇文章从特征到标定到分档拆完整落地过程。文章目录Top15%命中率98%——参保意愿预测模型在扩面动员中的完整落地一、业务问题100万名单15万人力二、数据25183条真实动员台账2.1 标签定义2.2 一个编码bug的修复2.3 划分三、特征27维每一个都论证过3.1 入模特征全景3.2 最强发现村参保率的倒U型3.3 医保信号28.5% vs 15.4%3.4 特征关掉的论证——比入模更重要四、模型四模型对比RF胜出的完整决策4.1 同数据同特征四模型4.2 融合方案全部败给单一RF4.3 备案副模型LR的存在理由五、五轮迭代0.578到0.895每一步涨在哪六、圈选能力模型价值的直接度量6.1 Top-K命中率TEST实测6.2 业务换算6.3 五档分档与差异化触达七、概率标定可审计比准确更重要7.1 问题RF概率偏保守7.2 方案同类人群直查标定7.3 为什么不用Platt/Isootopic回归八、单人归因不用SHAP的规则引擎九、限制与改进——写清楚哪里不可信十、总结一、业务问题100万名单15万人力城乡居民养老保险扩面动员的年度现实待动员名单约100万人本省户籍、非在校、无固定单位、未参保 实际动员能力约15万人次经办员上门协管员通知 矛盾的解法只有一个不是所有人都要上门—— 找出最可能同意的那15%传统做法按村排序、按年龄排序——粗放。我们的做法用历年动员台账训练一个参保意愿模型给100万人打分按分数排序圈选Top15%优先投入。二、数据25183条真实动员台账2.1 标签定义LABEL 1名单生成时未参保后续任一路径参保 经办员上门转化/协管员通知后自行办理/完全自主 LABEL 0名单生成时未参保至今仍未参保 正样本 11,39345.2%/ 负样本 13,79054.8%标签是路径无关的最终是否参保——这个口径选择有深意动员资源投放关心的是这个人会不会参保不是通过哪条路径参保。2.2 一个编码bug的修复导出工具把收入列的低/中/高GBK双字节拆成单字节写入——半个字导致整个文件解码错位。修复用逐字节状态机INCOME_BYTE_MAP{b\xb5\xcd:低,b\xd6\xd0:中,b\xb8\xdf:高}# 逐字节扫描高位字节处尝试匹配候选双字节序列# 关键校验只有当前行已累计逗号数5确认处于收入列才替换# 未匹配的高位字节按正常GBK双字节整对拷贝列定位校验是精髓——不加这个校验别的列碰巧出现相同字节序列会被误改。2.3 划分分层随机划分按LABEL分层种子42train 17628 / val 3777 / test 3778。一个已知缺陷立项要求时间顺序切分早期训练、后期验证但数据无参保日期字段暂用随机分层。这是有意识的妥协——记录在MODEL_CARD里下次导数补INSURE_DATE字段改时间切分。标签口径含不限期最终参保按当年任务量解读时可能高估10-20个百分点——知道自己的模型哪里不可信比模型本身更重要。三、特征27维每一个都论证过3.1 入模特征全景类别特征说明年龄AGE连续 4桶独热边界[0,19,24,31,200]刚成年/20-24/25-31/32户口农业/非农/居民独热修复后三分类交互户口×年龄段12项捕捉农业大龄 vs 居民青年两极村参保率CIR 5桶独热边界[-0.01, 0.40, 0.64, 0.76, 0.93, 1.01]行为MEDICAL_INSURED缴居民医保——最强单一信号性别SEX弱特征3.2 最强发现村参保率的倒U型CIR所在村参保率与个人同意率的关系不是线性的——实测呈倒U型0.4-0.9的中间段参保意愿最强两端都差。低CIR村0.4整体氛围弱从众效应起不来 中CIR村0.4-0.9示范效应最强——邻居都缴了我也缴 高CIR村0.93能参保的早参保了剩余的是多次动员未果的硬骨头线性模型LR对这种关系无能为力——必须分桶独热让树模型自己学。这个发现也进了单人归因话术预测为什么时按CIR三段论解释。3.3 医保信号28.5% vs 15.4%是否缴居民医保是动员前可得的强信号已缴医保者同意率28.5%未缴者15.4%——几乎翻倍。这个特征的深层含义是社保接受度的代理变量——愿意缴医保的人对养老保险的接受度系统性更高。它独立于户口性质起作用eval_segments.py按医保状态分组验证过组内排序依然有效模型不是只学会了这一个字段。3.4 特征关掉的论证——比入模更重要六个特征被论证后主动关闭每一条都是一次决策特征关闭原因收入INCOME_LEVEL动员后才知道的调查结果——事后信息泄漏禁用教育/婚姻数据常量无方差教育在这批人群中是户口的影子家庭维度3项公安户号无法关联家庭成员政策认知/制度信任城居保执行15年人群方差消失就业形态名单内无单位是共性无区分度家庭参保率由村参保率替代文献中邻里效应强于家庭效应收入特征这条最值得单独讲——如果用了它离线AUC会更好看但模型学到的是收入高的人参保了这个业务上无法事先知道的伪规律。上线后新名单没有收入数据要上门调查才知道模型直接失效。特征伦理不是道德问题是特征在预测时点是否可得的工程判断。四、模型四模型对比RF胜出的完整决策4.1 同数据同特征四模型模型TEST AUCTEST KS结论逻辑回归0.8520.553备案副模型决策树0.8870.599—随机森林0.8950.615主模型GBDT0.8970.618仅0.002弃用GBDT比RF高0.002为什么弃用——AUC 0.897 vs 0.895的差异在25183样本下没有统计显著性但GBDT多一套调参体系learning_rate/subsample、多一种过拟合风险、少一层多树投票的直觉解释。0.002买不回这些维护成本。4.2 融合方案全部败给单一RF测了7个方案两阶段串联LR粗筛20%/30%/50%决策树精排、LRRF平均融合、LRRF秩融合——无一超过单一RF。两阶段串联的机制值得记录LR先筛掉低分段决策树只在高分段训练。TEST上保留段用树分数、被筛掉段保留LR分数压低保序维持两段分数可比。结果是精排的收益抵不过粗筛丢掉的信息。结论朴素但值钱特征工程做对了单一强基线很难被融合超越特征没做对怎么融合都救不回来。4.3 备案副模型LR的存在理由LR的AUC低0.043但保留它做副模型——系数直读、审查友好。27维进L1正则后压到14个非零系数每个系数符号和大小直接可讲“农业户口降低意愿、缴医保提高意愿、32岁以上提高意愿”——监管答辩时这是能在会上当场念出来的模型。主模型RF管性能、副模型LR管解释——双模型备案是政务ML的标配结构。五、五轮迭代0.578到0.895每一步涨在哪版本变更TEST AUCv0.13特征基线AGE/SEX/CIR0.578v0.2户口性质修复原为常量0.794v0.3年龄分桶户口×年龄交互0.812v0.4医保参保字段接入0.810Top5% 8.5ppv0.5户口按地址修正标签按参保状态核定0.895三个关键转折v0.1→v0.2的0.216——户口列修复。原始导出的户口是常量全是居民修复后才有三分类的区分度。最大的提升往往来自数据修复而不是模型升级。v0.4的AUC反降但Top5%8.5pp——医保字段没有提升整体AUC0.812→0.810但头部圈选精度大幅提升。业务指标Top-K命中率和统计指标AUC会分家——按业务目的选模型。这个版本没有被回滚。v0.5的0.085——两个数据口径修正户口按地址修正、标签按系统参保状态批量核定。又一次数据质量的收益大于算法调优。AUC的实用性门槛低于0.7的模型基本没有业务价值v0.1的0.578只比随机猜好一点列出来只为展示涨幅来源0.7-0.8是可用但有限超过0.8才具备实际部署价值——这个项目从v0.2起跨过0.8v0.5的0.895在风控/营销类模型中属于可用性较高的水平。过拟合检验train AUC 0.910 vs test 0.895差0.0150.03健康线。六、圈选能力模型价值的直接度量6.1 Top-K命中率TEST实测圈选命中率说明Top 5%99.5%几乎跑一个成一个Top 10%98.9%Top 15%≈98%对应年度15万任务量的工作档Top 20%97.5%Top 30%91.3%覆盖全部参保者的76%全名单基准45.2%不用模型随机跑的水平6.2 业务换算100万名单按Top15%15万人次动员预计约14.7万人参保。随机作业同等人力只能转化约6.8万人45.2%基准——同等人力产出翻倍以上。6.3 五档分档与差异化触达档范围实测命中率触达策略ATop 5%≈99%重点攻坚优先上门现场办理B5-10%≈99%电话确认意向有意向再上门C10-20%≈97%短信/微信推送集中办理D120-40%—仅短信等待主动咨询D240-100%—本期不投入下期重新评估分档不是模型输出——是模型分数到运营动作的翻译层。A档99%命中率对应上门就办的高成本动作C档97%对应短信能解决就不上门。模型管排序、运营策略管成本效率。七、概率标定可审计比准确更重要7.1 问题RF概率偏保守随机森林的概率是多树投票比例——输出0.81时真实同意率可能是0.90概率压缩向中间。直接把81%汇报给领导“这个人有81%的概率会参保”——但同类人实际90%都参保了。7.2 方案同类人群直查标定标定算法的核心思想标定概率训练集中同户口×同年龄段N人的真实同意率模型分数只在±10个百分点窗口内微调。# 分组键(HKOU_TYPE, age_bin)# 训练集上算每组真实同意率 base 和样本量 size# 同时算该组模型分数的10%/90%分位 (lo, hi)# 对每个待打分者ifsize30andhilo:posclip((p_model-lo)/(hi-lo),0,1)# 组内相对位置calibratedbase(pos-0.5)*0.20# 只允许±10pp微调else:calibratedbase# 组太小或无区分度——直接用组真实率三个设计点base锚定业务事实——模型分数压不过同类人群的实际参保率这个事实±10pp窗口——模型只在组内做排序微调不改变组的量级size30门槛——小组样本不足时退回组真实率不做不可靠的微调单人预测predict_one.py的标定更细一级——三级回退同户口×年龄×医保状态≥30人 → 同户口×年龄≥30人 → 全局均值。7.3 为什么不用Platt/Isootopic回归那些是统计学标定——输出一个标定后概率但无法回答这个数字怎么来的。同类直查法的数字可追溯“训练集中农业户口、32岁以上、已缴医保的347人里312人实际参保——你的标定概率90%”——每个数字都能在审计时翻出底层清单。政务场景的可解释优先级高于统计优雅。排名用原始模型分、汇报用标定概率——两者职责分离。八、单人归因不用SHAP的规则引擎predict_one.py的归因输出四类驱动因素——不是SHAP黑盒值不可讲是硬编码规则实测数字医保已缴 → 正向同类已缴医保者同意率28.5% vs 未缴15.4% 户口该户口同意率偏离全量±5pp才触发 年龄≥28正向临近待遇领取转化意愿强、≤20负向 CIR0.4-0.9示范效应最强区间 / 0.93剩余多为硬骨头 / 0.4整体氛围弱每条归因都带真实数字支撑经办员看得懂、记得住、答得上。SHAP给数据科学家看规则引擎给经办员看——受众不同工具不同。九、限制与改进——写清楚哪里不可信模型的五条限制全部记录在MODEL_CARD标签口径为不限期最终参保——按当年任务量解读可能高估10-20pp人群边界——换省换人群必须重训标签含路径混合——分数是参保概率不是上门转化率数据时效——村参保率是导出时点值建议每年重训历史规律依赖——政策变化后需重验改进方向按优先级排补INSURE_DATE改时间切分★★★、历年进名单次数识别老油条★★★、医保连续缴费年数替代0/1★★、曾参职工养老的回流者识别★★。限制写得越清楚模型越可信——政务ML的悖论但成立。十、总结业务问题定义比模型选择重要——100万名单投15万人力决定了这是个排序问题不是分类问题Top-K命中率才是核心指标数据修复贡献了最大涨幅——0.578→0.895的路上户口修复和数据口径修正贡献了0.30模型算法只贡献了0.02特征关掉的论证比入模更重要——收入特征的事后泄漏禁用避免了上线即失效的假模型可解释的每个环节——LR副模型系数直读、同类直查标定可追溯、规则引擎归因带实测数字——监管答辩全链路可讲模型是排序器不是判官——排名用模型分、汇报用标定概率、动作按分档策略——三层职责分离20年政务信息化的教训在这里的投影任何模型上线先想好领导问这个数怎么算出来的时你怎么答。答不出来的模型再准也不能用。✅ 亮点25183条真实动员台账的完整落地——从编码bug修复到五轮迭代到标定算法到分档策略每个环节有真实数字Top15%命中率98% vs 随机45.2%、每个决策有取舍理由GBDT仅0.002弃用、融合全败给单一RF、收入特征事后泄漏禁用。适合做政务/金融预测模型落地的技术负责人。扩展方向MODEL CARD的文档方法论、特征工程的关掉论证、概率标定的可审计设计。