评分卡模型基础:逻辑回归原理、WOE编码、IV值计算与特征筛选
信用评分卡模型的核心是使用逻辑回归(Logistic Regression)作为分类器,结合WOE(Weight of Evidence,证据权重)编码和IV(Information Value,信息量)值进行特征筛选。本章将系统讲解这三者的原理、计算方法和在评分卡构建中的实际应用。
2.1 逻辑回归原理
逻辑回归是一种广义线性模型,用于解决二分类问题。在信用评分中,它预测借款人“违约”的概率(P),输出值在0到1之间。
核心公式:
logit(P) = ln(P / (1 - P)) = β₀ + β₁X₁ + β₂X₂ + ... + βₙXₙ
其中:
- P:违约概率
- 1-P:正常概率
- ln(P/(1-P)):对数几率(Log-odds)
- β₀:截距项
- βᵢ:特征Xᵢ的回归系数
通过Sigmoid函数将线性回归结果映射到概率空间:
P = 1 / (1 + e^(-z)),其中 z = β₀ + β₁X₁ + ... + βₙXₙ
关键理解:逻辑回归的系数βᵢ直接反映了特征对违约对数几率的影响方向与强度。正系数表示该特征值越大,违约概率越高;负系数则相反。
2.2 WOE编码原理与计算
WOE(证据权重)是一种将原始特征(尤其是分箱后的类别特征)转换为连续变量的编码方式,它衡量了每个分箱中“好客户”与“坏客户”分布的差异。
WOE计算公式:
WOEᵢ = ln( (坏客户占比ᵢ) / (好客户占比ᵢ) ) = ln( (Badᵢ / Bad_total) / (Goodᵢ / Good_total) )
其中:
- Badᵢ:第i个分箱中的违约客户数
- Goodᵢ:第i个分箱中的正常客户数
- Bad_total:全部违约客户总数
- Good_total:全部正常客户总数
WOE编码的直观含义:
- WOE > 0:该分箱中坏客户占比高于好客户占比,违约风险较高
- WOE < 0:该分箱中好客户占比高于坏客户占比,违约风险较低
- WOE = 0:该分箱中好坏客户分布与整体一致,无区分能力
实践建议:WOE编码天然建立了特征与对数几率的线性关系,因此逻辑回归模型可以直接使用WOE值作为输入,无需额外处理非线性关系。这是评分卡模型的标准做法。
2.3 IV值计算与特征筛选
IV(信息量)值用于衡量一个特征对目标变量(违约/正常)的区分能力,是特征筛选的核心指标。它基于WOE值计算得出。
IV计算公式:
IV = Σᵢ [ (Badᵢ/Bad_total - Goodᵢ/Good_total) × WOEᵢ ]
其中i遍历所有分箱。
IV值评估标准:
| IV值范围 | 预测能力 | 处理建议 |
|---|---|---|
| < 0.02 | 无预测能力 | 删除 |
| 0.02 ~ 0.10 | 弱预测能力 | 可保留,但需谨慎 |
| 0.10 ~ 0.30 | 中等预测能力 | 推荐保留 |
| 0.30 ~ 0.50 | 强预测能力 | 优先保留 |
| > 0.50 | 可疑(可能过拟合) | 需验证稳定性 |
注意:IV值过高(>0.5)的特征可能存在过拟合风险,或与目标变量存在高度偶然的相关性。在评分卡建模中,建议结合业务逻辑和变量稳定性(PSI)综合判断。
2.4 特征筛选流程
特征筛选是评分卡建模的关键步骤,通常遵循以下流程:
- 初步筛选:删除缺失率>70%、单一值占比>95%的特征
- 分箱与WOE编码:对连续变量进行等频/等距/最优分箱,计算每个分箱的WOE值
- IV值计算:基于WOE计算每个特征的IV值
- IV阈值筛选:保留IV > 0.02的特征,优先选择IV > 0.10的特征
- 相关性分析:删除高度相关(|r| > 0.7)的特征对中IV值较低的一个
- 逐步回归/业务确认:使用统计显著性(p值)和业务可解释性最终确定特征集
2.5 逻辑回归与WOE的协同关系
在评分卡模型中,逻辑回归直接使用WOE编码后的特征作为输入,这种组合具有以下优势:
- 线性化:WOE编码将非线性关系转化为线性关系,使逻辑回归能够有效拟合
- 标准化:不同量纲的特征经过WOE编码后,系数可直接比较重要性
- 缺失值处理:缺失值可单独作为一个分箱,计算其WOE值,无需额外插补
- 业务可解释:WOE的正负方向与业务逻辑一致,便于向业务人员解释
评分卡分数转换:逻辑回归输出的对数几率(Log-odds)通过线性变换转换为标准评分卡分数:
Score = Offset + Factor × ln(Odds)
其中Offset和Factor由预设的基准分数和PDO(Points to Double the Odds)决定。
Score = Offset + Factor × ln(Odds)
其中Offset和Factor由预设的基准分数和PDO(Points to Double the Odds)决定。
2.6 代码示例:WOE与IV计算
import pandas as pd
import numpy as np
def calc_woe_iv(df, feature, target):
"""
计算单个特征的WOE和IV值
:param df: DataFrame
:param feature: 特征名
:param target: 目标变量名(0=好客户,1=坏客户)
:return: WOE字典, IV值
"""
total_bad = df[target].sum()
total_good = len(df) - total_bad
grouped = df.groupby(feature)[target].agg(['count', 'sum'])
grouped.columns = ['total', 'bad']
grouped['good'] = grouped['total'] - grouped['bad']
grouped['bad_pct'] = grouped['bad'] / total_bad
grouped['good_pct'] = grouped['good'] / total_good
# 避免除零
grouped['bad_pct'] = grouped['bad_pct'].replace(0, 0.0001)
grouped['good_pct'] = grouped['good_pct'].replace(0, 0.0001)
grouped['woe'] = np.log(grouped['bad_pct'] / grouped['good_pct'])
grouped['iv'] = (grouped['bad_pct'] - grouped['good_pct']) * grouped['woe']
woe_dict = grouped['woe'].to_dict()
iv = grouped['iv'].sum()
return woe_dict, iv
# 示例使用
# woe_dict, iv_value = calc_woe_iv(data, 'age_bin', 'is_default')
# print(f"IV值: {iv_value:.4f}")