4. WOE计算

在评分卡与风控建模中,WOE(Weight of Evidence,证据权重)不是“把类别变量转成数值”这么简单。它同时承担三件事:把非线性关系线性化、把不同量纲的分箱统一到同一尺度、把业务风险方向显式编码。理解WOE,必须从公式推导开始,再落到正负样本定义、平滑处理、零频问题与业务可解释性。

一、核心原理:WOE公式推导与正负样本定义

设某个特征被分为若干箱,对第 i 箱,记正样本(通常为“坏客户”,如违约、逾期、欺诈)数量为 Bad_i,负样本(通常为“好客户”,如正常履约)数量为 Good_i。总正样本数为 Bad_T,总负样本数为 Good_T。则第 i 箱的WOE定义为:

WOE_i = ln( (Bad_i / Bad_T) / (Good_i / Good_T) )

进一步可写成:

WOE_i = ln( (Bad_i / Good_i) / (Bad_T / Good_T) )

这个形式更直观:分子是该箱内坏好比,分母是整体坏好比。WOE衡量的是“该箱的坏好比相对于整体坏好比的倍数”,取对数后使乘法关系变为加法关系。若WOE为正,说明该箱坏样本占比高于整体,风险偏高;若WOE为负,说明该箱坏样本占比低于整体,风险偏低。

正负样本定义必须与业务目标一致。在信用评分卡中,通常将“坏”定义为逾期90天以上、违约、欺诈等;将“好”定义为正常履约或轻微逾期。若定义反了,WOE方向会整体反转,后续逻辑回归系数解释也会相反。因此,在计算前必须明确:谁是正样本、谁是负样本、样本窗口与观察期是什么。

WOE的符号方向由“正样本定义”决定。若把“好客户”定义为正样本,则WOE为正表示该箱好客户占比高,风险低。建模时务必在文档中固定定义,避免团队协作时方向混乱。

二、方法流程:从分箱到WOE计算

WOE计算通常嵌入在分箱之后。一个可复用的流程如下:

  1. 确定正负样本标签,统计总正样本数 Bad_T 与总负样本数 Good_T。
  2. 对连续变量进行分箱,或对类别变量进行类别合并,得到若干箱。
  3. 统计每箱的 Bad_i 与 Good_i。
  4. 对零频进行平滑处理,避免除零或无穷大。
  5. 按公式计算每箱WOE,并检查单调性。
  6. 用WOE替换原始特征值,形成建模输入。

下面是一个Python示例,展示带平滑的WOE计算:

import numpy as np
import pandas as pd

def calc_woe(df, feature, target, pos_label=1, eps=0.5):
    # target: 1表示正样本(坏),0表示负样本(好)
    total_bad = (df[target] == pos_label).sum()
    total_good = (df[target] != pos_label).sum()
    grouped = df.groupby(feature)[target].agg(
        bad=lambda x: (x == pos_label).sum(),
        good=lambda x: (x != pos_label).sum()
    ).reset_index()
    # 平滑处理:对零频加eps
    grouped['bad_smooth'] = grouped['bad'] + eps
    grouped['good_smooth'] = grouped['good'] + eps
    grouped['bad_rate'] = grouped['bad_smooth'] / total_bad
    grouped['good_rate'] = grouped['good_smooth'] / total_good
    grouped['woe'] = np.log(grouped['bad_rate'] / grouped['good_rate'])
    grouped['iv'] = (grouped['bad_rate'] - grouped['good_rate']) * grouped['woe']
    return grouped

该函数返回每箱的坏样本数、好样本数、平滑后占比、WOE与IV贡献。实际工程中,eps的取值需要结合样本量调整:样本量大时可取0.5或1,样本量小时可适当增大,但不宜过大,否则会削弱区分度。

三、零频问题与平滑处理

零频是WOE计算中最常见的工程问题。若某箱 Bad_i = 0,则 Bad_i / Bad_T = 0,取对数后为负无穷;若 Good_i = 0,则分母为0,WOE为正无穷。无穷大无法直接进入模型,也会破坏后续IV计算与单调性判断。

常见处理方式有三类:

方法 做法 优点 风险
拉普拉斯平滑 对每箱坏/好样本数加一个小常数 eps 简单、稳定、可批量处理 eps过大将压缩WOE差异
合并零频箱 将零频箱与相邻箱合并 保留业务可解释性 可能损失细分信息
贝叶斯平滑 用整体坏好比作为先验进行收缩 统计上更严谨 实现复杂,需调参
不要直接对零频箱赋WOE=0。WOE=0意味着该箱坏好比等于整体坏好比,这与“该箱没有坏样本”或“没有好样本”的事实不符,会引入错误的风险信号。

四、业务可解释性与常见误区复盘

WOE的最大价值之一是业务可解释性。由于WOE是坏好比的对数倍数,业务人员可以直接理解:WOE为正且越大,该箱风险越高;WOE为负且越小,该箱风险越低。若分箱后WOE随箱序单调递增或递减,则说明特征与风险之间存在稳定方向关系,这对评分卡的可解释性与稳定性至关重要。

但实际项目中常见以下误区:

  • 正负样本定义反复横跳:不同特征用不同定义,导致WOE方向混乱,模型系数无法统一解释。
  • 忽略零频直接取对数:产生inf或nan,后续IV计算与模型训练报错。
  • 平滑过度:eps取太大,所有箱WOE被拉向0,特征区分度被严重削弱。
  • 只看IV不看单调性:IV高但WOE上下震荡,模型稳定性差,业务不敢用。
  • 用WOE替代业务判断:WOE是统计编码,不能替代对客群、产品、经济周期的业务理解。

一个实用的复盘清单如下:

  1. 正负样本定义是否在项目文档中固定并全员确认?
  2. 每箱坏/好样本数是否都大于0?若为0,采用哪种平滑或合并策略?
  3. WOE方向是否符合业务常识?例如“逾期次数越多,WOE应越大”。
  4. WOE是否随分箱单调?若不单调,是否考虑合并相邻箱?
  5. IV是否主要来自少数箱?是否存在过拟合风险?
  6. 平滑参数是否经过敏感性测试?
WOE计算的核心不是公式本身,而是“定义一致、零频可控、方向可解释、单调可验证”。把这四点做好,WOE才能真正成为评分卡中稳定、可解释、可落地的特征编码方式。