第1章:什么是WOE?从一张评分卡说起
大家好,我是老张。在风控这一行混了十多年,踩过的坑比走过的路还多。今天开始咱们聊信用评分建模,第一件事就是把WOE这个家伙彻底搞明白。
你可能会想:WOE不就是个特征变换吗?网上资料一搜一大把。嗯…我刚开始做评分卡时也这么觉得。直到有一次模型上线后,分数分布出现严重偏移,排查了三天才发现是WOE的样本分层出了问题。从那以后,我对WOE的态度就变成了——不把它的底层逻辑吃透,绝不轻易动代码。
这一章,咱们先把WOE、评分卡、样本分层这三个核心概念说清楚。后面的章节再一步一步带大家实战。
1.1 为什么需要WOE?
先说个简单的道理。你在银行申请贷款,审批系统会给你打个分。这个分数就是信用评分。评分卡模型的核心,就是把用户的特征(比如年龄、收入、逾期次数)映射成对应的分数,然后加总。
但这里有个问题:原始特征和违约概率之间,通常不是线性关系。举个例子,年龄20岁和30岁的违约率可能差3倍,但30岁和40岁只差1.2倍。如果你直接把“年龄”这个数字扔进线性回归,模型会误以为每增加1岁,违约概率变化是固定的。
WOE(Weight of Evidence,证据权重)就是为了解决这个非线性问题。它把连续变量分箱后,再计算每个箱子的权重。说白了,就是用“违约概率 vs 正常概率”的对比来给每个箱子赋值。
WOE的核心公式:
WOEi = ln( 违约样本占比i / 正常样本占比i )
其中,违约样本占比指第i个箱子里的坏客户数除以总坏客户数;正常样本占比同理。
这个值越大,说明这个箱子的客户违约风险越低(正分);反之,WOE为负,说明风险高。
1.2 信用评分卡长什么样?
经典的评分卡,其实就是一张表。每列是一个特征,每行是一个分箱区间,每个格子写的是该区间对应的“分数”。
我习惯用下面这个结构来记:
| 特征 | 分箱区间 | WOE | 分数 |
|---|---|---|---|
| 年龄 | [18, 25) | -0.52 | -12 |
| 年龄 | [25, 35) | 0.15 | 3 |
| 年龄 | [35, 50) | 0.48 | 11 |
| 年龄 | [50, +∞) | 0.72 | 17 |
你看,年龄越大,WOE越高,分数也越高。这就是评分卡“打分”的底层逻辑。而分数 = (WOE × 系数 + 截距) 再缩放得到的。具体公式后面再讲,今天先记住:WOE是一切分数的源头。
1.3 样本分层到底是什么意思?
好,关键来了。你手上有50万客户样本,里面只有1万是逾期的(坏客户)。如果你直接拿全量数据去算WOE,坏客户的分布会被大量好客户淹没。
比如年龄区间[18,25]里总共1000人,其中坏客户只有10个。好客户占比99%。但坏客户占总坏客户的比例可能是10/10000=0.1%,好客户占比是990/490000≈0.2%。两者差异很小,WOE算出来趋近于0,完全看不出这个区间的风险特征。
为什么会这样?因为样本不平衡!这就是为什么我们需要样本分层。说白了,就是把好客户和坏客户分开,分别计算各自在每个箱子里的分布比例,然后再算WOE。
样本分层的标准做法是:
- 分训练集和验证集:确保两层都有足够的坏样本。
- 按结果标签分层:计算WOE时,只看坏客户在每个箱子里的占比,以及好客户的占比,两者独立计算。
- 增加坏样本权重:如果坏样本太少,可以考虑加入过采样或欠采样。但注意,WOE计算本身不接受样本权重——它只看计数比例。
- 分箱后合并:每个箱子必须同时包含好客户和坏客户,否则WOE会变成无穷大。这是最容易踩的坑。
避坑指南:我曾经在项目中遇到一个特征“家庭年收入”,最高分箱里全是高净值人士,坏客户为零。WOE直接变成+∞,模型没法用。后来硬生生把那个箱子和临近箱子合并,才解决问题。切记:每个箱子里必须同时有好坏客户。
1.4 项目目标:从数据到评分卡
咱们这门实战课的目标非常清晰:给你一套真实脱敏数据集,带着你把WOE计算、样本分层、分箱、评分卡转换全流程走一遍。最后输出一张可直接上线的评分卡模型。
整个流程可以拆成7步:
- 数据探索:检查缺失率、异常值、分布。
- 分箱:对每个特征做最优分箱(比如用卡方分箱或决策树分箱)。
- WOE计算:基于分箱结果,按样本分层计算每个箱子的WOE。
- IV筛选:用信息量(Information Value)筛选最重要的特征。
- 模型训练:用WOE值替换原始特征,训练逻辑回归模型。
- 分数转换:把模型系数和截距映射成分数。
- 模型验证:KS、AUC、PSI,一个都不能少。
下面这张图帮你把整个项目框架刻在脑子里:
每个环节后面都会用真实数据演示。今天先把概念框架搭好,后面实战时你就能知道每一步在做什么。
1.5 课程能给你的价值
这门课不是讲理论,是手把手带你做。每一行代码我都会写出来,每个调参坑我都会告诉你。说白了,你跟着走完一遍,就能自己从零开始造一张评分卡。
我建议你先准备好Python环境和一份脱敏信贷数据集(课程会提供脱敏数据)。如果没有,用公开的give me some credit数据也行。关键在于理解思路。
重要提醒:WOE计算极度依赖样本分层。如果你遇到WOE值异常大或异常小,先检查分层对不对。我见过太多人把WOE算错了,最后模型上线被风控团队打回来重做。记住:分层不是可选项,是必选项。