用五条规则做出评分表,再选定阈值
目标
在索赔数据上建立规则评分表,并根据混淆矩阵亲自计算精确率、召回率和 F1。逐步移动阈值并制成表,检查群体偏倚,然后在调查人力的限额之内选出用于运营的阈值,输出带有版本号和数据指纹的规则集。
为什么重要
想出检测规则并不难。困难的是决定在哪里切分分数,并说清这个选择会给谁留下什么样的成本。在基础比率低的问题上,阈值只要稍微降低一点,精确率就会迅速崩溃。而且 F1 最高的点很少恰好就是用来运营的点。调查团队能看的笔数才是真正的约束。 本实验只涉及构建检测器的一方。不涉及真实的欺诈手法或其规避方式。数据全部是合成的,机构名称也是虚构的,答案表(label_fraud)是为了选择阈值而预先植入的。 评分器会在你创建的数据库上重新计算期望值并核对。小数要写到第四位,整数栏必须完全一致。
步骤
- 创建并运行 /root/fraud/make_claims.py,在 /root/fraud/claims.db 中写入 200 份合同和 400 笔索赔(确认的欺诈 24 笔)。
- 在 /root/fraud/rules.py 中汇总五条规则和权重,并把每条规则的成绩写入 /root/fraud/rules.csv。
- 把分数合并,将 1 分以上的索赔连同命中了哪些规则一起写入 /root/fraud/scores.csv。
- 在最初提出的阈值 4 分下,把混淆矩阵和三个指标写入 /root/fraud/confusion.json。
- 把阈值从 1 分到 11 分的各项指标写入 /root/fraud/sweep.csv。
- 以阈值 4 分为基准,把各渠道的命中率和基础比率写入 /root/fraud/fairness.csv,把被命中最多的群体和精确率最低的群体写入 /root/fraud/fairness.json。
- 在调查人力限额 10 笔之内选择阈值,连同依据写入 /root/fraud/threshold_choice.json。
- 把规则集输出到 /root/fraud/rulebook.json,把供人阅读的整理输出到 /root/fraud/fraud_report.md。
参考
- 产出物全部放在 /root/fraud 下。后面步骤的脚本都会导入 rules.py(请在该目录下运行)。
- 规则表:R1 事故日期在保障开始日期之后 30 天以内(权重 3),R2 受理日期比事故日期晚 60 天以上(2),R3 金额 3000000 韩元以上(2),R4 最近 90 天索赔 3 笔以上(3),R5 事故日期是星期六或星期日(1)。
- 指标:精确率 = TP/(TP+FP),召回率 = TP/(TP+FN),F1 = 2PR/(P+R)。小数写到第四位。
- 数据指纹:按 claim_id 升序读取 claim,把 claim_id、policy_id、region、channel、hospital_id、amount、prior_claims_90d、accident_date、report_date、label_fraud 用竖线连接,各行再用换行连接,然后求 sha256。
- 常见错误:把精确率和召回率写反,漏掉 TN,只计算一个点就确定阈值,只看命中率而不看基础比率。
创建合成索赔数据
创建并运行 /root/fraud/make_claims.py,在 /root/fraud/claims.db 中写入 policy 200 行和 claim 400 行(label_fraud 为 1 的有 24 笔)。
使用种子值 20260917 的 random.Random,合同从 P0001 开始编号,索赔从 C0001 开始编号。受理日期用事故日期加上延迟天数生成。评分器连金额合计都会核对。
给五条规则打出成绩
把规则和权重汇总在 /root/fraud/rules.py 中,并把每条规则的 hits、fraud_hits、precision 写入 /root/fraud/rules.csv。
表头是 rule_id,weight,hits,fraud_hits,precision,按 R1 到 R5 的顺序写。precision 是 fraud_hits 除以 hits 的值。单独精确率低并不意味着规则错了——只是说明它单独不足以作为依据。
合并分数,生成判定清单
把 1 分以上的索赔写入 /root/fraud/scores.csv,按分数降序排列,分数相同则按 claim_id 升序。
rules 栏中,把命中的规则按 R1 起的顺序用“+”连接写入。只有分数的清单,调查员无法复核——必须同时有因什么被命中。
计算混淆矩阵和三个指标
在阈值 4 分下,把 TP、FP、FN、TN 以及精确率、召回率、F1 写入 /root/fraud/confusion.json。同时放入 total、positives、base_rate、flagged。
TN 是从全部笔数中减去被命中的笔数和漏掉的笔数得到的值。精确率是被命中的案件中判对的比例,召回率是事故中被抓到的比例。先看基础比率是多少,再解读精确率。
逐步移动阈值并制成表
把阈值从 1 分到 11 分各自的 flagged、tp、fp、fn、tn、precision、recall、f1 写入 /root/fraud/sweep.csv。
阈值越低,召回率越高,精确率越低。请亲自看看,在基础比率为 6% 的数据中,降到 1 分时精确率会降到多少。只计算一个点,就不知道放弃了什么。
并排查看各群体的命中率和基础比率
以阈值 4 分为基准,把各渠道的 claims、fraud、base_rate、flagged、flag_rate、tp、precision 写入 /root/fraud/fairness.csv,把被命中最多的群体和精确率最低的群体写入 /root/fraud/fairness.json。
只看命中率,无法知道哪个群体受了冤枉。必须把它与该群体的确认欺诈比例并排放置,才能区分“确实更多”与“规则捕捉到了运营特征”。渠道按 group 名称升序书写。
在调查人力限额内选择阈值
把调查团队本季度能看的 10 笔作为约束来选择阈值,并连同依据写入 /root/fraud/threshold_choice.json。同时保留没有限额时的最佳选择。
在不超过限额的阈值中,选出 f1 最高的一个。同时写出如果没有限额,最佳点在哪里,在申请增加人力时才能把这个差距当作依据。
连同版本号和指纹一起输出规则集
在 /root/fraud/rulebook.json 中放入 version、threshold、capacity、rules、dataset(含指纹)、metrics,并在 /root/fraud/fraud_report.md 中分四节整理。
报告的四个小节标题均为韩文,依次意为“规则集与依据”“阈值是如何选出的”“分群检查”“局限与后续”。指纹的计算方式写在实验说明的参考中。局限一节要用数字写出基础比率低时精确率会怎样。