ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从Give Me Some Credit到评分卡:风控建模全流程实战解析

从Give Me Some Credit到评分卡:风控建模全流程实战解析 做风控建模这行很多人入行的第一个实战项目就是Kaggle上的Give Me Some Credit简称GMSC。这个案例几乎成了国内风控圈默认的“新手村任务”数据量不大、业务含义清晰、不用折腾分布式环境一台普通笔记本就能跑完整的建模流程而且它背后对应的正是银行信贷业务里最经典的个人信用评分卡模型。这篇文章我就以这个项目为主线完整拆一遍从数据理解、特征工程、逻辑回归建模到评分卡刻度转换和模型评估的全过程。不管你是刚接触机器学习还是打算转行风控领域这套流程跑通了你对“评分卡到底是怎么从数据变成分数”这个问题会有非常具体的感知。1. 风控评分卡的业务逻辑与案例背景1.1 信用风险为什么要用评分卡在信贷场景里放贷机构最关心的问题就一个借款人会不会违约。但“会不会违约”这个事没法直接观测只能靠历史数据推断。评分卡模型做的事情就是把借款人的各种特征年龄、收入、负债、历史逾期记录等映射成一个分数分数越高代表违约风险越低机构根据分数决定批不批、批多少、利率定多少。为什么传统风控偏爱逻辑回归 评分卡而不是直接上XGBoost或深度学习最核心的原因是可解释性和监管合规。在金融行业模型不是给机器看的是给人看的。业务人员需要知道为什么拒绝一个客户监管机构也要求机构能够解释模型的决策逻辑。逻辑回归天然具有可解释性每一个特征的系数都对应一个明确的权重可以转成一个标准的评分公式。而树模型、神经网络虽然精度可能更高但在需要向客户解释拒绝理由的强监管场景里落地成本很高。GMSC这个数据集就是典型的二分类风险预测问题根据历史借款人数据预测借款人未来两年内是否会出现“严重逾期”即90天或更长时间逾期。把这个问题抽象成机器学习任务就是监督学习、二分类、样本不均衡特征以数值型和离散型为主非常接近真实业务中的贷前评分卡场景。1.2 Give Me Some Credit 数据集解读先看数据。GMSC数据集包含约15万条样本11个字段train.csv中是带标签的历史数据test.csv是不带标签的预测集。特征字段不长但每个都值得仔细品味字段名含义类型SeriousDlqin2yrs是否出现严重逾期标签0/1RevolvingUtilizationOfUnsecuredLines可用额度与无担保信贷总额的比值数值age借款人年龄数值NumberOfTime30-59DaysPastDueNotWorse过去2年出现30-59天逾期次数数值DebtRatio每月债务支出占月收入比例数值MonthlyIncome月收入数值NumberOfOpenCreditLinesAndLoans未结清信贷笔数数值NumberOfTimes90DaysLate过去2年出现90天以上逾期次数数值NumberRealEstateLoansOrLines不动产贷款或额度笔数数值NumberOfTime60-89DaysPastDueNotWorse过去2年出现60-89天逾期次数数值NumberOfDependents家属数量不含本人数值标签列SeriousDlqin2yrs为1的样本占比只有6.7%左右这是一个明显的样本不均衡问题。如果直接拿原始比例训练模型模型会倾向于把所有样本都预测为0因为这样准确率也有93%以上但完全没有业务价值。另外可以看到这个数据集的特征其实不算多真正能够刻画客户风险的主要是额度使用率、历史逾期次数、负债收入比这几个强变量。实际业务中的评分卡通常有几十个甚至上百个特征但逻辑是一样的先收集原始变量再经过分箱和编码最后筛选出对风险有显著区分度的变量进入模型。2. 数据探索与特征工程实操2.1 数据质量排查与缺失值处理拿到数据第一件事不是建模而是检查数据质量。我习惯先看三件事有没有空值、取值是否合理、标签分布什么样。用Pandas跑一下info()和describe()就能看出问题。GMSC里有两个字段存在缺失值MonthlyIncome月收入缺失约2万条左右NumberOfDependents家属数量缺失约2600条左右。缺失比例不算低不能直接删除行因为这会损失大量样本信息。月收入缺失的处理方式有几种用均值/中位数填充、用回归模型预测填充、或者把它当成一个独立类别处理。我在这个项目里用的是分箱 中位数填充的思路先按其他强变量比如DebtRatio、信贷笔数做粗分箱然后按箱内中位数填充缺失值。这样比全局均值填充更细致一些也能保留一部分“缺失本身可能有含义”的信息。还有一类数据问题是异常值。age字段的取值在GMSC里看起来正常但实际业务中经常会碰到年龄为0、收入为负数这种脏数据。遇到这种必须认真处理要么剔除要么单独标记绝不能直接丢进模型里训练。我在做这个项目时把所有“年龄小于18岁”的样本单独查了一遍发现业务上不合理直接过滤掉了。这些细节看着不起眼但影响模型稳定性的往往就是这些脏数据。2.2 特征分箱与WOE编码评分卡模型最区别于普通机器学习流程的一步就是分箱 WOE编码。为什么要分箱逻辑回归要求特征与目标变量之间尽量是单调或分段线性的关系但原始特征比如年龄和违约率之间往往不是单纯的线性关系。年轻人违约率高中年人违约率低到了老年又可能上升。如果用原始数值直接进模型这种非线性关系很难被捕捉得很好。分箱之后每个箱被当作一个独立的类别处理模型的非线性拟合能力就上来了。分箱之后要对每个箱计算WOEWeight of Evidence和IVInformation Value。计算公式为WOE ln(箱内坏样本占比 / 箱内好样本占比)IV Σ(箱内坏样本占比 - 箱内好样本占比) × WOEWOE的直观含义是这个箱子里的样本相对总体是“偏坏”还是“偏好”。WOE为正说明该箱坏样本比例高于好样本为负则相反。IV则是把所有箱子的WOE按好坏人占比加权求和衡量一个变量整体的预测能力。实操时分箱常用的库是scipy的统计分箱函数或者直接用pandas的qcut按分位数切分再根据每个箱的坏样本率做手工调整。我一般先做等频分箱保证每个箱样本量差不多然后观察每个箱的WOE是否单调。如果某两个相邻箱的WOE趋势一致、差异不大就把它们合并如果某个箱里面好坏比明显异常就要检查是不是数据有问题。IV值的经验判断标准是小于0.02基本没有预测能力0.02到0.1之间预测能力较弱0.1到0.3之间中等大于0.3说明变量很强。GMSC里RevolvingUtilizationOfUnsecuredLines和NumberOfTimes90DaysLate的IV通常都很高是当之无愧的头部变量。2.3 特征筛选与多重共线性控制特征工程的另一个重点是筛选变量和检查共线性。逻辑回归对特征之间的多重共线性敏感如果两个变量高度相关回归系数会不稳定导致评分卡权重失真。在GMSC里有一个典型例子NumberOfTime30-59DaysPastDueNotWorse、NumberOfTime60-89DaysPastDueNotWorse、NumberOfTimes90DaysLate这三个变量高度相关。它们本质上都在刻画历史逾期行为只是逾期严重程度不同。如果全部直接放进模型很容易出现系数正负号异常的情况。处理方式有两种一种是只保留IV最高的那个变量另一种是把它们做某种变换比如取最大值、相加成一个“总逾期次数”变量。我在实际项目中会先算一个相关系数矩阵把相关系数高于0.7的变量组找出来再结合IV筛选。如果两个变量相关性很高但IV都很有价值也可以考虑用WOE编码后的值进模型因为WOE转换本身能在一定程度上压缩共线性影响。3. 逻辑回归模型构建与训练3.1 为什么基座选逻辑回归前面提过逻辑回归最大的优势是可解释性。但真正落地时评分卡还有一个硬性要求——分数与违约概率的映射关系是单调的。逻辑回归天然满足这个要求线性组合越大sigmoid输出的概率越接近1映射成评分就是分数越低。树模型做不到这一点因为树模型的输出是分段常数映射出来的分数可能是不连续跳变的。所以不管后面你用什么复杂模型去刷精度做评分卡的主体模型逻辑回归几乎是唯一选择。这也是风控领域比较特殊的地方模型选型首先考虑业务需求而不是只盯精度指标。3.2 样本不均衡的应对策略GMSC的坏样本比例只有6.7%直接训练逻辑回归会出问题。逻辑回归的损失函数对小样本类别的惩罚不够模型会把重心放在多数类上导致预测出的概率整体偏低坏客户很难被识别出来。常用的处理方法有三种下采样、过采样、调整类别权重。下采样把好样本随机抽到和坏样本一样多。优点是最简单缺点是丢失大量好样本信息。过采样用SMOTE等方法合成坏样本。问题是有可能引入噪声。调整类别权重在逻辑回归中设置class_weightbalanced让少数类的误分类代价更高。工程上最省事效果也还不错。我实操下来的经验是先用class_weightbalanced跑一版然后看验证集上的KS和AUC。如果需要进一步优化再考虑SMOTE过采样。不要一上来就做复杂采样很多时候类别权重已经够了。另外需要注意采样只能作用于训练集验证集必须保持原始分布否则评估指标会失真。3.3 训练与交叉验证特征处理完之后把WOE转换后的特征矩阵和标签丢进模型。数据要划分训练集和验证集推荐按7:3或8:2划分同时要做分层抽样保证训练集和验证集的坏样本比例接近。逻辑回归的调参重点不在算法本身而在两处一个是正则化强度C一个是特征标准化。逻辑回归对特征尺度敏感虽然WOE值本身已经做了标准化处理在同一变量内部尺度可比但为了保险起见训练前还是对特征矩阵做一次StandardScaler。正则化强度C可以用网格搜索去调也可以用默认值这个项目里C的影响通常没有特征筛选的影响大。训练完成后保存好回归系数。这些系数将被用在评分卡刻度转换里所以每一步都要记录清楚——哪个变量、哪个箱、系数是多少。工程上建议把分箱边界和WOE值存成一张配置表因为模型上线后线上实时计算分数就是靠这张表查出来的。4. 评分卡刻度转换与业务落地4.1 从回归系数到标准评分公式模型训练完得到的是一组逻辑回归系数但是业务方需要的是一个直观的“分数”比如650分、700分而不是一堆概率值。这里就需要做评分卡刻度转换。标准评分卡公式用的是线性变换核心是设两个基准点基准分数P0对应某个特定的违约概率比例比如说600分对应好:坏50:1PDOPoint Double Odds分数每增加PDO好坏比翻倍比如PDO50即分数每高50分违约概率减半评分计算公式为Score P0 PDO × (ln(好坏比) - ln(基准好坏比)) / ln(2)更具体的模型输出的线性部分 βX 与好坏比 ln(odds) 成正比所以可以把它映射成分数偏移量。实际操作时常用公式Score A - B × log(odds)其中 A 和 B 由基准点和PDO确定。拿到逻辑回归的截距和系数后把每个变量每个分箱的WOE乘上对应系数就是这个变量在某个箱内贡献的分数。所有变量的分数加总再加上基准分就是最终评分。我在做这个步骤时踩过一个细节坑截距项要分开放置系数的正负号必须跟业务方向对应好。评分卡约定是“分数越高→风险越低”所以如果某个变量系数是正的说明该变量值越大违约概率越小映射成分数时应该是加分。一旦正负搞反整张评分卡就废了。4.2 分数校准与cutoff确定评分卡落地还有一步很关键确定审批阈值cutoff。有了评分分布之后需要找到最佳的分数切分点。比如定的是650分那么高于650批贷、低于650拒贷。怎么定这个阈值看业务诉求。如果机构的策略是“宁可得罪客户也要守住坏账率”那阈值就定高一点拒绝更多低分客户坏账率会下降但业务量也会下降。如果是快速增长期愿意承担一定坏账来换规模阈值就定低一点。具体操作上通过验证集的分数分布计算不同cutoff下的通过率、坏账率、KS值交给业务方做决策。这个环节我的建议是别把cutoff当成模型问题它是业务问题。模型能给到各个分数段的好坏客户占比分布但最终cutoff一定是业务老大拍板的模型工程师能做的只是把决策所需的数据准备清楚。5. 模型评估与验证5.1 核心评估指标KS、AUC、Lift评分卡模型评估不能只看准确率在样本不均衡的场景下准确率几乎没有参考价值。我主要看以下几个指标KS值衡量模型区分好坏客户的最大差异。计算方式是按分数排序后累计好客户占比与累计坏客户占比的差的最大值。一般KS在0.3以上就认为模型有区分能力0.4以上算优秀的评分卡。AUCROC曲线下的面积表示随机取一个好客户和一个坏客户模型把好客户排在坏客户前面的概率。0.7以上可接受0.75以上较好。Lift提升度用模型选出的Top 20%高概率坏客户里实际坏客户占比相对于随机抽取的提升倍数。Lift越高说明模型在高风险段的识别效率越好。在GMSC数据集上一个完整做完特征工程和调参的逻辑回归模型验证集AUC通常在0.85左右KS在0.45左右。这个成绩在真实业务中已经相当能打了因为真实业务里的强变量往往还没有这么集中。5.2 验证方式与时间外样本验证评分卡建模还有一个重要的验证维度——时间外样本验证OOT。在很多风控竞赛或公开数据集里训练集和测试集是随机划分的但真实业务中模型往往是用历史数据训练、未来数据做预测。如果随机划分验证表现良好不代表未来的时间外数据一定稳定因为客群结构、宏观环境都可能发生变化。如果在GMSC这类静态数据集上严格的时间外验证不好做但有一个替代思路按年龄或额度使用率等维度做分层验证检查模型在每个子群上的稳定性。真实项目中我一般会把数据按时间切成训练集、验证集、OOT集三个部分训练集训练模型验证集调参和选特征OOT集只用来做最终确认绝不能碰训练过程。5.3 稳定性的量化PSI评分卡上线之后不是一劳永逸的客户群体随时间变化模型的区分能力也会下降。业界通用的监控指标是PSIPopulation Stability Index群体稳定性指数用来衡量模型评分分布在两个时间窗口之间的差异。PSI的计算逻辑和IV类似都是基于分布差异的散度度量只是IV衡量的是变量与好坏标签的关系PSI衡量的是同一个变量通常是评分在两个时间点的分布差异。PSI小于0.1说明分布稳定0.1到0.25需要关注大于0.25说明分布漂移明显要考虑模型是否需要重建或校准。我在项目交付后一般会给业务方做一个监控报表每周自动计算评分分布的PSI并监控每个特征的分布变化。一旦某个特征PSI异常升高能很快定位到是客群变化还是数据采集逻辑出了问题。这是评分卡能长期稳定运行的隐形保障很多新手建模时会忽略掉。6. 常见问题与踩坑记录6.1 新手频率极高的5个问题问题原因解决办法直接拿原始特征跑逻辑回归系数不稳定未做分箱和WOE编码非线性关系和异常值没有处理先分箱用WOE编码后再进模型用准确率评估模型觉得“模型没效果”样本不均衡下准确率没有区分能力改用KS、AUC、Lift等指标训练集和验证集划分时未分层验证集坏样本比例和实际差很多随机划分导致小概率事件分布不稳定用stratify分层抽样按标签比例划分把所有特征一股脑塞进模型忽略多重共线性逾期相关字段高度相关先算相关性矩阵结合IV筛选特征线上分数和线下分数对不上分箱边界和WOE配置表没有固化把分箱区间、WOE值、系数固化到配置表或pmml文件第一个问题最常见。很多朋友拿类似的公开数据集练手时直接跳过特征工程把原始数值扔进逻辑回归发现效果比XGBoost差出一大截就得出“逻辑回归不行”的结论。这个结论是错的——逻辑回归的强项不在特征提取而在给定合适特征之后的表现和可解释性。你把特征工程做到位它跟XGBoost的差距远没有想象中大而且可靠性高出很多。补充一点WOE编码之后的特征数值范围比较集中同时蕴含了变量与标签的关系这种编码方式本身也是一种“监督式特征构造”。这也是为什么即使同样用逻辑回归WOE编码版本和原始数值版本的效果会差很多。6.2 我做这个项目时印象最深的三次调整第一次是大规模特征筛选之后模型AUC下降了。我一开始觉得特征减少必然损失信息后来排查发现减少的特征本来就是低频或者噪声变量去掉之后模型泛化能力反而更强验证集表现比此前更好。说这个是想强调验证集表现才是唯一标准不要凭感觉判断特征取舍。第二次是处理类别权重时我同时用了SMOTE过采样和class_weightbalanced结果验证集AUC和KS都有轻微下降。复盘发现是过采样带来的合成样本引入了噪声叠加权重又让模型过于偏置。后来只保留class_weight调整效果最稳定。从此我养成了一个习惯能用简单方案解决的不用复杂方案多个处理手段叠加时务必逐一验证。第三次是关于评分卡cutoff的选择。我当时觉得KS最大的点就是最优cutoff但业务方提出那个分数段的通过率太低不满足业务增长目标。后来才知道KS最大点只是一个技术参考真正定cutoff需要盯通过率、坏账率、件均额度、边际利润这些东西。从那以后我在做模型交付时会同时输出一张“不同cutoff下的通过率/坏账率对照表”直接给业务方用不再自己拍板。7. 还可以怎么继续往下做GMSC做完整版评分卡之后如果你想继续深化我有两个方向推荐。一个是把评分卡升级成“集成评分卡”在用逻辑回归完成主体模型后叠加一个XGBoost或LightGBM做残差拟合形成主模型负责可解释性、辅助模型负责抓残差的组合。这种方案在部分金融机构已经落地既保留部分可解释性又提升精度但需要严格控制辅助模型的复杂度防止可解释性被破坏。另一个方向是模型上线监控体系。做一个自动化的数据监控脚本定时把线上评分分布拉下来算PSI同时监控每个变量的分布漂移。评分卡模型70%的工作在于上线之后的维护。到了这一步你就不只是会做模型的建模工程师而是一个真正懂风控业务的算法工程师了。我在实际项目中体会到评分卡这类模型最考验人的不是算法选型而是“能不能把一个业务问题转化成清晰、可解释、可落地的数学模型”。这需要你对数据有耐心对业务有理解对结果有敬畏。GMSC是一个很好的起点至少每个环节都能亲手过一遍而且遇到的所有问题你在真实工作中大概率还会再遇到一次。
返回列表