1. 项目概述:从一道赛题到信贷风控的实战演练

最近在整理过往的竞赛项目,翻到了“国赛-19C”这道关于信贷决策的经典数据挖掘赛题。这道题可以说是很多数据科学从业者,尤其是想进入金融科技领域朋友的“启蒙题”之一。它模拟了一个非常真实的场景:给你一批客户的申请信息和历史行为数据,让你去预测他们未来是否会违约。这本质上就是一个二分类预测问题,但背后牵扯到的数据清洗、特征工程、模型选择和业务解释,几乎涵盖了信贷风控建模的全流程。今天,我就以这道赛题为蓝本,结合我这些年做风控模型的实际经验,来一次深度的“数据挖掘练习”复盘。我会带你走一遍从数据理解到模型上线的完整思路,重点不是复现一个最高分的模型,而是理解每个步骤背后的“为什么”,以及在实际工业场景中,哪些技巧真的有用,哪些坑需要提前避开。无论你是正在准备相关竞赛的学生,还是刚接触金融风控的数据分析师,相信这篇“老兵”的实战笔记都能给你带来一些不一样的启发。

2. 赛题核心与业务逻辑拆解

2.1 赛题背景与目标解读

“国赛-19C”提供的是一份经过脱敏处理的信贷数据集。通常,这类数据集会包含两类信息:一是客户申请贷款时填写的静态信息,比如年龄、职业、收入、房产状况等;二是客户的历史金融行为信息,比如过往的信贷账户数、信用记录长度、近期查询次数等。目标变量很明确:客户是否违约(例如,定义为逾期超过90天)。

这里首先要厘清一个关键概念:我们建模预测的“违约”,是一个未来事件。模型的任务是,在客户申请贷款的当下(观察点),利用已有的信息去判断其未来一段时间内(表现期)的违约概率。这个“观察点”与“表现期”的设定,是风控模型的基石,直接决定了特征如何构造、样本如何定义。赛题数据通常已经做好了这种时点对齐,但我们必须心中有数。

2.2 信贷风控的业务核心与评价指标

为什么不能直接用准确率(Accuracy)来评价模型?想象一下,一个信贷产品的违约率通常是5%左右(即100个人里大约5个坏客户)。如果我做一个“傻瓜模型”,预测所有人都是好客户,那么我的准确率高达95%!但这模型毫无用处,因为它把所有坏客户都漏掉了,给机构带来的损失是灾难性的。

因此,信贷风控模型有自己的一套评价体系:

  1. KS值 :这是最常用的指标之一,用于衡量模型区分好坏客户的能力。它计算的是好坏客户累积分布的最大差值。KS值越高(通常大于0.3算不错),说明模型区分度越好。在实际业务中,我们常根据KS值来划分分数段,决定审批策略。
  2. AUC :即ROC曲线下的面积,衡量的是模型整体的排序能力。AUC越接近1越好。它不关心预测的概率绝对值是否精准,只关心模型能否把坏客户排到好客户前面。这对信贷审批中的通过率、坏账率控制至关重要。
  3. PSI :群体稳定性指标。这在模型上线后监控时极其重要。它衡量的是当前客群的特征分布与模型开发时样本的分布差异。PSI过大(如>0.25)意味着客群漂移严重,模型效果可能会大幅衰减,需要预警甚至重训模型。

注意 :在竞赛中,可能只提供AUC或KS作为评分标准,但在实际工作中,你必须同时关注KS、AUC以及模型分数的分布(如是否集中在中间段),并时刻准备用PSI来监控模型健康度。

3. 数据探索与清洗:磨刀不误砍柴工

拿到数据后,切忌一头扎进模型训练。至少花30%-40%的时间在数据探索和清洗上,是专业从业者的共识。

3.1 缺失值处理:不是简单填充了事

赛题数据中常有大量缺失值。如何处理?

  • 探索缺失模式 :首先用 df.isnull().sum() df.isnull().mean() 看整体缺失情况。更重要的是,分析缺失是否随机。例如,“公司电话”字段的缺失,可能意味着个体户或自由职业者,这本身就是一个有区分度的信息!我们可以将缺失作为一个新的类别(如“MISSING”)加入到类别型变量中。
  • 数值型变量填充 :对于连续变量,常用的填充方法有中位数、均值或基于其他特征的预测填充。在风控中,我倾向于使用中位数,因为它对异常值不敏感。有时也会填充一个业务上的特殊值(如-999),然后让模型自己去学习这个特殊值的含义。
  • 警惕“数据泄露”型填充 :绝对不能用目标变量(是否违约)相关的统计量(如好坏客户的均值)去填充缺失值,这会在训练中引入未来信息,导致模型评估结果虚高。

3.2 异常值处理:风控场景下的特殊考量

异常值不一定是错误,可能是高风险信号。

  • 单变量分析 :使用箱线图或描述性统计(如 df.describe() )快速定位。例如,“年收入”出现一个亿,这可能是数据错误,也可能是极少数的超高净值客户,需要结合业务判断。
  • 业务逻辑判断 :这是关键。比如“年龄”为200岁,显然是错误;“月还款额”大于“月收入”,这可能意味着极高的负债压力,本身就是一个强风险特征,不应简单剔除,而应将其视为一种极端情况保留,或进行缩尾处理。
  • 处理方法
    • 缩尾处理 :将大于99分位数和小于1分位数的值,用99分位数和1分位数的值进行替换。这是最温和、最常用的方法。
    • 封顶/封底 :根据业务知识设定上下限。例如,设定年龄有效范围为18-70岁。
    • 视为缺失 :如果异常值明显是错误且无法修正,可视为缺失值,按缺失值逻辑处理。

3.3 特征类型转换与初步分析

  • 类别型变量 :对于无序类别变量(如职业、城市),必须进行编码。 独热编码 容易导致维度爆炸和稀疏问题,在树模型(如LightGBM)中并非最佳。 标签编码 会给类别强加一个顺序,可能引入噪声。 更推荐的是目标编码 ,即用该类别下目标变量(违约率)的统计量(如均值、平滑后的均值)来替代类别本身。这在风控中效果显著,因为它直接编码了风险信息。
  • 数值型变量 :检查分布。严重的偏态分布(如收入)可能需要对数变换或Box-Cox变换,使其更接近正态分布,这对线性模型有帮助,但对树模型影响不大。

4. 特征工程:模型效果的胜负手

特征工程是风控建模的灵魂。好的特征不一定来自复杂的算法,往往源于深刻的业务理解。

4.1 基础特征构造

从原始字段中衍生新特征:

  • 比率型特征 :这是金融风控的黄金特征。例如,“负债收入比”(总负债/年收入)、“信用卡利用率”(已用额度/总额度)。高负债收入比直接反映还款压力。
  • 时间型特征 :从日期字段中提取,如“客户年龄”、“当前工作年限”、“最近一次申请距今月数”。风险往往与时间有关,新客户、工作不稳定客户风险可能更高。
  • 交叉特征 :将两个或多个特征组合。例如,“年龄”与“职业”交叉,看不同年龄段白领和蓝领的违约差异。或者“年收入”与“城市等级”交叉,因为一线城市的10万年收入和三线城市的10万年收入含义不同。

4.2 行为序列与趋势特征

如果数据包含历史多期数据(如过去6个月的月度还款状态),则可以构造强大的行为特征:

  • 恶化趋势 :最近3个月的逾期次数是否比前3个月多?
  • 行为稳定性 :还款金额的波动率是否很大?
  • 最坏状态 :历史上出现过的最严重的逾期状态是什么?

4.3 特征分箱与WOE编码

这是评分卡模型的核心,但在机器学习模型中同样有效,尤其是对于逻辑回归和入模特征筛选。

  • 分箱 :将连续变量或大量类别的离散变量,按照风险趋势(违约率)合并成几个箱。方法有等频分箱、等距分箱和基于决策树的最优分箱。分箱的好处是能处理非线性关系,增强模型稳定性。
  • WOE编码 :对每个分箱,计算其WOE值。 WOE = ln( (箱内好客户占比 / 总体好客户占比) / (箱内坏客户占比 / 总体坏客户占比) ) WOE值反映了该箱内客户的风险相对于整体平均风险的偏离程度。它可以将特征值单调地映射到风险尺度上,非常符合风控直觉。
  • IV值筛选 :在分箱和WOE编码后,可以计算每个特征的IV值,用于初步的特征筛选。通常认为:
    • IV < 0.02: 预测能力极弱,可考虑剔除。
    • 0.02 <= IV < 0.1: 预测能力较弱。
    • 0.1 <= IV < 0.3: 预测能力中等。
    • IV >= 0.3: 预测能力强。

实操心得 :即使你最终使用LightGBM这类树模型,我也强烈建议先做一遍分箱和WOE编码。这不仅仅是为了特征筛选,更是一个 理解数据、理解业务 的绝佳过程。通过观察每个变量的分箱结果和违约率趋势,你能直观地感受到哪些因素是真正的风险驱动因子,这对后续模型调试和业务解释有巨大帮助。

5. 模型选择、训练与调优

5.1 模型选型:为什么是树模型?

在当今的信贷风控领域, 梯度提升树 家族(如XGBoost, LightGBM, CatBoost)是绝对的主流,尤其是LightGBM。

  • 优势 :能自动处理非线性关系和特征交互,对缺失值不敏感,无需复杂的特征标准化,且训练速度快。CatBoost还能很好地处理类别特征,无需单独编码。
  • 与逻辑回归对比 :逻辑回归线性、可解释性强,是传统评分卡的基石。但它需要大量精细的特征工程(如分箱、WOE编码)来拟合非线性关系。树模型更像一个“全能战士”,用起来更省心,效果通常也更好。在实际中,常将两者结合:用逻辑回归做可解释的基准模型,用LightGBM做主力预测模型。

5.2 样本不均衡处理

违约客户(坏样本)远少于正常客户(好样本)是常态。处理不当,模型会倾向于预测所有人为好客户。

  • 调整样本权重 :这是最推荐的方法。在LightGBM中,可以通过 scale_pos_weight 参数设置(通常设为 负样本数/正样本数 ),让模型在训练时更关注少数类。
  • 过采样与欠采样
    • SMOTE :通过合成新样本来增加少数类。但需谨慎,在风控中盲目合成“坏客户”可能会制造出不符合业务逻辑的虚假模式。
    • 欠采样 :随机减少多数类样本。这会损失大量信息,一般不推荐。
  • 使用AUC或KS作为损失函数 :有些框架支持直接优化AUC,这比优化交叉熵损失更能直接应对不均衡问题。

5.3 模型训练与交叉验证

绝对禁止使用测试集参与任何训练过程! 必须严格划分训练集、验证集和测试集。

  • 时间序列划分 :如果数据带有时间戳,必须按时间划分。用过去的数据训练,用未来的数据验证/测试,模拟模型上线的真实场景。这是风控建模的 铁律 ,能有效防止“数据泄露”,避免评估结果过于乐观。
  • 交叉验证 :对于没有明显时间顺序的数据,可采用分层K折交叉验证,确保每折中好坏客户比例一致。
  • 早停法 :设置一个验证集,当验证集上的指标(如AUC)在连续多轮迭代后不再提升,则停止训练,防止过拟合。

5.4 超参数调优

不要盲目网格搜索,既耗时又低效。建议的调优顺序:

  1. 学习率与迭代轮数 :先设一个较小的学习率(如0.05),用早停法确定大致迭代轮数。学习率小,模型更稳健,但需要更多轮次。
  2. 树复杂度 :调整 max_depth (树深度)、 num_leaves (叶子数)。先从较小的值开始(如深度6-8,叶子数31-63),防止过拟合。
  3. 行/列采样 subsample (样本采样率)和 colsample_bytree (特征采样率),通常设为0.7-0.9,这是防止过拟合的强有力手段,类似于随机森林的思想。
  4. 正则化参数 reg_alpha (L1正则) 和 reg_lambda (L2正则),用于控制模型复杂度,可以从0或一个很小的值开始调。

使用 贝叶斯优化 Optuna 等工具进行自动化调优,比网格搜索和随机搜索效率高得多。

6. 模型评估、解释与部署思考

6.1 多维度模型评估

训练完成后,不能只看验证集上的一个AUC值。

  1. 绘制ROC曲线和KS曲线 :直观查看模型在不同阈值下的表现。
  2. 分数分布图 :绘制好坏客户的模型预测分数分布。理想情况是两者分离度高,且好客户的分数集中在高分区域,坏客户集中在低分区域。如果分布有大量重叠,说明模型区分能力有限。
  3. 提升图和洛伦兹曲线 :用于评估模型在业务层面的价值。例如,如果我们只对分数最高的前30%的客户放贷,能避开多少比例的坏客户?
  4. 校准曲线 :检查模型预测的概率是否准确。例如,预测违约概率为10%的客户群体,其实际违约率是否真的在10%左右?这对于需要精确概率的业务场景(如风险定价)很重要。

6.2 模型可解释性:SHAP值的应用

树模型是“黑盒”吗?以前可能是,但现在有了SHAP,我们可以很好地解释它。

  • SHAP值 :可以解释每个特征对于单个预测结果的贡献度。对于整个数据集,我们可以得到:
    • SHAP摘要图 :看出哪些特征最重要,以及特征值大小与对风险贡献(SHAP值)的关系(是正相关还是负相关)。
    • 依赖图 :展示单个特征与模型预测输出之间的具体关系,揭示非线性效应。
  • 业务报告 :向业务方汇报时,你可以说:“我们的模型认为,影响客户风险最重要的三个因素是:负债收入比、最近6个月的查询次数和信用卡利用率。其中,负债收入比超过60%的客户,风险会急剧上升。” 这样的解释远比“模型AUC是0.8”更有说服力。

6.3 从竞赛到实战:部署与监控的鸿沟

竞赛到实际应用,还有关键一步。

  • 模型固化与上线 :将训练好的模型参数、预处理步骤(如缺失值填充器、分箱器、WOE编码器)全部序列化(用 pickle joblib ),形成一个完整的 pipeline 。线上预测时,新数据必须经过完全相同的pipeline处理。
  • 监控报表体系 :模型上线不是终点,而是起点。必须建立日常监控报表:
    • 模型性能监控 :每日/每周计算模型在最新批贷客户上的AUC、KS值,观察其衰减情况。
    • PSI监控 :监控主要特征和模型分数的PSI,一旦超过阈值(如0.1),立即报警,分析客群变化原因。
    • 特征稳定性监控 :监控关键特征(如收入、负债比)的分布变化。
  • 策略联动 :模型分数需要转化为业务策略。例如,设定一个审批分数线,高于此分的直接通过,低于此分的直接拒绝,中间段的转人工审核。这个分数线的确定,需要综合权衡通过率、坏账率和利润目标。

7. 常见问题与排查技巧实录

在实际操作和竞赛中,你肯定会遇到下面这些问题,这里是我的排查思路:

问题现象 可能原因 排查与解决思路
模型在训练集上AUC很高(>0.99),在验证/测试集上骤降 严重的过拟合。最常见的原因是 数据泄露 ,即特征中包含了未来信息或目标变量的直接/间接信息。 1. 彻查特征 :检查每一个特征,尤其是衍生特征,确保其在观察点都是可知的。例如,不能用“未来12个月的平均还款额”来预测“未来是否违约”。
2. 检查数据划分 :是否随机划分了有时间序列的数据?必须按时间划分。
3. 增加正则化 :大幅降低树深度、叶子数,增加 subsample colsample_bytree ,增加 reg_lambda
KS值不错,但AUC很低 模型具有一定的区分能力,但排序能力整体不佳。可能好坏客户的分数分布有大量重叠,只在某个狭窄区间有区分度。 1. 检查分数分布 :绘制好坏客户的分数分布直方图,看是否真的分离。
2. 检查特征 :可能强预测特征很少,模型只抓住了部分模式。尝试构造更多业务相关的交叉特征和趋势特征。
3. 尝试其他模型 :逻辑回归、随机森林都试试,看是否是当前模型(如LightGBM)的参数或数据不适配。
PSI值持续升高,模型效果下降 客群发生了漂移。例如,产品营销策略改变,吸引了一批新类型的客户;或宏观经济环境变化,影响了整体客群资质。 1. 特征层面PSI分析 :计算每个特征的PSI,找到分布变化最大的几个特征。
2. 业务归因 :与业务部门沟通,了解近期是否有产品、渠道、政策上的变动,解释特征漂移的原因。
3. 模型迭代 :如果漂移持续且严重,需要考虑用新数据重新训练模型,或采用动态模型权重调整。
某个业务上认为很重要的特征,在模型中的重要性(如SHAP值)却很低 1. 该特征与其它强特征高度相关,信息已被其他特征替代。
2. 该特征在预处理(如分箱、填充)时信息损失严重。
3. 该特征与目标的关系是非单调或复杂的,树模型没有很好地捕捉。
1. 检查相关性 :计算该特征与其他Top特征的相关性矩阵。
2. 单独验证 :只用这一个特征训练一个简单的模型(如逻辑回归),看其单变量预测能力(AUC)。
3. 改变编码方式 :如果是类别特征,试试目标编码或频率编码,而不是简单的标签编码。
训练时AUC波动很大,不稳定 1. 学习率设置过高。
2. 数据量太小,或数据噪声太大。
3. 没有使用交叉验证,单次验证集划分有随机性。
1. 降低学习率 :这是首要尝试,将学习率调低一个数量级(如从0.1调到0.01),增加迭代轮数。
2. 增加数据 :如果可能,使用更多数据。或使用更严格的正则化。
3. 使用交叉验证 :采用5折或10折交叉验证的AUC均值作为调优目标,结果更稳定。

最后,我想分享一点个人体会:信贷风控建模,技术固然重要,但 业务直觉 才是让你走得更远的关键。当你构造一个特征时,多问自己“这个特征在业务上代表什么风险?”“一个审批人员看到这个信息会怎么想?”。当你分析错误案例时,多想想“为什么模型会错判这个客户?是缺少了哪方面的信息?”。这种技术与业务的结合,才是数据挖掘在金融领域最迷人的地方。这道“国赛-19C”的练习,就是一个完美的起点,希望你能从中练就的不仅是调参的功夫,更是这种解决问题的思维框架。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐