【风控】特征评估指标WOE和IV值

一、定义

1.1 WOE(Weight of Evidence)定义与原理

WOE 是“Weight of Evidence”的缩写,直译为“证据权重”,用来衡量某个特征分箱中“坏人”与“好人”之间的分布差异性。
WOE 的基本定义如下:
W O E i = ln ⁡ ( bad i / total bad good i / total good ) WOE_i = \ln \left( \frac{\text{bad}_i / \text{total bad}}{\text{good}_i / \text{total good}} \right) WOEi=ln(goodi/total goodbadi/total bad)
其含义可以进一步展开为:

W O E i = ln ⁡ ( bad i good i ) − ln ⁡ ( total bad total good ) WOE_i = \ln \left( \frac{\text{bad}_i}{\text{good}_i} \right) - \ln \left( \frac{\text{total bad}}{\text{total good}} \right) WOEi=ln(goodibadi)ln(total goodtotal bad)

即:每个分箱中的坏好比(Odds)相对于总体的坏好比之间的差异性
换句话说,WOE 描述了每个分箱的观测结果相较于总体分布的“证据强度”差异。当 WOE 为正时,表示该分箱中坏人比重较大;为负时表示好人比重较大;接近 0 时说明该分箱与总体无明显差异。

1.2 IV(Information Value)定义与变换

IV 是“Information Value”的缩写,是在风控建模中用来度量特征对目标变量(如好/坏用户)预测能力的指标。
IV 的定义如下:
I V = ∑ i = 1 n ( bad_rate i − good_rate i ) × W O E i IV = \sum_{i=1}^{n} (\text{bad\_rate}_i - \text{good\_rate}_i) \times WOE_i IV=i=1n(bad_rateigood_ratei)×WOEi
其中:

  • bad_rate i = bad i total bad \text{bad\_rate}_i = \frac{\text{bad}_i}{\text{total bad}} bad_ratei=total badbadi
  • good_rate i = good i total good \text{good\_rate}_i = \frac{\text{good}_i}{\text{total good}} good_ratei=total goodgoodi
    IV 本质上是 WOE 的加权和,其形式与信息论中的“相对熵”(KL散度)一致,表示总体坏好人分布在每个分箱上的差异程度。
    IV 可以改写为:
    I V = ∑ i = 1 n ( bad i total bad ) ln ⁡ ( bad i / total bad good i / total good ) IV = \sum_{i=1}^{n} \left( \frac{\text{bad}_i}{\text{total bad}} \right) \ln \left( \frac{\text{bad}_i / \text{total bad}}{\text{good}_i / \text{total good}} \right) IV=i=1n(total badbadi)ln(goodi/total goodbadi/total bad)

这就将其与 WOE 的公式连接起来,进一步揭示了 IV 的信息含义:衡量每个分箱的坏人分布相对于好人分布的信息增益。分箱之间差异越大,IV 越高,说明该变量具有更强的区分能力。

二、计算步骤

  1. 分箱(Binning)

    • 连续变量:等频、等距或基于业务自定义。
    • 离散变量:合并稀疏类别。
  2. 统计分箱好坏数

    • bin_good_i、bin_bad_i,及总体 good_total、bad_total。
  3. 计算边际占比

    • d i s t _ g o o d i = b i n _ g o o d i / g o o d _ t o t a l dist\_good_i = bin\_good_i / good\_total dist_goodi=bin_goodi/good_total
    • d i s t _ b a d i = b i n _ b a d i / b a d _ t o t a l dist\_bad_i = bin\_bad_i / bad\_total dist_badi=bin_badi/bad_total
  4. 计算 WOE

    • W O E i = ln ⁡ ( d i s t _ b a d i ) − ln ⁡ ( d i s t _ g o o d i ) WOE_i = \ln(dist\_bad_i) - \ln(dist\_good_i) WOEi=ln(dist_badi)ln(dist_goodi)
  5. 检查单调性与合并

    • 若 WOE 曲线不单调,需调整分箱或合并相邻箱。
  6. 计算 IV

    • I V = ∑ i ( d i s t _ b a d i − d i s t _ g o o d i ) × W O E i IV = \sum_i (dist\_bad_i - dist\_good_i) \times WOE_i IV=i(dist_badidist_goodi)×WOEi
  7. 跨集稳定性检验

    • 在验证集/测试集上重复计算,确保单调性与IV值稳定。

三、公式来源与理论支撑

3.1 贝叶斯视角

从贝叶斯定理:

ln ⁡ P ( Y = 1 ∣ X ) P ( Y = 0 ∣ X ) = ln ⁡ P ( Y = 1 ) P ( Y = 0 ) + ln ⁡ P ( X ∣ Y = 1 ) P ( X ∣ Y = 0 ) \ln\frac{P(Y=1 \mid X)}{P(Y=0 \mid X)} = \ln\frac{P(Y=1)}{P(Y=0)} + \ln\frac{P(X \mid Y=1)}{P(X \mid Y=0)} lnP(Y=0X)P(Y=1X)=lnP(Y=0)P(Y=1)+lnP(XY=0)P(XY=1)

  • 先验项 ln ⁡ P ( Y = 1 ) P ( Y = 0 ) \ln\frac{P(Y=1)}{P(Y=0)} lnP(Y=0)P(Y=1)
  • 证据项(WOE) ln ⁡ P ( X ∣ Y = 1 ) P ( X ∣ Y = 0 ) \ln\frac{P(X \mid Y=1)}{P(X \mid Y=0)} lnP(XY=0)P(XY=1)
    WOE 正是特征对先验 Odds 的信息增量。

3.2 信息论视角

IV 等价于两分布间的相对熵(KL 散度)
D K L ( P 1 ∥ P 0 ) = ∑ i P 1 ( i ) ln ⁡ P 1 ( i ) P 0 ( i ) D_{KL}(P_1 \parallel P_0) = \sum_i P_1(i) \ln \frac{P_1(i)}{P_0(i)} DKL(P1P0)=iP1(i)lnP0(i)P1(i)

  • P 1 = P ( X ∣ Y = 1 ) P_1 = P(X\mid Y=1) P1=P(XY=1) P 0 = P ( X ∣ Y = 0 ) P_0 = P(X\mid Y=0) P0=P(XY=0),即可看出 IV 从信息量角度衡量分布差异。

四、与评分卡(Logistic 回归)的关系

  • Logistic 回归模型:

ln ⁡ P ( Y = 1 ∣ X ) P ( Y = 0 ∣ X ) = β 0 + ∑ j β j   X j \ln\frac{P(Y=1\mid X)}{P(Y=0\mid X)} = \beta_0 + \sum_j \beta_j \, X_j lnP(Y=0X)P(Y=1X)=β0+jβjXj

  • 若用 WOE 变量代替原始 X j X_j Xj,那么系数 β j \beta_j βj即衡量该分箱的证据权重与评分点的映射。
  • 单调的 WOE 曲线可确保评分点随特征单调变化,提升可解释性与业务落地。

五、风控中的业务应用

  1. 缺失值与异常值:将 null 或极端值单独成箱,保证无信息丢失。
  2. 特征选择:利用 IV 快速筛除弱变量,降低维度。
  3. 稳健建模:WOE 变换后,对噪声与尺度敏感性弱,LR 收敛更快。
  4. 可解释报表:通过 WOE 曲线与 IV 分析,向业务部门展示变量效力。

六、Python 计算示例

import pandas as pd
import numpy as np

def compute_woe_iv(df, feature, target, bins=10):
    # 分箱
    df['bin'] = pd.qcut(df[feature], q=bins, duplicates='drop')
    # 统计
    grouped = df.groupby('bin')[target].agg(['count', 'sum'])
    grouped.columns = ['total', 'bad']
    grouped['good'] = grouped['total'] - grouped['bad']

    # 总体
    total_bad = grouped['bad'].sum()
    total_good = grouped['good'].sum()

    # 边际分布
    grouped['dist_bad'] = grouped['bad'] / total_bad
    grouped['dist_good'] = grouped['good'] / total_good

    # WOE 与 IV
    grouped['woe'] = np.log(grouped['dist_bad'] / grouped['dist_good'])
    grouped['iv'] = (grouped['dist_bad'] - grouped['dist_good']) * grouped['woe']

    # 返回
    iv_value = grouped['iv'].sum()
    return grouped[['total','bad','good','dist_bad','dist_good','woe','iv']], iv_value

# 示例用法
df = pd.read_csv('data.csv')
woe_table, iv = compute_woe_iv(df, feature='age', target='is_bad', bins=5)
print(woe_table)
print(f"IV = {iv:.4f}")
IV(Information Value)是指标筛选中常用的评价指标,用于衡量自变量对于因变量的影响程度。在风险控制中,IV指标常用于评估某个特征对于坏客户的区分度,以及评估特征对于建立预测模型的贡献度。 IV的计算公式如下: $$IV=\sum_{i=1}^{k}(\frac{good\%_i-bad\%_i}{100}\times WOE_i)$$ 其中,$k$ 表示特征的个数,$good\%_i$ 表示第 $i$ 个取下好客户的占比,$bad\%_i$ 表示第 $i$ 个取下坏客户的占比,$WOE_i$ 表示第 $i$ 个取下的WOE,可以通过下面的公式计算: $$WOE_i=ln(\frac{good\%_i}{bad\%_i})$$ 在 Python 中可以通过以下代码实现 IV 的计算: ``` python def calc_iv(df, feature, target): lst = [] cols = ['Variable', 'Value', 'All', 'Good', 'Bad'] for i in range(df[feature].nunique()): val = list(df[feature].unique())[i] lst.append([feature, val, len(df[df[feature] == val]), len(df[(df[feature] == val) & (df[target] == 0)]), len(df[(df[feature] == val) & (df[target] == 1)])]) data = pd.DataFrame(lst, columns=cols) data = data[data['Bad'] > 0] data['All_Distr'] = data['All'] / data['All'].sum() data['Good_Distr'] = data['Good'] / data['Good'].sum() data['Bad_Distr'] = data['Bad'] / data['Bad'].sum() data['WoE'] = np.log(data['Good_Distr'] / data['Bad_Distr']) data['IV'] = (data['Good_Distr'] - data['Bad_Distr']) * data['WoE'] data['Variable'] = feature return data['IV'].sum() ``` 其中,`df` 表示数据集,`feature` 表示特征列名,`target` 表示目标列名。函数返回计算得到的 IV 。需要注意的是,在计算 IV 时,需要对特征的取进行分组,每个组内至少包含一定数量的坏客户,避免计算时分母为零的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油泼辣子多加

感谢大佬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值