1. 建模前的整体思路与目标定义
做信用评分模型这件事,不少人一上来就急着找数据、跑特征、调参,结果模型做出来漂亮得很,KS到0.4,AUC到0.8,真到了业务侧一用就傻眼——审批通过率掉了、坏账没降多少、业务方天天来问“你这模型到底在干嘛”。说实话,我过去几年里踩过的坑,几乎有一半都是因为建模前没有把目标和口径想清楚。
所以我在带项目时,第一步永远是先逼自己回答三个问题:这个模型给谁用?用在什么场景?好和坏怎么定义?以信贷审批场景为例,模型通常服务于贷前准入、额度定价或者贷中监控这几个环节,不同环节对模型的要求差异非常大。贷前模型追求的是排序稳定、区分度够用就行,但额度模型还得兼顾定价的敏感性,贷中模型则更看重时间衰减的容忍度。如果这些前置问题没理清,后面做得再花哨也是徒劳。
1.1 核心需求拆解:先定Y,再定X
信用评分模型的本质是一个二分类问题:客户是好客户还是坏客户。但就这么一个看似简单的问题,真正落地时几乎每个团队都会吵几轮。Y的定义直接决定了模型的业务含义,也决定了后面所有样本、特征和验证工作是否站得住脚。
最常用的定义方式是“滚动观察法”:在观察点之后设定一个表现期,比如6个月或12个月,客户在此期间内逾期超过一定天数(常见的是逾期30天以上或90天以上)就标记为"坏客户"。还有一个核心参数叫“最少逾期金额”,比如100元或者200元,防止因为几块钱的欠款就把整个客户打成坏客户,那会把模型带偏的。我见过不少新手团队在Y定义上比较随意,逾期天数选15天、金额选50元,结果模型做出来区分度特别高,但上线后坏账完全没压住。原因很简单:你把一堆"非恶意短期忘还款"的人划成了坏客户,模型努力学习的其实是"谁更容易遗忘账单",而不是"谁真的还不起钱"。
另外还要决策观察期长度。观察期通常取12到24个月,既要有足够长的历史特征来刻画客户行为,又要避免数据太老、客户状态已经发生重大变化的情况。观察点之前的数据叫特征窗口,之后的数据叫表现期窗口,这两个窗口的时间边界必须严格互斥,不然就构成特征泄漏。
举一个实际案例:某消金公司在做首贷授信模型时,把坏客户定义成"首期账单逾期超30天",结果模型在贷前环节的KS只有0.2,但在贷后催收端的表现反而很好。后来复盘发现,首期逾期更多反映的是客户对还款流程不熟悉、绑卡失败等操作问题,跟信用风险关联度没那么强。调整Y定义为"任意一期账单逾期超60天,且累计逾期金额大于200元"后,模型的KS提升到了0.35。这就是Y定义的分量。
1.2 样本选择与时间切分:别让数据偷走你的模型效果
确定了Y定义,接下来就是样本选择。这块最容易被忽视,但恰恰决定了模型的泛化能力。我在做样本切分时遵循一个原则:训练集、验证集、测试集的时间窗口必须严格按时间顺序切分,而不是随机打乱。
为什么不能随机打乱?因为信贷数据有强烈的时间趋势——宏观环境在变,客户结构在变,产品政策也在变。如果随机抽样,训练集和测试集里混着不同时间周期的样本,模型等于被剧透了未来信息,离线验证效果会虚高,上线后实际表现却会明显回落。通常的做法是:用2022年1月到2023年6月作为样本观察期,其中前75%的时间窗口做训练集,紧接着的15%做验证集,最后10%做测试集。这里验证集主要用于调参和阈值选择,测试集只做最终一次性评估——千万别拿测试集来回调,调着调着测试集就变成了训练集,最终评估结果就失去了参考意义。
样本量也是一道坎。做评分卡时,每个分箱里的样本量最好不少于30个坏客户,否则WOE值波动会非常大。总样本量的经验门槛是:好客户与坏客户合计不低于10000条,且坏样本率不低于3%到5%。如果坏样本太少,优先考虑把Y定义适当放宽(比如逾期天数从90天降到60天),或者使用过采样手段,但过采样只建议在训练集上做,验证集和测试集必须保持真实的坏样本率,否则模型分数分布和实际分布完全对不上。
2. 特征工程与数据预处理:模型的底层建材
评分卡模型之所以在银行和持牌金融机构里长盛不衰,一个重要原因就是它对特征的可解释性要求极高。建模时不太建议直接把手头的几百个原始字段一股脑塞进模型,而是要先做一轮系统的特征工程。特征工程的质量决定了模型效果的上限,而模型只是逼近这个上限。
2.1 特征分类与构造逻辑
信用评分模型里的特征大致分三类:基础信息类(年龄、性别、婚姻、学历、居住稳定性)、信贷行为类(征信查询次数、历史逾期记录、负债收入比、信用卡使用率、贷款余额)、第三方数据类(多头借贷、消费行为画像、电商和社交行为标签)。
从实操角度来看,信贷行为类特征的信息价值通常最高。举个典型例子,信用卡使用率(当前余额除以授信额度)在经验上是一个区分度极强的特征——使用率超过80%的人群,坏账率通常是使用率低于30%人群的3到5倍。它的业务解释也清晰:长期高额度占用往往反映客户资金链紧张。
特征构造这块我有两个建议。第一,要重视时间衰减特征。别只看客户最近一个月的表现,要看"近3个月/近6个月/近12个月"的维度变化。比如"近6个月查询次数"和"近3个月查询次数"的比值,能反映出客户是不是近期才开始密集借贷,这类趋势特征比静态值更具前瞻性。第二,构造特征时一定要控制衍生特征的复杂度,连乘、连除的特征很容易过拟合,而且在后续做解释时自己也说不清。
2.2 缺失值与异常值处理:别上来就填均值
缺失值处理是特征工程里最"脏"的活,也是模型效果差异的重要来源。对于信用评分模型,缺失值本身往往带有信息——比如一个客户没有信用卡记录,可能是因为他从未使用过信用卡,也可能是因为征信白户。这两种情况背后对应的风险是完全不同的。因此,我不太建议直接把缺失值全部填充成均值或者中位数,更推荐的做法是把缺失单独作为一个分箱处理。在后续分箱过程中,缺失值可以自然聚合到某个类别中,让数据自己说话。
异常值方面要格外小心。信用评分领域有一些天然的业务阈值,比如年龄、收入、负债率等,这些字段的异常值不能机械地按百分位截断处理。举个例子,一个客户的月收入填了100万,在统计学上肯定是异常值,但在业务上可能就是一个高净值客户,直接截断反而丢失了重要信息。实操中我会把跟收入、资产相关的字段单独出来做人工审视,仅对明显不合逻辑的记录(比如年龄小于18岁、负债率为负值)做剔除。
2.3 数据清洗的现场实录
之前做某电商平台消费分期模型时,我们遇到过一个典型问题:大量用户在申请时授权了电商消费数据,但实际消费行为稀疏,超过六成用户过去一年只有1到2笔消费。如果直接把这些字段放进模型,缺失率高、分布极端,很容易被模型当作噪声处理。
我们当时的处理方式是,先把消费行为拆成两部分:是否有消费行为(布尔特征)和行为密度(消费金额、频次的百分位排名)。这两类特征在业务解释上各有侧重,前者刻画"客户是否活跃",后者刻画"活跃客户的消费水平分层"。拆分之后再进分箱和WOE转换,特征稳定性和区分度都有了明显提升。
3. 模型开发与评分卡构建:从逻辑回归到分数刻度
信用评分模型最经典的载体就是评分卡,而评分卡背后的算法核心通常是逻辑回归。为什么逻辑回归在深度学习如此普及的今天仍然是信贷模型的主流?原因不外乎三点:训练成本低、预测结果可解释、监管审计友好。尤其对于需要向客户解释拒绝原因、满足合规要求的机构来说,逻辑回归天然自带的系数权重可以直接对应到每个特征的贡献度,这是黑盒模型很难替代的。
3.1 分箱与WOE编码:把连续变量变成有业务含义的离散变量
在建模之前,连续型特征需要先做分箱(离散化)。分箱说起来简单,但这里面的讲究其实很多。常用的分箱方法有等频分箱、等距分箱、决策树分箱,以及基于卡方检验的最优分箱。我在信用评分项目中用得最多的是卡方分箱(ChiMerge)加人工调优的组合方式,原因在于纯机器分箱容易产出一些业务上无法解释的切点,比如"年龄在27.3岁以下",这在实践中根本没法落地。
分箱之后就是WOE编码。WOE的全称是Weight of Evidence,中文通常叫证据权重,它衡量的是"某个分箱中的坏客户占比与好客户占比之间的差异程度"。公式是WOE = ln(坏客户占比 / 好客户占比)。需要说明的是,国内不同团队对分子分母的定义习惯不太一样,有的用坏客户做分子,有的用好客户做分子,但只需保证整个项目中口径一致即可,因为逻辑回归的系数符号会随之自适应调整。
计算IV值(Information Value)来筛选特征也是这个环节的常规操作。IV值的经验判断标准大致是:小于0.02基本没有预测力,0.02到0.1之间预测力较弱,0.1到0.3之间预测力中等,大于0.3则要警惕过拟合。不过这个标准只是参考,具体还要结合业务场景来看。比如征信查询次数这个字段,IV值通常能到0.2到0.3,但如果一个特征IV值超过0.5,我反而会警觉——它可能泄漏了未来信息(比如把表现期的数据也计算进去了)。
3.2 逻辑回归的训练细节与参数选择
分箱和WOE编码完成后,模型训练本身就比较直接了。对逻辑回归来说,要重点处理两个问题:一是特征之间的多重共线性,二是样本不平衡。
多重共线性会直接影响系数估计的稳定性,导致模型上线后某个特征的权重发生大幅度波动。常用的判断指标是VIF(方差膨胀因子),经验上VIF超过10的特征建议做删除或合并。处理共线性时,我习惯用逐步回归加人工判断的方式,而不是单纯依赖统计指标——因为有时候两个看似高度相关的特征,在业务上却各自代表不同的风险维度,比如"负债率"和"月还款金额",都需要保留。
样本不平衡方面,如果坏样本率非常低(比如低于1%),可以考虑对训练集做SMOTE过采样或者对坏样本进行加权。逻辑回归本身对不平衡不敏感,但如果坏样本占比过低,模型分数会出现明显的"天花板效应"——好客户和坏客户的分数分布虽然拉开了差距,但绝对分数偏高,导致后续设定阈值时没有足够的区分空间。
训练完成后不要急着转评分卡,先看一下系数的正负方向是不是符合业务直觉。比如年龄特征的系数如果是正的(年龄越大风险越高),那就得回头查一下是不是分箱方向弄反了。这类错误我在实际项目里碰到过不止一次,往往都是数据口径的细节问题,排查起来很费劲。
3.3 刻度化:把概率映射到信用分数
逻辑回归输出的是违约概率p,但在实际业务中,风控人员习惯用的是整数分数,范围通常在300到850之间。从概率到分数的转换需要设定两个锚点:基准分数和比率翻倍刻度。
比较常用的设定是:当好坏比(好客户概率/坏客户概率,即(1-p)/p)为50比1时,基准分为600分;好坏比每翻一倍,分数增加20分。对应的公式是:
score = 600 + 20 × log2(odds / 50)
这里面的odds就是好坏比。通过这个公式,每个客户的概率都能映射到一个唯一分数。分数越高,坏客户概率越低,信用风险越小。如果希望分数低代表风险低,在公式上加一个负号就行,不少互联网金融机构习惯用"风险分"的表述形式,但本质是一样的。
刻度化完成后要重点检查一件事:分数分布是否单调地与坏账率对应。把测试集按分数段(比如每20分一档)分组,统计每个分数段的实际坏账率,理论上分数越高坏账率越低。如果出现中间某个分数段坏账率反弹,优先怀疑是某个特征分箱的WOE不单调导致的,需要回到分箱环节做人工调整。
4. 模型验证与上线监控:真正的较量从部署开始
很多团队在模型开发阶段热情高涨,但一到验证和监控就草草了事。实际上,模型上线后能否持续稳定地发挥作用,才是对建模水平最真实的检验。一个在离线测试集上KS达到0.4的模型,上线三个月后KS掉到0.15,这种事情并不少见。
4.1 区分度、排序性与校准度
模型验证阶段,主要看三类指标:区分度指标(KS、AUC、Gini)、排序性指标(Lift、分组坏账率单调性)、校准度指标(校准曲线、Hosmer-Lemeshow检验)。
KS值的计算方式是好客户累计分布与坏客户累计分布的最大差值。这个指标对模型区分能力很直观,但在实际使用中也有局限——它只取最大差值点,对分布的整体区分能力反映不充分。所以我会同时看AUC和Gini。AUC的经验参考是:0.7到0.8可以接受,0.8到0.9表现良好,高于0.9要怀疑有没有泄漏。Lift则更多用在营销场景,衡量模型筛选目标客户的能力是随机选取的多少倍。
校准度容易被忽略,但实际非常重要。信贷模型不仅要用分数排序客户,还要用分数对应的违约概率做损失预估和定价。如果模型预测的违约概率是5%的客户群体,实际坏账率却是8%,就算排序完全正确,定价和准备金计提也会产生偏差。校准度可以通过绘制校准曲线来检查:把客户按预测概率分桶,统计每桶的实际坏账率,两者应该基本落在45度线附近。
4.2 基于时间序列的验证:拒绝过拟合的照妖镜
除了常规的交叉验证,基于时间序列的回溯验证是我几乎每次都会做的额外功课。具体做法是:用历史某个时间段的样本训练模型,然后在后续多个时间窗口上分别做验证,观察模型的KS和AUC随时间的变化趋势。
这个方法能比较直观地暴露模型的稳定性问题。比如某模型在2022年训练的KS是0.35,到2023年还能保持0.32,但到2024年就跌到0.2以下,那么大概率是客群结构发生了漂移,或者某些特征与风险的关系已经发生变化。这种情况下,即使模型在当前的测试集上表现良好,也需要考虑进行版本迭代或特征调整。
另一种常见的验证方法是冠军挑战者模式。新模型开发完成后并不直接替换线上模型,而是与线上模型并行运行一段时间,通过实时对比两个模型在相同客群上的分数分布、审批通过率和实际逾期表现,确认新模型确实更优后再进行切换。这个方法虽然会增加一些开发和运维成本,但能最大程度降低上线风险。
4.3 上线后的PSI监控与阈值调优
模型上线后,监控的核心指标是PSI(Population Stability Index,群体稳定性指数)。PSI衡量的是模型分数的分布在不同时间段之间的偏移程度,计算方法是:对每个分数区段,计算当前期占比与基准期占比的差异,再按公式求和。
PSI的经验判断标准:小于0.1表示分布稳定,0.1到0.25之间需要关注,大于0.25则表示发生了显著漂移。当PSI超标时,先排查特征层面的变化:是某个重要特征的分布变了,还是客群结构变了,又或是外部宏观环境变了。排查思路是从分数贡献最大的特征开始,逐个对比特征分布的时间序列变化。
阈值调优也是一个持续迭代的过程。分数阈值决定了审批通过的截止线,阈值越高通过率越低、坏账率也越低,但过高的阈值会伤及业务量。调阈值时我会同时看通过率、坏账率、边际坏账率三个指标,找到业务收益和风险损失之间的平衡点。边际坏账率这个概念很好用——它衡量的是"在某个分数段新增通过的客户中,坏客户占比是多少"。当边际坏账率开始大幅高于整体平均坏账率时,继续降低阈值就不再划算了。
5. 常见问题与排查技巧实录
做信用评分模型这些年,我在不同项目里反复遇到过不少相似的问题,挑几个典型的写出来,给同行们做个参考。这些问题在教科书里很少被直接提起,但几乎每个人实际动手时都会撞上。
第一个问题是样本量充足但坏样本极少。某助贷平台做新客模型时,坏样本率只有0.8%,建模时无论怎么调参,模型区分度都很差。后来我们把Y定义从"逾期60天"放宽到"逾期30天",坏样本率提升到2.3%,建模效果才有了明显改善。但这里有个代价:Y放宽后,"坏客户"中混入了一些还款意愿尚可但还款能力暂时不足的人,模型对这类客户的分辨能力会有所下降。解决思路是放宽后加一个排除规则——将那些在后续表现期内还清欠款且6个月内没有再次逾期的客户从坏样本中剔除,实际上就是把"假坏客户"过滤掉。
第二个典型问题是特征分箱后WOE值方向与业务直觉不一致。有一次某个"学历"特征,分箱结果是"研究生及以上"的WOE值为正值,说明研究生群体的坏客户占比偏高。团队第一反应是数据错了,但检查后数据没错,后来发现原因是该产品主要面向蓝领客群,研究生学历在该产品中反而属于异常客群,样本极少且行为模式不稳定。这个案例提醒我们:WOE方向异常时,先检查样本量和业务场景匹配度,不要急着修正数据。
第三个值得说的是时间穿透问题。某征信类特征"近3个月贷款审批查询次数"在建模时IV值高达0.45,表现期超过12个月。看来看去,最后发现这个特征的计算窗口包含了表现期内的查询记录——也就是说,模型"看到"了客户在表现期内的查询行为,因为查询时间已经覆盖到了未来。这类问题在自动化特征平台里尤其容易发生,因为特征计算脚本的时间边界设置常常在迭代中被改动。排查方式是随机抽取一批客户,手工核对特征计算窗口内的原始数据,确保没有一条记录来自表现期。
最后再分享一个小技巧:在模型上线前的最终验证阶段,除了看KS和AUC这些常规指标,额外看一下跨时间窗口的分数迁移矩阵。把训练期和验证期的客户按分数段各分为10档,做一个10乘10的交叉表,看看训练期分到第3档的客户在验证期是否还集中在第3档附近。这个矩阵比PSI更能直观反映模型排序的稳定性。如果发现某些档位的客户大幅迁移,优先定位这些客户对应的特征变化,往往能快速找到模型漂移的根源。
做信用评分模型本质上是个不断做权衡的过程:区分度与稳定性、复杂模型与可解释性、通过率与坏账率、开发速度与验证严谨性。每个选择背后都有代价,而好的模型并不是统计指标最漂亮的模型,而是在业务环境里最耐用、最可靠的模型。希望这篇流程拆解能帮正打算入坑或正在坑里的同行们少走一些弯路。