遇到过这种事没有:复盘会上,风控同事兴高采烈地汇报“新模型准确率80%”,然后所有人点头鼓掌,散会。但我私底下拉出混淆矩阵一看,该拦的坏人里只拦住了不到三成,剩下的七成多全放进了审批流。这种“模型说自己80%准、实际漏掉了76%该拦的人”的现象,在风控模型评估里太常见了。它不是个例,而是很多人把模型评估想简单了——准确率看着高,不代表模型真的好用;真正决定风控模型价值的,是精确率、召回率、AUC、KS这些指标之间的配合,以及它们和业务损益之间的关系。
这篇文章我想把风控模型评估彻底讲透,从混淆矩阵讲到PR曲线、AUC和KS,从离线评估讲到上线后的客群偏移和标签口径问题,最后给一份可以直接抄的评估流程。不管你是刚入行的风控数据分析师,还是已经带项目的建模老手,应该都能在里面找到几个值得反思的细节。
1. “80%准”是笔糊涂账:先分清它在说哪个指标
1.1 准确率的数学本质:一种会骗人的平均数
准确率是机器学习里最基础的指标,也是被滥用得最狠的指标。它把所有样本一视同仁地拿来算账:预测对的样本数除以总样本数。公式不复杂:
Accuracy = (TP + TN) / (TP + TN + FP + FN)
TP是“坏人被拦下”,TN是“好人放行”,FP是“好人被误伤”,FN是“坏人漏网”。问题就出在这个“一视同仁”上。在风控场景里,绝大多数样本都是好人,坏人的比例往往只有1%到5%。这时候,哪怕模型什么都不学,把所有样本都判成好人,准确率也能轻松超过95%。
用保安类比最直观。一栋写字楼每天进出1000人,其中有1个小偷。你请了一个保安,他的工作方式是什么都不做,见谁都放行。他每天判断“正常”的正确率是999/1000等于99.9%,报表做出来非常漂亮。但整个写字楼被偷了,你要的是拦小偷,不是给进出人员打正确率标签。准确率衡量的是“对所有样本打标签的正确程度”,它从来不回答“目标对象有没有被你抓住”这个问题。
所以准确率只有在两类样本数量接近、且判断错误的代价也接近时才有参考价值。比如性别判断、场景分类这类均衡问题,准确率还勉强够用。到了风控、反欺诈、医疗筛查这些场景,样本天然不平衡,漏掉一个坏人的代价和误杀一个好人的代价又完全不对等,再用准确率当核心指标,就是在给自己上眼药。
1.2 一组合得上的数据:80%准确率、80%精确率、24%召回率
用一个具体数字把标题里的现象完整复现出来。假设某产品当月进件1000笔,真实情况是200个坏人、800个好人。模型给出的拦截名单是60人,这60人里有48个确实是坏人,另外12个是被误伤的好人。剩下940人直接放行,其中包括了152个漏网的坏人。
整理成混淆矩阵就是:
| 预测坏(拦截) | 预测好(放行) | |
|---|---|---|
| 实际坏 | 48 | 152 |
| 实际好 | 12 | 788 |
这个模型的全局准确率是 (48+788)/1000=83.6%,对外报“80%准”并不算夸张。但对业务真正重要的几个指标是这样:
- 精确率 Precision = 48/(48+12)=80%,说的是“拦截名单里确实是坏人的比例”。
- 召回率 Recall = 48/(48+152)=24%,说的是“所有坏人里被拦下来的比例”。
- 漏报率 = 1-24%=76%,这就是标题里“漏掉了76%该拦的人”。
同一组数据,换个口径看,模型从“80%准”立刻变成“只抓到两成坏人”。这种反差在风控模型评估里太常见了。很多团队汇报时只报一个准确率,不报阈值、不报混淆矩阵、不报业务成本,听的人以为模型很能打,实际上它可能只是擅长识别那些本来就不会逾期的人。
注意:以后凡是有人和你说“模型准确率80%”,第一反应应该是追问:这个80%是Accuracy、Precision还是AUC?阈值是多少?在什么样本上算的?三连问下来,水分基本能挤掉一半。
2. 风控场景的代价不对称:为什么“抓到坏人”比“猜对好人”更要紧
2.1 漏拦一条大鱼,能亏掉一千个误伤的利润
上一章把指标说清了,但还有一个绕不开的问题:为什么风控圈这么强调召回率?答案在业务代价的不对称上。模型判断错误,在风控里会带来两种完全不同的损失。
误拦好人:损失的是当期该赚的利息、手续费,以及客户体验变差带来的长期流失;漏拦坏人:损失的是本金和催收成本,在某些高风险场景里还有连带资金链风险。这两笔钱往往差一个数量级。
做一个简单测算。假设单笔放款的期望利润是300元,一笔坏账的平均损失是5000元。模型多拦错一个好人的代价是丢掉300元利润;模型多放走一个坏人的代价是亏5000元本金。这么一算,漏掉一个坏人造成的损失,约等于误伤16个好人。也就是说,在实际决策里,你不能为了把误伤降到最低而把拦截名单缩得太小,否则省下来的误伤利润,远远补不上漏出去的坏账。
这也是为什么固定用一个准确率指标去调模型完全是缘木求鱼。模型的决策阈值本质上是在“多拦坏人”和“少误伤好人”之间寻找一个平衡点,而这个平衡点应该由业务损益函数决定,不是由Accuracy大小决定。成熟的风控团队会把每一档分数对应的坏账率、通过率、利润贡献做成一张损益表,然后让模型阈值落在利润最优区间,而不是落在准确率最高的位置。
2.2 从业务漏斗倒推,线上拦截到底盯什么指标
脱离业务漏斗谈模型指标,等于不看地图开车。风控模型的完整链条是:进件 → 规则拦截 → 模型评分 → 人工或自动审批 → 放款 → 贷后表现(逾期、催回、核销)。模型分数只是中间的一个决策变量,不是最终目标。
真正能说明问题的,是放到漏斗末端看结果。上线一个风控模型,业务方最直接会看两个东西:审批通过率有没有变、坏账率有没有降。这两个指标一个代表量和规模,一个代表质量和风险。如果模型AUC提高了很多,但通过率不变、坏账率也没降,那就说明模型离线评估出了偏差,或者标签定义有问题,又或者模型学到的规律和线上实际客群对不上。
分客群看指标同样关键。同一个模型在新客和老客上往往差异巨大。新客没有历史信贷行为,特征少,评分更依赖第三方数据,区分度通常偏弱;老客有完整的还款历史,区分度更强。如果只把新老客混在一起算一个AUC,模型在新客上“瞎猜”的问题就被掩盖了。我在实际评估中会把样本拆成新客池、老客池、以及不同渠道来源的客群分别算指标,客群之间的稳定性往往比总体数字更能暴露问题。
3. 阈值、分数与曲线:一维指标之外,模型真正的“手感”在哪
3.1 模型输出的其实不是“坏/好”,而是一个分数
很多刚入门的同学以为风控模型输出的是“这个客户坏/好”的标签,实际上绝大多数模型输出的都是连续分数或概率。拿评分卡举例,模型给每个客户打一个分,比如300到800分,或者输出一个0到1的逾期概率。真正决定“拦不拦”的是你设定的阈值。
阈值的含义可以用渔网来想。网眼小,捞上来的东西多,大鱼小鱼一起进,小鱼就是误伤;网眼大,捞上来的东西少,大鱼也可能从网眼溜走。模型评估时你报的任何一个“准”,都必须带着“当时网眼多大”说,否则没有意义。
同一个模型,阈值从0.3拉到0.7,会发生什么?拦截名单变小,精确率通常上升,因为剩下大多是“非常像坏人”的人;召回率下降,因为很多处于灰色地带的坏人被放行了。这组变化是此消彼长的,不是模型变好或变坏,而是你选的经营策略变了。只看单点指标会得出“这个模型比那个好”的结论,但很可能只是因为两个模型被测试时用的阈值不一样。对比模型时,要么把阈值固定在同一业务约束下,要么直接在曲线层面比,别拿单个点的指标打架。
3.2 PR曲线、ROC与AUC:各自解决什么问题,什么时候会被坑
既然单点指标会骗人,曲线就把所有可能的阈值都画出来给你看。
PR曲线(Precision-Recall Curve)的横轴是召回率,纵轴是精确率。一个完美的模型会往右上角顶,曲线下的面积叫PR-AUC或AP,越高说明模型越有能力同时保持“拦得准”和“拦得全”。在坏人占比极低的反欺诈场景里,PR曲线比ROC要敏感得多。原因在于ROC的分母里有大量“好人”,坏样本就算全漏了,FPR也可能因为好人基数的稀释而显得很低,AUC虚高。
ROC曲线(横轴FPR,纵轴TPR)和AUC的优点是不受阈值影响,衡量的是模型把所有样本按风险排序的能力。AUC的通俗解释是:随机抽一个坏人和一个好人,模型把坏人排到好人前面的概率。AUC 0.8意味着有80%的概率能把一对随机的好坏样本排对顺序。但要注意,AUC再高也不代表某个阈值下的拦截效果就好。我见过AUC 0.85的模型,按期望坏账率去卡阈值,召回率仍然只有三成。AUC回答的是“排序对不对”,不是“该拦的人能不能拦到”。
风控场景里怎么选?我的经验是:团伙欺诈、反洗钱这类极端不平衡的场景优先看PR曲线;评分卡建模阶段看KS来感知区分度;做全量风险排序、粗筛策略时看AUC。几个指标之间不是互相替代,而是各管一段。
| 指标/曲线 | 回答的问题 | 典型场景 | 主要坑 |
|---|---|---|---|
| 准确率 | 所有样本里判断对的比例 | 类别均衡、代价对称 | 不平衡数据里虚高 |
| 精确率 | 拦下来的人里坏人的比例 | 控制误伤、审批通过率 | 单看会漏掉多数坏人 |
| 召回率 | 坏人里被拦下的比例 | 风险优先级高、漏损大 | 单看会误伤大量好人 |
| PR-AUC | 同时做到高精确率和高召回率的能力 | 反欺诈、极度不平衡 | 对业务阈值落地仍需卡点 |
| ROC-AUC | 好坏样本排序正确率 | 全量排序、粗筛 | 样本不平衡时高分可能没有对应好阈值 |
| KS | 好坏客群分布最大分隔度 | 评分卡分箱 | 高KS不保证利润最优,还容易过拟合 |
3.3 KS:评分卡圈最爱聊的“区分度”,也有两张脸
风控圈里KS大概是除了AUC以外出现频率最高的词了。KS的计算是对每一个分数点算TPR和FPR的差,然后取最大值。换句话说,它衡量的是“模型能把好坏客群在分数轴上拉开多大的距离”。KS 0.3以上通常被认为可以接受,0.4算不错,0.5以上就要警惕了。
警惕是因为高KS背后有两种常见陷阱。一是数据泄漏,把不该出现在训练期的变量放进去了,比如用“是否被拒”这种标签泄漏类变量,或者用了未来信息,线下KS漂亮得不行,线上立刻现原形。二是过拟合,树模型在训练样本上KS 0.6,OOT验证只有0.2,这种情况在风控建模里经常出现,越是复杂的模型越容易犯。所以看KS一定要同时看训练集、验证集和OOT三个数,三个数一起掉或者一高一低,都说明模型没你想的那么好。
另外,KS高不代表业务利润高。KS衡量的是分布差距,不是损益。有的模型在某个分数段区分度很高,但那个分数段正好业务量很少,对整体损益贡献有限。评估模型时,KS和损益表要一起看,别让数字表层的漂亮掩盖了业务逻辑的苍白。
4. 离线指标到线上真实效果的几颗暗雷:客群偏移、拒绝推断与标签口径
4.1 客群偏移:为什么离线AUC 0.8,上线三个月变成0.6
这是风控模型最经典的一记闷棍。模型在历史样本上训练和验证,但训练时数据是“过去的人”,上线后面对的是“未来的人”。市场政策一变、渠道换了、产品定价调整、节假日前后客群结构波动,都会导致今天的客群和训练样本长得不太一样。这种差异就叫客群偏移。
我见过一个真实案例。某个分期产品换了一批投放渠道,新渠道进来的客群收入更高但多头借贷比例也更高,模型的旧特征权重完全没跟上,上线首月AUC就只有0.65。团队一开始还以为是模型上线操之过急,后来把训练集和线上近一个月样本的特征分布一对比,好几个特征的PSI超过0.2,才知道是客群漂移了。
应对的办法很简单:训练模型时一定要做时间外验证(OOT),用t月之前的数据训练,t+3或t+6月验证;上线后定期监控特征分布和模型分数分布的PSI。把PSI超过0.1当预警,超过0.25当强警报,一告警就要排查是客群变化还是变量异常。模型不是部署完就结束的,它需要持续被体检。
另一个在实操中容易忽略的点是:节假日、大促、新产品上线这些特殊时段的数据,和平时完全是两个分布。训练集如果只覆盖普通月份,节假日进件客群的高风险特征就学不到。我习惯在样本区间里至少留一个完整的大促或节假日周期,不然模型每逢大促就当机。
4.2 拒绝推断:模型只看“活下来的人”,自然会偏
还有一个更隐蔽的坑,叫拒绝推断。很多团队训练风控模型用的样本,是那些通过审批、成功放款并有贷后表现的客户。被拒绝的客户没有账单表现,自然也就没有“坏”或“好”的标签。但你要知道,模型上线后要打分的恰恰是所有进件客群,包括当年那批“被拒绝的人”。
这里就出现一个系统性偏差:训练数据里只有“幸存者”。过去被规则拒绝的人,已经被判定为更可能违约,但模型根本没见过他们的真实表现(因为没放款)。结果就是模型在历史通过客群上评估得再好,对全量客群尤其是低分段客群的预测能力也是打问号的。一句话总结:你在幸存者样本上练了一个要去判断所有人的模型,评估结果自然不能全信。
处理这个问题的技术方案有给拒绝样本贴标签、模糊展开、Heckman选择模型等,篇幅所限不展开讲。但至少要意识到:一个不做拒绝推断的模型,线下指标往往比真实可用效果要乐观。这也是为什么很多团队上线后按分数段一拆,发现低分段客户的行为和预测完全对不上。
4.3 标签口径变化:坏账率统计方式一变,模型“凭空变强”
评估模型的另一个暗雷是标签口径不一致。同一个“坏客户”,可以用逾期30天、60天、90天,也可以用M3+、核销、催回率来定义。不同定义下训练出来的模型完全是两个物种。
我在实际项目中遇到过一次很典型的翻车。某团队用“逾期90天”作为坏标签,模型AUC 0.78,上线后效果却不稳定。后来发现催收团队加强了早期催收后,一部分原本会拖到90天的客户在60天就被收回来了,“逾期90天”这个标签在当年的客群里已经不太适用,模型相当于在一堆被“人工救回来”的人里硬找坏人,自然学不到稳定规律。最后我们把标签口径改成“逾期60天且催收失败”,并且重新划表现期,模型才稳定下来。
所以评估之前,先确认三件事:坏样本的口径是什么,表现期够不够长(比如3个月表现期可能还没暴露风险),样本区间是否覆盖了完整的业务周期(包含节假日、淡旺季)。口径没对齐,指标再高都只是数字游戏。
另外提醒一句:上线后的监控里,如果催收策略变了,逾期标签的生成逻辑也可能跟着变,这时候对比新旧两个模型的好坏率,一定要先做标签口径对齐,不然会出现“旧模型被突然超越”或“新模型凭空变强”的假象。
5. 从一次翻车复盘里提炼的模型评估检查清单
5.1 复盘:AUC涨了0.03,坏账率不降反升
这一节讲一个我印象很深的翻车项目,也是评估指标的最好反面教材。现金贷产品线做模型升级,新模型离线AUC从0.78涨到0.81,KS从0.32涨到0.36,怎么看都是全面碾压。团队高高兴兴上线,三个月后一算:坏账率没降,通过率还降了两个点,利润反而亏了。
复盘时发现三个问题叠加。第一,新模型把一部分“会短期逾期但最终还清”的高息客群识别成了高风险并拒绝,这批人其实是利润的重要来源;第二,坏样本口径是“逾期90天”,但催收团队加强了早期介入,很多90天口径的“坏账”其实催收后能收回大部分本金,模型把能被催收回来的客户也当坏客户,学错了目标;第三,AUC提升主要来自老客群,新客群上的区分度几乎没变,但当时只看了总体AUC,没有分客群验证。
这个案例最扎心的地方在于:所有常规离线指标都在说“模型变好了”,但业务损益在说“你把它换上来亏了”。从那时起我就养成了一个习惯:模型评估的最终输出不是一串分数,而是一张损益对比表——旧模型和新模型在各自最优阈值下,通过率、坏账率、利润各是多少。指标是用来解释损益的,不是拿来当KPI的。
5.2 一份可以直接抄的评估流程
上完这堂课,后面我在团队里把模型评估固化成了下面这组流程,新人照着走基本不会漏:
- 先和业务对齐目标:这次升级是为了降坏账、提通过率、还是控成本?目标不同,评估指标的权重就不同。
- 定好样本口径:好坏客户怎么定义,表现期多久,样本区间是否跨完整业务周期。
- 划分训练、验证和OOT三个样本集,严禁随机切分代替时间外验证。
- 跑核心指标组:Accuracy、Precision、Recall、F1、PR-AUC、AUC、KS,全部注明阈值和样本范围。
- 分客群看表现:新客/老客、主力渠道/新渠道分开算,别让总体平均值掩盖局部失明。
- 画分数-坏账率单调性图,确认高分段坏账率低于低分段。
- 做损益模拟:在期望坏账率约束下找阈值,比较新老模型的通过率、坏账率和利润。
- 上线后先以冠军-挑战者模式小流量并行,监控PSI、通过率、坏账率,设置自动回滚条件。
这套流程看起来繁琐,但能挡掉大多数“离线很美、上线翻车”的问题。我见过太多团队死在第二步和第三步,标签没对齐、OOT没做就敢上线,出问题后又回头怀疑模型算法选型,其实根本不是算法的问题。
说实话,写了这么多年评分卡,我越来越觉得模型评估不是一门“算指标”的手艺,而是一门“翻译业务”的手艺。每个数字背后都要能回答一个问题:对业务损益意味着什么。下次再有人拿着“80%准”来找你,不用急着争执,就问三句话:召回率多少?阈值定在哪儿?按这个阈值过一遍,坏账率和利润会怎样变化?能把这三个问题答清楚的模型,才是可以放心上线的模型。