欺诈检测的流程优化与归因分析
表格数据里的欺诈识别,主流做法还是梯度提升树,也就是把很多棵决策树串起来打分。模型在历史交易上训练一轮就上线,此后不再动。新冒出来的手法、换过一遍的人群,都指望它自己泛化。判别力往下掉的时候,系统里没有报警信号。
重训是常规办法,可风控的样本不是想训就能训的。一笔单要先过规则引擎,再过初审模型,被拦下的那些不留记录,进训练集的只有放行的流量;模型上线后面对的,是全量人群。论文把这一条摆在最前面。
他们没有改模型,改的是分数出来以后、与报警线比较之前的那一段,在那里加了一层可以撤掉的加法。把它撤掉,分数回到原样。
链路上就卡在"打完分、还没判"这一段。这一段平时没有能改动的地方,分一出来,能动的只有报警线,而线一挪,动的是全部告警量。
一、整条流程
| 环节 | 手上有什么 | 做什么 | 拿到什么 |
|---|---|---|---|
| 1 取材 | 冻结的模型、近一个月有标签的单 | 拉一个不参与评估的时间窗 | 适配窗口 |
| 2 定位 | 窗口里的欺诈单 | 每个字段算平均归因值,按中位数切一刀 | 待补字段名单、分桶表 |
| 3 生成 | 名单、分桶表、树结构摘要 | 三个模型各写 10 遍,一遍 50 条 | 最多 1,500 条判断 |
| 4 筛选 | 1,500 条判断 | 换阈值、试跑、去重、按分数段试站 | 三个模型各留 19、14、17 遍 |
| 5 校准 | 通过筛选的判断 | 每个分数段各估一版倍数 | 判断与倍数 |
| 6 叠加 | 判断、倍数、原分数 | 按对数逐项相加,再取平均 | 叠加后的分数 |
| 7 映射 | 叠加后的分数 | 查换算表 | 0 到 1000 的刻度 |
| 8 上线 | 百分位表、判断与倍数、换算表 | 逐单比条件 | 过线告警 |
上线之后线上一律不跑语言模型,只做条件比较和查表。撤掉第 8 环那张表,分数回到原样。
二、归因值只切了一刀
归因值是把模型打分拆到各个字段头上的数,这里用的是常见那种拆法。对窗口里的欺诈单逐字段求平均,按中位数切一刀:上半边是模型一直盯着的字段,下半边是它不太看的。
下半边每个字段再配一张分桶表,按百分位或者类别切开,每桶写着多少单、里面多少是欺诈、这个欺诈率是整批的几倍。
语言模型拿到手就三样东西:一段任务说明,讲清字段怎么编码;一份树结构摘要,里面是各字段被用了几次、贡献多少、高分路径上常一起出现的字段组合;再有就是那张名单和分桶表。模型本体它看不到,逐单的归因值也没给它。
题目末尾压了几条不许违的规矩。每条判断的头一个条件必须从待补那批字段里挑,模型重点依靠的字段只准摆在后头当补充;阈值一律写成百分位;条件之间只许用"并且"连接;每次写 50 条。
三、模型写出来的是 if 判断
电商那组数据上,推理型那个模型写过这么一条:同一收货地址 14 天内支付失败次数超过第 90 百分位,并且买家分群超过第 80 百分位。它给的理由是同址反复支付失败,多半在试卡授权。这条在窗口里命中 6,249 单,其中欺诈的比例是整批的 71.6 倍。
公开的银行账户欺诈基准上换用另一个模型,把会话时长超过第 90 百分位、使用免费邮箱、名下无房这三个条件摞在一起,命中 862 单,倍数 6.7。
每条判断都带一个名字、一段为什么骗的人会这样的说明、一句对应的数据依据,外加用到了哪些字段。这些都在本地一台工作站上跑完,内存 128 GB,没调外部接口,交易数据没出过机器。
四、一笔单怎么过线
模型给某个分数,下面按不同的倍数看结果。前两列是模型原本给的,后三列是叠加之后的结果。
| 原分数 | 原概率 | 原赔率 | 命中倍数 | 叠加后赔率 | 叠加后概率 | 是否过 988 线 |
|---|---|---|---|---|---|---|
| 994 | 30% | 0.43 | 3.33 | 1.43 | 58.8% | 不过,仍漏 |
| 994 | 30% | 0.43 | 25 | 10.75 | 91.5% | 过,报警 |
表里只用了两个换算式:赔率等于概率除以"一减概率",概率等于赔率除以"赔率加一"。倍数只乘在赔率上,所以抬不动的那些判断,加了也等于没加。
五、结果
| 数据 | 同样精度下的召回 | 同样召回下的精度 |
|---|---|---|
| 电商那组数据 | +2.26 个百分点 | +1.60 个百分点 |
| 银行账户欺诈基准 | −0.13 到 +0.27 | +0.02 到 +0.30 |
电商那组数据的六个报警档,头尾两档:
| 报警档 | 精度(原→后) | 召回(原→后) |
|---|---|---|
| 998 | 56.48% → 57.51% | 23.47% → 24.37% |
| 993 | 30.32% → 30.91% | 62.86% → 64.00% |
银行基准的七个切分里,同样召回下的精度全为正,同样精度下的召回有两组为负。论文写的是不造成损害。
拆掉部件之后,电商那组数据的召回变化:
| 改动 | 召回变化 |
|---|---|
| 只按条件触发率打分 | −24.76% |
| 整层叠加都去掉 | −35.73% |
| 整批估一个倍数 | −2.41% |
| 完整流程 | +2.26% |
六、重训为什么退
| 做法 | 召回变化 | 精度变化 |
|---|---|---|
| 加 100 轮训练 | −46.39% | −34.80% |
| 只加一轮、学习率 0.03 | −7.69% | −2.85% |
| 历史数据加适配数据全量重训 | −46.39% | −41.73% |
| 本方法 | +2.26% | +1.60% |
作者写的补救办法是给样本加权或者校正筛选倾向,没做。理由是筛选机制本身是另一个模型,它的分数拿不到。
这套流程跑完会剩下一张字段名单,上面都是模型没用上、数据上却有区分度的字段。它可以拿去补特征,也可以喂给下一版重训。
七、按周期整批换掉
| 时间 | 做什么 |
|---|---|
| 第 1 步 | 拉近一个月有标签的单 |
| 第 2 步 | 定待补字段,写判断,筛出可用的 |
| 第 3 步 | 各分数段估倍数,冻结成表 |
| 第 4 步 | 上线,只做条件比较 |
| 下个周期 | 整批重做,旧表整体换掉 |
它不在线上逐笔抓漏。单笔漏过凑不出统计,一条判断得在窗口里命中好几单、欺诈比例明显高于整批,才算得出倍数。
判断也不能往同一张表里一直加。一笔单同时命中五条,对数全加起来,分数没有上限;而这些判断又都拟合在同一段窗口上,越加越贴着那一个月,换个窗口就失效。
八、作者自己列的空缺
没有跟规则挖掘那类方法做对比,作者说这是主要空白。三个模型的组合大约要三倍的语言模型计算开销。全部结果是离线评估,没做线上对照实验。
参考文献
Qu, B., Wang, Z., Zahradnik, F., & Ouyang, M. (2026). Patching the blind spots: Reversible LLM rule overlay for frozen fraud detectors. arXiv Preprint arXiv:2611.08714. https://arxiv.org/abs/2611.08714