
遇到过这种事没有复盘会上风控同事兴高采烈地汇报“新模型准确率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个漏网的坏人。整理成混淆矩阵就是预测坏拦截预测好放行实际坏48152实际好12788这个模型的全局准确率是 (48788)/100083.6%对外报“80%准”并不算夸张。但对业务真正重要的几个指标是这样精确率 Precision 48/(4812)80%说的是“拦截名单里确实是坏人的比例”。召回率 Recall 48/(48152)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.6OOT验证只有0.2这种情况在风控建模里经常出现越是复杂的模型越容易犯。所以看KS一定要同时看训练集、验证集和OOT三个数三个数一起掉或者一高一低都说明模型没你想的那么好。另外KS高不代表业务利润高。KS衡量的是分布差距不是损益。有的模型在某个分数段区分度很高但那个分数段正好业务量很少对整体损益贡献有限。评估模型时KS和损益表要一起看别让数字表层的漂亮掩盖了业务逻辑的苍白。4. 离线指标到线上真实效果的几颗暗雷客群偏移、拒绝推断与标签口径4.1 客群偏移为什么离线AUC 0.8上线三个月变成0.6这是风控模型最经典的一记闷棍。模型在历史样本上训练和验证但训练时数据是“过去的人”上线后面对的是“未来的人”。市场政策一变、渠道换了、产品定价调整、节假日前后客群结构波动都会导致今天的客群和训练样本长得不太一样。这种差异就叫客群偏移。我见过一个真实案例。某个分期产品换了一批投放渠道新渠道进来的客群收入更高但多头借贷比例也更高模型的旧特征权重完全没跟上上线首月AUC就只有0.65。团队一开始还以为是模型上线操之过急后来把训练集和线上近一个月样本的特征分布一对比好几个特征的PSI超过0.2才知道是客群漂移了。应对的办法很简单训练模型时一定要做时间外验证OOT用t月之前的数据训练t3或t6月验证上线后定期监控特征分布和模型分数分布的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.81KS从0.32涨到0.36怎么看都是全面碾压。团队高高兴兴上线三个月后一算坏账率没降通过率还降了两个点利润反而亏了。复盘时发现三个问题叠加。第一新模型把一部分“会短期逾期但最终还清”的高息客群识别成了高风险并拒绝这批人其实是利润的重要来源第二坏样本口径是“逾期90天”但催收团队加强了早期介入很多90天口径的“坏账”其实催收后能收回大部分本金模型把能被催收回来的客户也当坏客户学错了目标第三AUC提升主要来自老客群新客群上的区分度几乎没变但当时只看了总体AUC没有分客群验证。这个案例最扎心的地方在于所有常规离线指标都在说“模型变好了”但业务损益在说“你把它换上来亏了”。从那时起我就养成了一个习惯模型评估的最终输出不是一串分数而是一张损益对比表——旧模型和新模型在各自最优阈值下通过率、坏账率、利润各是多少。指标是用来解释损益的不是拿来当KPI的。5.2 一份可以直接抄的评估流程上完这堂课后面我在团队里把模型评估固化成了下面这组流程新人照着走基本不会漏先和业务对齐目标这次升级是为了降坏账、提通过率、还是控成本目标不同评估指标的权重就不同。定好样本口径好坏客户怎么定义表现期多久样本区间是否跨完整业务周期。划分训练、验证和OOT三个样本集严禁随机切分代替时间外验证。跑核心指标组Accuracy、Precision、Recall、F1、PR-AUC、AUC、KS全部注明阈值和样本范围。分客群看表现新客/老客、主力渠道/新渠道分开算别让总体平均值掩盖局部失明。画分数-坏账率单调性图确认高分段坏账率低于低分段。做损益模拟在期望坏账率约束下找阈值比较新老模型的通过率、坏账率和利润。上线后先以冠军-挑战者模式小流量并行监控PSI、通过率、坏账率设置自动回滚条件。这套流程看起来繁琐但能挡掉大多数“离线很美、上线翻车”的问题。我见过太多团队死在第二步和第三步标签没对齐、OOT没做就敢上线出问题后又回头怀疑模型算法选型其实根本不是算法的问题。说实话写了这么多年评分卡我越来越觉得模型评估不是一门“算指标”的手艺而是一门“翻译业务”的手艺。每个数字背后都要能回答一个问题对业务损益意味着什么。下次再有人拿着“80%准”来找你不用急着争执就问三句话召回率多少阈值定在哪儿按这个阈值过一遍坏账率和利润会怎样变化能把这三个问题答清楚的模型才是可以放心上线的模型。