假设你是一家银行的信贷主管,手底下有位老练的审批官小王。他每天给贷款申请打分,决定谁可以借、谁该拒。但你心里一直有个疑问:小王真的能分清好客户和坏客户吗?他会不会今年看人的标准和去年不一样?要是经济危机来了他还扛得住吗?隔壁部门推荐了更年轻的小李,到底该不该换人? 风控模型评估,就是给小王——也就是风控模型——做一场全面体检。体检项目包括:测体能(KS 值、AUC,看区分好坏客户的能力)、量血压(PSI,看评分分布稳不稳)、做极限挑战(压力测试,看极端经济场景下会不会崩)、长期随访(衰退监控,看部署后有没有老化),最后还要给一份“换不换人”的决策建议(模型迭代评估)。这篇文章,我们就跟着体检医生走完整个流程,把风控模型的家底摸个明明白白。
掌握这套评估体系,你能在信贷、消金等场景中独立完成模型上线前验收、上线后监控与迭代决策,成为真正“懂业务”的风控 AI 工程师。
可视化演示
展示KS值区分度评估、AUC/ROC排序能力分析、及PSI稳定性监控与阈值判定。
本节配有交互动效(进入视口后自动加载,约 3KB)。
评估框架概览
去体检中心,第一步不是抽血,而是跟前台领一张套餐单:查心肺、查血脂、查骨密度、查耐力……先定项目,再谈结果。风控模型评估也是一样,动笔算指标之前,得先搭好“评估框架”:要量哪些维度、用什么样本、在哪个时间窗口量。我们的主角小王,就是那台已经在信贷线上干了一阵子的风控模型,每天给每个申请人打一个风险分。
评估框架首先要回答三个问题:第一,小王能不能把“会还钱的”和“会赖账的”分开?这叫区分能力,对应 KS 与 AUC。第二,他的打分口径会不会随着时间漂移?这叫稳定性,对应 PSI。第三,极端情况下他会不会崩盘?对应压力测试。这三个问题,就像体检单上的“体能、血压、极限耐力”三大项。评估样本也有讲究:不能用训练时见过的人,要用“没见过的新面孔”,专业叫 OOT(时间外样本),模拟模型面对未来客户的表现。
评估指标都建立在“模型预测 vs 真实结果”的对比上。把预测结果与真实结果交叉,可以得到四类人:预测坏且实际坏的 TP,预测好但实际坏的 FN(漏网之鱼),预测坏但实际好的 FP(误伤好人),预测好且实际好的 TN。基于这四类,我们定义两个基础指标:
有了这张“套餐单”和两个基础指标,后面的 KS、AUC、PSI 都只是在此之上层层加码的专项检查。医生不会一上来让你跑十公里,而是先量好基础体征,再逐项深入。下一站,先测小王的“折返跑”——KS。
- 真正例 TP模型预测为坏、且实际确实是坏的客户数,是模型抓对的“坏人”。
- 假负例 FN模型预测为好、实际却是坏的客户数,是最危险的漏网之鱼。
- 真阳率 TPR被抓到的坏人占全部坏人的比例,衡量模型的“抓坏能力”。
- 假阳率 FPR被误判为坏的好人占全部好人的比例,衡量模型的“误伤程度”。
区分能力指标 KS
体检第二站是操场。体育老师让小王做折返跑:从起点出发,每 10 米放一个标志桶,看他跑到第几个桶时体能跟不上。对应到模型评估,我们把所有客户按风险分从低到高排成 10 个“桶”(分箱),每经过一个桶,数一数“好客户累计占比”和“坏客户累计占比”分别累积到多少,两条累积曲线的最大垂直距离,就是 KS 值。
KS 的全称是 Kolmogorov-Smirnov 统计量,脱胎于统计学里的两类分布比较。用在风控里,它回答一个特别直观的问题:“好客户”和“坏客户”这两拨人,在分数轴上到底分得开吗?如果两组人的分数完全重叠,KS 接近 0;如果低分段全是好客户、高分段全是坏客户,曲线会迅速拉开,KS 就高。计算分四步:先按风险分从低到高切成 10 组,然后计算每组坏客户占比,接着对每个分箱求好、坏累计占比的差的绝对值,最后取最大值:
行业经验一般这样判断:KS 小于 0.2,模型区分能力弱,基本没法用;0.2 到 0.4 是合格水平;0.4 到 0.5 算优秀;要是超过 0.75,别高兴太早,大概率是过拟合或数据泄漏,就像百米跑出 5 秒的成绩,先怀疑秒表坏了。回到折返跑:小王在第 6 个桶拉开最大差距,说明他“爆发力”够强——分数越高的客户,坏账概率越明显。但折返跑只记录了单点最强,万一他只是某个拐点猛一下呢?这就带出下一个项目:综合跑圈判定——AUC。
- 分箱编号把分数从低到高切成 n 个档位,i 表示第几个档。
- 坏客户累计占比分数落在前 i 档的坏客户数,占全部坏客户的比例。
- 好客户累计占比同理,分数落在前 i 档的好客户数占全部好客户的比例。
- 取最大差值逐个分箱比较两条累计曲线的高度差,取绝对值最大者。
排序能力指标 AUC
体育老师看完折返跑,又让小王跑一圈 400 米,全程记录配速。KS 看的是“最远那一点”,AUC 看的是“整条曲线的平均战斗力”。对应到模型评估,我们把每一个分箱都变成一个坐标:横轴是假阳率 FPR(误伤好人的比例),纵轴是真阳率 TPR(抓住坏人的比例),把每个阈值下的这两个值连成一条 ROC 曲线。
ROC 曲线下的面积,就是 AUC(Area Under the Curve)。它有一个特别直觉的概率解释:随机抽一个好客户和一个坏客户,AUC 等于模型给好客户的风险分高于坏客户的概率。如果模型是瞎猜,AUC = 0.5,相当于抛硬币;如果能完美区分,AUC = 1:
实际业务中,AUC 0.7 到 0.8 是常见良好区间,0.85 以上已属优秀,逼近 0.95 就要警惕过拟合。KS 和 AUC 是“同一条 ROC 曲线上两种看法”:KS 对应 ROC 曲线上离对角线最远的那个点,看的是最强单点;AUC 看的是整条曲线下方的面积,代表全程平均。小王的 400 米平均配速(AUC)和折返跑最远点(KS)都过关,说明他“看人的眼力”确实稳定在线。可问题又来了:你今天体能好,不代表下个月身体不亮红灯。下一站,量血压——PSI。
- 随机成对抽样从验证集里随机抽一个好客户和一个坏客户,分别记下他们的模型分数。
- 比较分数计算好客户分数大于坏客户分数这一事件发生的概率。
- 解读区间AUC 越接近 1,好客户排在坏客户前面的概率越高,排序能力越强。
稳定性指标 PSI
体检第三站,护士给小王绑上血压计。一个运动员光有爆发力不够,如果血压忽高忽低,照样上不了赛场。风控模型也一样:模型上线时把评分分布调得很漂亮,半年后客群结构一变,打分整体偏移,原本设好的审批线就不再可靠。衡量这个“血压漂移”的指标,就是 PSI。
PSI 全称 Population Stability Index(群体稳定性指数),它比较“现在这批客户的分数分布”和“建模基准期的分数分布”有多不一样。计算时,先把基准期分数分布按十分位切箱,得到每个箱的预期占比 E_i;再用同一套箱边界统计当前实际占比 A_i;逐箱比较两者偏差后汇总成一个数字:
阈值判断通常这样用:PSI 小于 0.1,分布稳定,安心观察;0.1 到 0.25,出现漂移信号,需要排查原因;大于 0.25,严重漂移,模型基本要回炉重造。监控频率一般是按月或按季计算,和财务报表节奏对齐。量完血压,小王松了口气。但医生还想知道:如果让他背 100 斤沙袋爬十层楼,他顶不顶得住?这就是下一项——压力测试。
- 实际占比当前月份落在第 i 个分数箱的客户数,占总客户数的比例。
- 预期占比建模基准期同样落在第 i 箱的比例,是“健康基线”。
- 逐箱偏差贡献每个箱子的占比差乘以对数比,方向无关,但贡献可正可负。
- 汇总求和把所有箱子的贡献相加,得到整体漂移量 PSI。
压力测试方法
体检第四站是“极限运动评估”。医生让小王背上一袋沙袋,在跑步机上把坡度推到 20 度、速度拉到 15 公里/小时,看他心率飙到多少、会不会当场倒下。风控里的压力测试,就是模拟宏观环境剧烈恶化——GDP 增速突然掉头、失业率翻倍、房价断崖——再把模型预测的坏账率顶到极限,看银行扛不扛得住。
压力测试不是拍脑袋喊一句“天要塌了”,而要设计一整套量化情景。实践中分轻、中、重三档:轻度情景宏观小幅走弱,中度情景出现区域性经济衰退,重度情景模拟系统性金融危机。然后把宏观因子(GDP、CPI、失业率、房价指数)的变动量输入模型,观察违约概率 PD 被推高多少。一个常见的简化公式:
压力测试还包括集中度测试:如果客群集中在某个行业(比如教培、地产),该行业爆雷时客户会整体承压,即使宏观指标看似平稳。测试做完不能只写报告,要有应对预案:压力 PD 击穿资本缓冲,就要提高审批门槛、压降通过率、增加拨备。极限测试做完,小王虽然气喘吁吁,但指标还在安全线内,医生给他打了“合格”。不过体检还没结束——光靠一次检查不够,医生要求他每季度回来复查,连续跟踪身体曲线。这就是模型衰退监控。
- 基准违约率模型在正常宏观环境下预测的违约概率,是压力的起点。
- 宏观冲击幅度压力情景中宏观因子的变动量,比如 GDP 增速下降 3 个百分点。
- 敏感性系数违约率对宏观因子的敏感程度,通常由历史数据回归得到。
- 压力下违约率基准违约率乘以冲击放大因子,得到承受宏观冲击后的违约概率。
衰退监控机制
体检第五站是建档随访。医生说:“小王啊,你今天达标不代表永远达标,每季度回来复查一次,我要看你的指标有没有悄悄变差。”风控模型上线后也是这样:真实客群、外部环境、欺诈手段都在变,模型性能会慢慢“衰老”——分数分布漂移、排序能力下降、坏账率抬头。衰退监控,就是给模型挂上一套“长期健康档案”。
监控聚焦三类信号:第一,PSI 是否持续走高(分数分布漂移);第二,KS 或 AUC 相比上线时是否明显下滑(区分能力衰退);第三,实际逾期率、坏账率是否超过设定警戒线(业务结果恶化)。监控平台一般按月或按季自动计算这些指标,并生成趋势曲线。当需要判断当期坏账率与基准坏账率是否有统计意义上的显著差异时,常用两个比率的 Z 检验:
触发预警后不能盲目重训,要先分层排查:是数据源断裂(特征缺失导致打分失真)、客群结构变化(进件渠道换了),还是模型真的老化?再决定是重训练、修正特征,还是临时加人工审核。半年后,医生翻出小王的健康档案,发现他的 PSI 连续两月超过 0.15,血压开始忽高忽低。医生说:“先别急,我们把备选审批官小李也叫来,做一次全面对比,看要不要换人。”这就引出了最后一项:迭代评估决策。
- 基准坏账率模型上线验收期的平均坏账率,作为“健康基线”。
- 当期坏账率监控窗口内的实际坏账率,和基线对比看有没有恶化。
- 监控样本量当期客户总数,样本越大,统计结论越可靠。
- Z 值判定当 Z 的绝对值大于 2.58,说明当期坏账率显著偏离基线,触发预警。
迭代评估决策
体检终审环节,医生面前摆着两份档案:在职的小王,和候选的小李。要不要把审批工作从老王手里转交小李?医生不会只看小李单方面多优秀,而要让他俩做同一套体检,对比“体能、血压、极限耐力”三项成绩,再决定是否转正。模型迭代评估遵循同样的逻辑:新模型(挑战者)必须跑完与旧模型(冠军)完全相同的评估流程——同样的 OOT 样本、同样的 KS/AUC/PSI 计算——然后综合打分,而不是只看 AUC 涨了多少。
一个实用的决策公式,是在区分度与稳定性之间做权衡:
上线流程也有讲究:先小流量灰度(比如 5% 的流量给新模型),跑冠军挑战者 A/B 测试,确认 KS、PSI 都稳定后再逐步放量,同时保留一键回退机制——一旦新模型在灰度期 PSI 飙升,立刻回滚。最后,小李以微弱优势胜出,但医生仍然在他的档案上备注:“每季度复查,一旦指标恶化,随时启用替换预案。”评估从来不是一次性的判刑,而是贯穿模型全生命周期的持续守护。这,才是风控模型评估的真正意义。
- 候选模型集合旧模型和新模型组成备选池,逐一打分。
- 区分度得分AUC 衡量排序能力,越高代表区分能力越强。
- 稳定性惩罚PSI 衡量分布漂移,越大越不稳定,乘上惩罚系数 λ 扣分。
- 综合决策选择“区分度 − 稳定性代价”最大的模型作为新冠军。
AI 应用场景
消费信贷模型上线前验收
阶段:模型开发与验证
解决的问题:传统上只看“准确率”就决定上线,忽略了样本外漂移,导致模型上线即崩。AI 验证团队用 OOT 样本 + KS/AUC/PSI 三重体检,量化判断模型是否具备上线资格,相当于给审批官做“入职体检”。
具体案例:某消费金融公司开发新申请评分卡,训练集 AUC 达 0.83,但 OOT 样本 PSI 高达 0.31,说明近半年客群结构已变。验证团队拒绝上线,回炉做特征校准后 PSI 降至 0.09,才通过验收正式投产。
贷中模型衰退监控告警
阶段:模型部署与监控
解决的问题:模型上线后真实环境不断变化,人工抽查滞后,衰退信号难以及时发现。AI 监控平台自动计算月度 PSI、KS 衰减与坏账率 Z 统计量,一旦超阈值就生成预警工单,相当于给模型建立“季度体检档案”。
具体案例:某银行信用卡模型上线 8 个月后,月度 PSI 从 0.07 跳升至 0.22,系统自动告警。风控团队排查发现某线上渠道进件客群异常,紧急关停该渠道并启动模型重训流程,避免了坏账持续扩大。
模型版本切换的冠军挑战者实验
阶段:模型迭代与上线
解决的问题:新模型“感觉更好”却不敢直接替换,怕系统性翻车。AI 团队采用挑战者小流量灰度,用决策评分公式做量化对比后再放量,全程保留回退预案,相当于“先试用再转正”。
具体案例:某互金平台新模型 AUC 提升 0.03,但 PSI 同时上涨 0.08,按决策公式综合评分后建议“谨慎切换”,先以 5% 流量灰度两周,确认 KS 稳定后再逐步放量至 100%,并保留一键回滚脚本。
Python 演示
import numpy as npimport pandas as pd def ks_score(y_true, y_pred): """计算 KS 统计量:按预测分排序,累计好坏占比最大差""" df = pd.DataFrame({"y": y_true, "score": y_pred}) df["bin"] = pd.qcut(df["score"], 10, duplicates="drop") g = df.groupby("bin", observed=True).agg( bad=("y", "sum"), total=("y", "count") ) g["bad_cum"] = g["bad"].cumsum() / g["bad"].sum() g["good_cum"] = (g["total"] - g["bad"]).cumsum() / (g["total"] - g["bad"]).sum() ks = (g["bad_cum"] - g["good_cum"]).abs().max() return round(ks, 4) def psi_score(expected, actual, bins=10): """计算 PSI:实际分布 vs 预期分布的分箱偏移""" edges = np.percentile(expected, np.linspace(0, 100, bins + 1)) exp = np.histogram(expected, bins=edges)[0] / len(expected) act = np.histogram(actual, bins=edges)[0] / len(actual) exp = np.clip(exp, 1e-6, None) act = np.clip(act, 1e-6, None) psi = np.sum((act - exp) * np.log(act / exp)) return round(psi, 4) if __name__ == "__main__": rng = np.random.default_rng(42) n = 5000 y = rng.binomial(1, 0.15, n) score = rng.normal(50, 15, n) + 25 * y print("KS =", ks_score(y, score)[0]) actual = score + rng.normal(3, 8, n) print("PSI =", psi_score(score, actual))
df["bin"] = pd.qcut(df["score"], 10, duplicates="drop")把客户按风险分切成 10 档,让每组人数大致相等。g = df.groupby("bin", observed=True).agg(bad=("y", "sum"), total=("y", "count"))统计每个分数档的坏客户数与总人数,分箱聚合。g["bad_cum"] = g["bad"].cumsum() / g["bad"].sum()坏客户累计占比,KS 计算的核心一步。ks = (g["bad_cum"] - g["good_cum"]).abs().max()两条累计曲线的最大垂直距离就是 KS。edges = np.percentile(expected, np.linspace(0, 100, bins + 1))用基准分布的分位数做箱边界,保证分箱口径一致。act = np.histogram(actual, bins=edges)[0] / len(actual)统计当前期各箱的实际占比 A_i。psi = np.sum((act - exp) * np.log(act / exp))逐箱偏差求和,得到 PSI 漂移量。
常见误区
误区我觉得 KS 当然是越大越好,最好到 0.8,说明模型把好坏客户完全分开了,多有成就感。
正解KS 超过 0.75 通常不是能力强,而是过拟合或数据泄漏的警讯。真实业务里好坏客户的特征本就有重叠,0.4 到 0.5 已是优秀水平。就像一个人百米跑出 5 秒,几乎不可能是真人,大概率是秒表坏了。看到超高 KS,第一反应应该去查训练集和验证集有没有信息泄露,而不是欢呼。
为何常见:人们容易把“区分度”直接等同于“模型好”,却忘了指标是建立在训练数据的假设之上的,数据一旦有泄漏,指标就是海市蜃楼。
误区AUC 已经很高了,模型排序没问题,PSI 是什么无所谓,上线后效果自然会好。
正解AUC 只衡量相对排序,完全不看绝对分数是否漂移。如果客群整体资质变好,分数整体下降,AUC 可能依然很高,但审批拒绝线彻底失效——以前 650 分可以放款,现在 650 分都是优质客户,系统还在按老线拒绝。就像你的跑步速度没变,但跑道被偷偷加了坡度,配速表已经失真了。
为何常见:把“相对排序”和“绝对分数”混为一谈。PSI 盯的恰恰是绝对分数的分布,两者是尺子的两个刻度,缺一不可。
误区我随机抽 20% 的样本做验证集,AUC 0.8 就能上线了,干嘛非要搞时间外样本那么麻烦?
正解随机切分会让训练集和验证集来自同一时间段,验证结果会系统性高估真实表现。风控模型面向的是“未来”的客户,必须用时间外样本(OOT)模拟未来:用过去的数据训练,用更晚时期的数据验证,才能检验模型在时间维度上的泛化能力。省掉这一步,等于体检时让病人自己报体重,报多少全凭自觉。
为何常见:直接原因是图省事,深层次原因是忽视了“时间顺序”在风控中的致命作用——模型是要预测明天的风险,不是复盘昨天的数据。
误区压力测试不就是把坏账率乘以 2 倍、3 倍吗?反正金融危机很久没来了,写个报告交差就行。
正解监管和内部管理要求的压力测试,需要明确宏观情景假设、传导路径、敏感性系数,测完还必须有资本或策略预案。比如测算 GDP 下降 3% 时 PD 会上升多少、资本充足率会不会跌破红线、要不要提前压降某个行业敞口。否则就像医生只对病人说“你有可能病危”,却不开任何处方,病人除了焦虑什么都得不到。
为何常见:压力测试平时不出险,容易被当成“纸上谈兵”的形式主义;而做一次真正的压力测试需要跨部门输入很多假设,人的惰性会倾向于用简单粗暴的数字糊弄过去。
面试题
Q1. KS 统计量在风控中表示什么?
- A.模型预测概率的校准程度
- B.好坏客户累计分布的最大距离← 正确答案
- C.全部样本的预测准确率
- D.样本总体的违约率水平
答案:B。KS 是好客户累计占比与坏客户累计占比之差的绝对值的最大值,衡量区分能力。A 说的是校准度,C 说的准确率,D 说的样本违约率,都与 KS 无关。可以把它想象成“两类人分数分布的最近重时最远距离”。
Q2. AUC 等于 0.5 时表示什么?
- A.模型完美区分好坏客户
- B.模型与随机猜测没有差异← 正确答案
- C.模型完全反向预测
- D.模型出现严重过拟合
答案:B。AUC 等于 0.5 时,随机抽一个好客户和一个坏客户,好客户得分更高的概率只有一半,和抛硬币没有区别。A 中完美区分对应 AUC 接近 1,C 对应 AUC 接近 0,D 则通常表现为 AUC 在训练集与验证集差异巨大。
Q3. PSI 大于多少通常表示评分分布严重漂移?
- A.0.05
- B.0.1
- C.0.25← 正确答案
- D.0.5
答案:C。行业惯例是 PSI 小于 0.1 为稳定,0.1 到 0.25 需要关注,大于 0.25 属于严重漂移,模型需要重新训练。0.05 太宽松,0.5 已经属于完全变了个客群,等跌到这程度再干预就晚了。
Q4. 风控模型上线后的衰退监控,通常关注哪些指标?
- A.PSI 群体稳定性指标← 正确答案
- B.KS 区分能力衰减← 正确答案
- C.实际逾期率水平← 正确答案
- D.营销点击转化率
答案:ABC。衰退监控要盯三类信号:分布漂移(PSI)、区分能力衰退(KS/AUC)、业务结果恶化(逾期率)。营销点击转化率属于运营指标,与风控模型好坏无直接关系,属于干扰项。
Q5. KS 与 AUC 的关系是?
- A.两者数值上完全相等
- B.KS 对应 ROC 最远点之差← 正确答案
- C.两者是平方与开方
- D.两者完全互不相关
答案:B。KS 是 ROC 曲线上离对角线最远的那个点对应的纵坐标与横坐标之差,可理解为“AUC 整条曲线上区分力最强的单点”;AUC 是整个曲线下面积,代表平均排序能力。因此两者相关但不等同,也不存在平方关系。
Q6. 风控模型压力测试的正确做法包括?
- A.设计轻度、中度、重度情景← 正确答案
- B.量化宏观因子冲击并传导← 正确答案
- C.做行业集中度风险检验← 正确答案
- D.直接删除全部历史坏样本
答案:ABC。压力测试要设置分档情景、量化 GDP 等宏观因子冲击、检验行业集中度风险,最后还要有应对预案。D 删除坏样本是数据清洗手段,与压力测试毫无关系,属于混淆项。
Q7. 使用 OOT(时间外样本)验证的主要目的是?
- A.提升训练集上的精度
- B.检验跨时间泛化能力← 正确答案
- C.减少模型特征数量
- D.完全替代线上测试
答案:B。OOT 用更晚时期的数据验证用过去数据训练的模型,模拟“预测未来”的真实场景,检验模型在时间维度上的泛化能力。A 是训练集目标,C 是特征筛选,D 说得太绝对——线上测试仍然必要。
Q8. 模型衰退监控中,月度 PSI 达到 0.15 时应该?
- A.立即下线该模型
- B.发出预警并排查漂移原因← 正确答案
- C.忽略不管继续观察
- D.强制进行重新训练
答案:B。0.15 处于 0.1 到 0.25 的关注区间,正确的做法是预警并排查:是数据源断了、客群结构变了,还是模型真的老化?A 直接下线过于激进,C 放任不管可能酿成大损失,D 强制重训则应该等排查完再决定。
Q9. 模型迭代评估中,冠军挑战者策略的正确做法包括?
- A.新旧模型并行小流量测试← 正确答案
- B.挑战者灰度试运行← 正确答案
- C.挑战者全量直接替换
- D.保留一键回退机制← 正确答案
答案:ABD。冠军挑战者策略的核心是“先小范围验证再逐步放量”:并行测试、灰度试运行、确认稳定后逐步放大流量,同时必须保留回退机制。C 全量直接替换违背了灰度原则,一旦新模型出问题会造成大范围风险。
Q10. 混淆矩阵中真阳率 TPR 的计算公式是?
- A.TP/(TP+FP)
- B.TP/(TP+FN)← 正确答案
- C.FP/(FP+TN)
- D.TN/(TN+FP)
答案:B。TPR 是“被抓到的坏人占全部坏人的比例”,分母应该是 TP 加 FN,即所有真实坏客户。A 的分母是预测为坏的全体,那是精确率 Precision;C 是假阳率 FPR;D 的表达式也没有对应标准指标。