ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

信用卡评分卡模型全流程实战:从逻辑回归到风控策略落地

信用卡评分卡模型全流程实战:从逻辑回归到风控策略落地 这批量做信用卡评分模型项目的时候我的第一反应是这绝对是互联网金融风控里最值得复盘的场景之一。机器学习算法本身不难难的是把业务问题翻译成建模问题再把模型结果翻译回业务语言。信用卡评分模型恰好把这两件事都占了尤其在一家数据质量参差不齐、样本量有限、业务节奏又快的互金公司里评分卡的落地过程基本等于把整个风控链路从零捋了一遍。这篇文章不打算讲太多教科书理论就按我当时实际动手的路子来。从评分卡的定位、特征工程里的分箱与WOE/IV计算、逻辑回归训练、评分刻度映射到上线后的监控与踩坑记录一整套流程都给你拆开讲清楚。适合刚入门机器学习、或者准备在互金风控领域找方向的同学也适合已经在做风控模型、但想系统梳理一遍评分卡流程的同行。1. 信用卡评分模型在互联网金融风控体系中的定位1.1 评分卡到底解决什么问题从A卡到C卡先理清评分卡这个概念。行业内常说A卡、B卡、C卡对应的是贷前、贷中、贷后三个环节。A卡Application Score Card是申请评分卡用在用户提交申请、尚未放款的阶段核心任务是判断“这个人该不该借、借多少、什么定价”。B卡Behavior Score Card是行为评分卡用在用户已经借款、处于还款周期内的时候主要盯用户的还款行为和额度使用习惯判断要不要提额、降额或者提前预警。C卡Collection Score Card是催收评分卡针对已经逾期的客户判断催收优先级和处置策略。我在这个项目里做的就是A卡。说得直白一点A卡的本质是一个排序工具把用户按违约风险从低到高排成一列然后业务方在队列上切一刀决定哪些人通过、哪些人拒绝、哪些人进入人工审核。这个“排序”能力靠的就是机器学习模型输出的违约概率或者更常见地说是评分卡算出来的一个分数。为什么互金平台这么依赖评分卡因为线上申请量太大人工审核的成本和速度都跟不上。比如一个现金贷产品一天进来几万笔申请每笔申请要在几十毫秒到几秒内给出决策不可能靠人去看。模型评分就是替代人工判断的自动化决策基础。而且评分卡给出的分数天然带有可比性同一个模型、同一个刻度今天申请的人跟三个月前申请的人可以直接横向比较这在监控客群变化、调整风控策略时特别有用。1.2 为什么选逻辑回归而不是XGBoost或者深度学习做评分卡的时候第一个被问到的问题就是机器学习模型那么多为什么行业内默认用逻辑回归我在这个项目里确实也对比过XGBoost和LightGBM效果上树模型确实往往优于逻辑回归AUC能高出一截。但最终上线的还是逻辑回归原因有三点。第一可解释性。互金公司要面对监管、合作资金方、内部审计风控模型不能是个黑盒。逻辑回归给出的是每个特征对应的权重权重乘以WOE就可以折算成具体的加减分。任何一个业务人员都能看懂“学历这一项加了10分还是扣了5分”这在XGBoost里就很难做到。第二稳定性和可维护性。树模型在数据分布发生变化时表现得比较敏感需要频繁重训而逻辑回归在特征做了严格的分箱和WOE转换之后抗扰动能力相对强稳定性更好。对一个需要跑两三年的评分模型来说稳定压倒一切。第三部署成本低。逻辑回归本质就是一串乘法和加法任何一套后端系统几行代码就能部署不需要引入复杂的模型服务框架。在互金这种强依赖高并发的业务场景里低延迟和高吞吐是硬指标。当然这不代表XGBoost没用。我在实践里常用的做法是用树模型做特征筛选和效果验证用逻辑回归做最终上线模型。先让树模型告诉我们哪些特征有信息量再把这些特征做分箱、算WOE喂给逻辑回归。两边的好处都占了。2. 数据准备与特征工程评分卡最耗时、最决定成败的环节2.1 定义好坏样本Y标签怎么打才是关键做评分卡第一步不是跑模型而是定标签。标签定歪了后面所有工作都白做。对于信用卡或者现金贷的A卡业界比较通用的坏客户定义是“逾期M2”也就是逾期30天以上、且在观察期结束时仍未还清的用户。为什么不用M1逾期1-30天因为M1的客户很多是暂时性资金周转问题过几天就还了把他们算作坏客户会让模型学到的规律很噪。为什么不用M3M3虽然更“坏”但坏样本数量往往太少模型训练不稳定。好客户的定义则是“观察期内从未逾期、或逾期不超过3天”的用户。这里要注意一个时间窗口的概念表现期。通常取申请日之后的第3个月到第6个月作为判断用户好坏的观察窗口。也就是说今天进来的申请要等6个月才能知道它究竟是“好”还是“坏”。所以建模时用的数据在时间上必须做严格的切分——训练集用去年1月申请的用户标注他们到去年6月的还款表现再用去年7月到9月申请的用户做验证集确保没有数据穿越。样本比例也是要关注的。互金场景下好用户占比通常远高于坏用户比如95%对5%。直接拿这个比例训练逻辑回归模型会整体偏向预测“好客户”分数区分不开。常见做法是控制坏样本占比在10%到30%之间比如把好样本下采样到坏样本的3到4倍。但注意下采样之后模型的拦截率reject rate和坏账率就不是真实的绝对水平了需要通过调整截距项来还原真实的违约概率。2.2 分箱的艺术等距、等频、还是最优分箱特征工程里最关键的一步是分箱binning。分箱就是把连续变量切成几段把离散变量的类别合并成有限几组。分箱的质量直接决定WOE和IV的计算效果也决定评分卡最终的区分能力。初学的人容易忽略一件事评分卡模型里几乎不直接使用原始特征值。原因有两点一是原始连续值跟违约概率的关系往往不是线性的比如年龄和违约率就是个“U形”——年轻人违约率高中年违约率低老年又升高线性模型拟合不了这种关系二是原始值对异常值很敏感一个人年龄填了120岁直接丢进模型就会把结果拉偏。分箱之后每箱用一个WOE值代替既能捕捉非线性关系又能天然抵抗异常值。分箱方法主要有三种。等距分箱最简单把变量取值范围等分成N段比如年龄从18到60岁每5岁一箱。优点是实现容易缺点是一旦数据分布不均匀某些箱里的样本会特别少WOE估计不稳定。等频分箱按分位数切保证每箱的样本量大致相等。这个比等距好一些但遇到取值集中在某个区间的变量分出来边界会很难看解释性不好。最优分箱是实际项目里最常用的目前主流做法是基于决策树的分箱。做法很简单用这个特征单独预测好坏标签训练一棵深度为3左右的决策树让树自己去寻找最佳分裂点然后把分裂点当作分箱边界。工具上可以用Python的OptimalBinning库或者直接用XGBoost、LightGBM对单个特征做预测提取分裂阈值。分箱之后需要检查单调性。逻辑回归只能捕捉单调关系如果某个特征分箱后的WOE值不单调比如先升后降又升说明这个特征和违约概率的关系比较复杂直接进模型会导致权重不稳定。这种情况下处理方式一般是手动合并相邻箱体或者做业务上的重新解释尽量让WOE呈现单调趋势。2.3 WOE和IV的计算怎么理解这两兄弟分箱完成之后就要计算每一箱的WOEWeight of Evidence证据权重再汇总每个特征的IVInformation Value信息价值。单个箱体的WOE公式是WOE_i ln( (坏样本在该箱占比) / (好样本在该箱占比) )也就是WOE_i ln( Bad_i / Bad_total / Good_i / Good_total )这里有个细节要特别注意每一个箱子的好样本数、坏样本数都必须大于0否则log里会出现除以0或者对0取对数的情况。实际处理中如果出现0可以用一个很小的数比如0.5做平滑但更好的做法是在分箱时就把样本量过小的箱体跟相邻箱合并掉。WOE的含义很直观某个箱体里坏用户的相对浓度。WOE为正表示这一箱的坏用户比例高于整体平均水平箱体偏“坏”WOE为负表示这一箱偏“好”。这个符号很重要因为后面逻辑回归拟合的是违约概率的对数几率特征的系数乘以WOE符号相反的数会自然拉低或拉高分数。IV值则是对单个特征整体预测力的度量公式是对所有箱体累加IV Σ ( Bad_i / Bad_total - Good_i / Good_total ) × WOE_iIV值的经验判断标准是小于0.02基本没有预测能力0.02到0.1属于弱预测力0.1到0.3属于中等预测力0.3以上属于强预测力。但IV也不是越大越好如果某个特征IV超过0.5就要警惕它是不是包含了未来信息比如直接把“是否已经逾期”放进去这属于数据穿越在线上根本拿不到。这里分享一个踩过的坑有些特征的IV很高但业务上完全不可解释比如“用户提交申请时距离上一个整数小时的时间差”。这类特征往往是数据里的偶然模式过拟合到历史样本上上线后很快失效。做特征筛选时除了看IV一定要让业务同事过一遍确认特征在业务逻辑上说得通。3. 模型训练与评分刻度映射把概率变成业务人员看得懂的分数3.1 逻辑回归训练的关键参数与调优经验特征筛选和WOE转换做完之后进入建模阶段。我这里用的是Python的statsmodels库因为它输出的回归汇总非常详细方便检查每个变量的显著性和置信区间。也可以用sklearn的LogisticRegression但在评分卡场景里statsmodels更顺滑一些因为它直接给出P值。训练时需要注意几个参数。C正则化强度的倒数要调。评分卡场景下变量数量通常不多二三十个以内正则化可以适当放松C取1到10之间往往都行。我的做法是先不做正则化跑一版看系数符号是否合理再引入L2正则化处理多重共线性。逻辑回归对多重共线性比较敏感。好在WOE转换之后共线性问题通常已经减轻了不少因为分箱和WOE本质上是一个单变量非线性变换压缩了变量间的线性相关。不过还是建议训练完看一下方差膨胀因子VIF超过10的变量考虑删除或者合并。另外一个容易忽略的点是特征进入模型之前要保证WOE符号方向的一致性。逻辑回归拟合时如果系数正负号和WOE的业务含义相反比如某个特征WOE越高代表越坏WOE为正是坏但系数是负数那就说明模型在“反向学习”需要排查是不是有严重的共线性问题或者该特征和标签的关系在样本内外不一致。训练完成后要看的指标不只是AUC。我更关注的是每个变量的P值、系数大小和方向。P值大于0.05的变量可以考虑剔除系数方向跟业务常识矛盾的要重新审视。曾经有个特征“申请人近3个月查询次数”的系数是正的说明查询次数越多、违约风险越高这个方向是对的但另一个特征“收入”的系数是负的意思是收入越高风险越高这明显不合理。排查后发现是收入和借款金额的共线性太强剔除其中一个变量后方向就正常了。3.2 评分卡刻度分数是怎么算出来的逻辑回归输出的是违约概率但业务方直接用概率很不直观。所以要把概率映射成整数评分这就是评分卡刻度的由来。评分卡的核心公式是score offset factor × ln(odds)其中odds是坏好比也就是违约概率除以正常概率odds p / (1 - p)要确定offset和factor需要业务先定两个基准点。业内常用的是设定某个特定odds比如1:1也就是50%违约率对应的基准分为600分同时设定odds翻倍时分数增加的分值PDOPoints to Double the Odds比如20分。推导起来很简单。假设odds 1时score 600odds 2时score 620那么600 offset factor × ln(1) offset 620 offset factor × ln(2)因为ln(1) 0所以offset 600。代入第二个等式620 600 factor × 0.693147得到factor 20 / 0.693147 ≈ 28.85所以评分公式就是score 600 - 28.85 × ln(p / (1 - p))注意这里为什么是减号。因为逻辑回归直接输出的ln(odds)是违约概率的logit违约概率越高odds越大。而评分卡希望分数越高代表风险越低所以要加负号让分数和风险反着走。实际操作中更常见的做法是把逻辑回归的线性部分拆开按每个特征的分箱赋值。评分公式可以改写为score offset factor × ( β₀ β₁×WOE₁ β₂×WOE₂ ... )也就是把截距和每个特征的WOE分别乘以factor得到每箱对应的“点数”再用基准分减掉这些点数的和。这样每张评分卡就能清晰地呈现出不同特征、不同分箱对分数的具体加减贡献。这个转换在代码里直接用Pandas处理即可把一个包含特征名、分箱区间、WOE值、系数的DataFrame做乘法再加总。这里有个实战建议PDO不一定要取20或25这种整数可以根据业务对分数波动的敏感度来定。如果希望分数波动小一点PDO设40分数变化幅度就更缓和如果希望分数能拉开差距PDO设15或20。分数拉的太开会造成阈值附近的用户切换特别剧烈拉的太开则业务上难以区分客群。我做项目时先用20走了一版频繁调了几次之后发现在25左右比较合适业务同事对分数变化也更适应。3.3 分数阈值与业务策略联动模型训练好、分数也映射出来之后只完成了一半工作。剩下一半是把分数跟业务策略对接起来也就是找阈值。这部分没有绝对的“最优阈值”而是取决于业务对收益和风险的偏好。常见做法是画一条KS曲线——把用户按分数从高到低排序计算每个分数点对应的累计好用户比例和累计坏用户比例两条曲线距离最大的地方往往就是最适合做阈值参考的位置。实际操作中还可以结合坏账率目标比如业务目标是把整体坏账率控制在2%以内那就按分数从高往低数找到累计坏账率刚好低于2%的分数点作为切线。阈值还会受到成本约束的影响。放贷有资金成本、运营成本太严格的阈值意味着通过率低、客群小虽然坏账低但利润也上不去太宽松则坏账吞噬利润。所以我通常会给业务方提供一张二维表每一个候选阈值对应的通过率、批准率、预计坏账率、预期收益让他们自己根据当期目标去选。这张表相当于把模型结果变成业务决策工具比硬给一个阈值有效得多。4. 模型效果评估与上线监控评分卡不是一劳永逸的4.1 区分度与稳定性KS、AUC、PSI怎么配合使用评分卡上线前要过两道评估关区分度Discrimination和稳定性Stability。区分度衡量的是模型把好坏客户分开的能力。业内最常用的是KSKolmogorov-Smirnov和AUC。KS的计算方法是把样本按分数升序排列计算每个分数切点下累计好用户占比与累计坏用户占比之差的最大值。一般认为KS大于0.3就是可用的模型0.4以上算好的0.5以上就要警惕是不是过拟合了。AUC也类似0.7以上通常认为有实用价值0.8以上算优秀。这两个指标主要用验证集来评估能反映模型在新数据上的泛化能力。稳定性衡量的是模型上线之后评分分布会不会随时间发生漂移。最常用的指标是PSIPopulation Stability Index群体稳定性指数。PSI的计算公式是PSI Σ (实际占比 - 预期占比) × ln(实际占比 / 预期占比)通常用建模时的训练集作为基准预期用上线后每个月的新样本作为实际按月计算PSI。PSI小于0.1说明分布很稳定0.1到0.25之间需要关注超过0.25就说明客群或者数据发生了比较明显的变化模型可能需要重新校准或者重训。这里有个很容易被忽略的细节PSI要按分数段来计算而不是按原始特征分布来计算。如果评分没有分箱一般按分数分位点比如每5%一段切成20个桶再算PSI。我见过有同事直接用建模时的分段去切上线后的分数分段边界完全对不上算出来的PSI全是虚的。正确的做法是先按建模样本的分数分位点定好边界再用这同一组边界去切新样本这样才能算出有意义的漂移量。4.2 上线后的监控与模型迭代什么时候该重训评分卡上线不是终点监控才是日常工作的重心。我一般在模型上线后建立一套监控报表按月输出几类指标样本量、分数分布、通过率、逾期率、KS、PSI。任何一个指标出现异常波动都要回溯原因。最常见的情况是PSI升高。原因可以是客群变化比如平台搞了一次拉新活动涌入一批跟以前不一样的用户可以是外部环境变化比如整体经济环境变化导致还款能力下降也可以是数据采集链路出了问题某个字段突然大面积取不到值导致特征分布突变。先把原因找清楚再决定要不要重训模型。如果只是某几个特征的分布发生漂移可以对部分特征做分箱边界调整如果整体分数分布和区分度都明显下滑那就得考虑用最近6个月的新数据重新训练。重训也不是从头再来。工程上更稳妥的做法是增量训练以原训练数据为底加入最近几个月的新样本重新分箱、重新算WOE、重新拟合逻辑回归然后对比新旧模型的KS和PSI确认新模型在样本外表现不差于旧模型再走灰度发布流程。上线后先让小比例流量走新模型观察一两周的分数分布和线上表现没问题再逐步扩量。监控还要关注一个容易被忽略的指标坏账率的实际值和模型预测值的偏差。逻辑回归输出的概率本身是有校准意义的但如果模型上线后实际坏账率系统性高于预测值说明需要对概率做校准或者直接在评分卡阈值上做上移补偿。切记不要为了“看起来准确”去频繁调整阈值这样会让业务策略变得不可控。5. 常见问题与排查技巧实录5.1 特征工程和建模阶段的高频问题速查问题现象可能原因解决思路某个特征的IV特别高超0.5包含未来信息或者特征跟标签高度相关检查特征取值时间窗口确认是否线上可用WOE值不单调特征与违约概率关系非线性手动合并箱体或用二次分箱处理逻辑回归系数方向与业务常识相反多重共线性或样本外分布不一致计算VIF剔除或合并共线性特征模型AUC很高超0.85但线上效果差过拟合或样本选择偏差检查验证集切分方式增加正则化上线后PSI快速升高客群漂移或数据采集链路异常监控特征级PSI定位漂移源头坏样本占比过低3%表现期太短或业务策略太严延长观察期考虑拒绝推断这里想特别说一下“拒绝推断”。做A卡的时候有一个天然的样本偏差问题建模时我们只有“被允许通过申请的人”的还款表现那些被拒绝的用户从来没有机会表现好坏。用只有通过用户的数据训练出来的模型再用来决定拒绝谁实际上存在着样本选择偏差。这在风控圈是个老话题了。实际项目中如果拒绝率不高比如低于30%偏差往往可以接受但拒绝率很高时就要考虑用一些启发式方法比如给被拒绝样本打一个“伪标签”或者用小范围“挑战性放贷”策略来收集随机化样本。这个部分涉及较深的话题以后可以单开一篇讲。5.2 上线阶段容易踩的工程坑评分卡上线是模型工程师和开发工程师容易扯皮的地方。以下几点是我反复踩过的坑分享给你们避避雷。第一分数计算精度问题。线上系统是Java或者Go线下的WOE转换和分数计算是Python两边浮点精度不一致同一笔申请算出来的分数可能差出0.1分。别小看这0.1分如果阈值恰好卡在这个区间用户就会忽通过忽拒绝。解决方案是线下把每个特征每个分箱对应的点数算成整数直接下发一个映射表线上查表加总全程不允许出现浮点计算。第二缺失值处理逻辑不一致。训练时你处理了缺失值比如把缺失分到某个箱里但线上系统的SQL逻辑可能没有把缺失值归到同一个箱导致整行用户的分数被默认置0。这种问题上线前一定要用同一批历史样本在线上和线下各跑一遍分数做全量比对误差超过1分的直接排查。第三时间窗口穿越。用户申请时能拿到的历史数据是有时间截止点的比如征信查询次数是截止到申请日为止。但数据库里存的数据是实时的如果不注意截取时间可能把申请日之后的还款记录也算进特征里模型等于提前看到了答案。这种“未来变量”会让模型在训练时表现很好、上线后一塌糊涂。检查方法很简单随机抽几条样本看看特征取值所对应的时间是否都在申请日之前。6. 从模型到策略评分卡在互金风控流程中的完整位置很多人以为评分卡跑完就结束了但在实际业务里模型只是风控决策树的一个节点。一个完整的互金风控流程通常是这样的用户提交申请后先过黑名单和规则引擎命中一票否决规则的直接拒绝剩余用户进入评分卡模型输出一个分数分数落在自动通过区间的直接放款落在自动拒绝区间的直接拒掉中间灰色地带的进入人工审核或者补充材料流程。评分卡给出的分数和规则引擎之间是有联动关系的。比如我可以设定分数大于等于700分的即使命中某条弱规则比如手机号归属地和申请地址不一致也可以自动通过分数低于570分的即使其他条件再好也会被拒绝。这种规则和模型交叉使用的做法在保证风险可控的前提下尽可能提高了通过率。有一个经验值得分享评分卡模型上线初期不要立刻把决策完全交给模型。比较稳妥的做法是模型和原有策略并行跑一段时间比如模型分数只记录不下发决策或者只对部分流量做灰度。这样能积累一批“模型决策”与“人工决策”的对比样本用来验证模型的实际表现。等模型的区分度和稳定性验证通过再逐步提升模型的决策权重。另外评分卡并不只用于是否放款。它还能反哺到产品定价和额度管理。比如同一个用户分数高可以给更低的利率、更高的额度分数低则申请时直接跳到额度的上限更低档。这就把风控模型从“拦人”的工具升级成了“分层经营”的基础设施。从项目收益角度看这部分价值往往比分出好坏人本身更大。7. 写在最后的实操心得做了这么多年风控模型如果让我只保留一条经验分享出来那就是机器学习项目的成功与否通常不是由模型算法决定的而是由数据处理和业务理解的扎实程度决定的。信用卡评分模型更是这样——逻辑回归本身并不复杂花一下午就能跑通真正花时间的是分箱、WOE编码、特征筛选和跟业务的反复确认。还有一点评分卡模型的精神内核是“稳定可解释”这一点在互联网金融风控这个场景里尤其珍贵。别被各种花哨的新算法带着跑先把评分卡吃透你理解透了之后再去看深度学习模型、图模型、强化学习这些风控新技术你会发现它们解决的是评分卡解决不了的新问题而评分卡解决的老问题依然是业务里最离不开的那部分。
返回列表