WOE
woe是weight of evidence的缩写,是对原始自变量数据的一种编码方式。对特征变量进行分箱操作,得到的只是单纯的一个分组,并没有与组内标签值建立联系,而进行woe编码就是将分箱数据与标签值建立联系。
woe的计算公式
对于一个二分类问题,将特征划分为n个组,对于每一个组,都可以计算其woe值。用x_it表示第i组中正例数,用x_if表示第i组的负例数,用X_T和X_F分别表示负例总数和正例总数。
第i组的负例占总负例比率,
P
i
f
=
x
i
f
/
X
F
P_{if}=x_{if}/X_F
Pif=xif/XF
第i组的正例占总正例比率,
P
i
t
=
x
i
t
/
X
T
P_{it}=x_{it}/X_T
Pit=xit/XT
woe的计算公式如下:
W
O
E
i
=
l
n
(
P
i
f
/
P
i
t
)
{WOE}_i=ln(P_{if}/P_{it} )
WOEi=ln(Pif/Pit)
woe的意义
woe衡量了分箱数据各个组的组内正负例比率与样本总体正负例比率的差异,使用woe对分箱数据进行编码,形成的新的特征变量暴露值与类标签(因变量)有正向关系。woe值描述了特征变量分组对判断个体的类属性的影响方向和大小。如果一个个体样本特征变量值所属分组的woe值比较大,那么该样本响应负例的概率就比较大。
IV
IV是information value的缩写,即信息价值。
IV计算公式
对每个分组,
I
V
i
=
(
P
i
f
−
P
i
t
)
l
n
(
P
i
f
/
P
i
t
)
{IV}_i=(P_{if}-P_{it})ln(P_{if}/P_{it} )
IVi=(Pif−Pit)ln(Pif/Pit)
单个特征变量的信息价值为,
I
V
=
∑
(
i
=
1
)
n
I
V
i
IV=∑_{(i=1)^n}{IV}_i
IV=(i=1)n∑IVi
IV的意义
IV是单个特征变量的信息价值,即该特征变量对整个模型所能提供的信息,反映了该特征变量的预测能力,IV值越大,预测能力越强。可以用IV值来对特征的预测能力进行排序和筛选。
可以看到,特征的IV值是每个分组 I V i {IV}_i IVi的总和,那为什么不用woe值直接进行加总,而是要在woe前面乘以 ( P i f − P i t ) (P_{if}-P_{it}) (Pif−Pit)呢?
其实IV值可以看成是woe的加权求和,避免了极端情况下对信息价值的反映失真。例如,当变量的一个分组woe很高,但是该分组占样本总数的比例很小的情况时,虽然个体样本落在该分组时,能以极大的概率预测,但是样本落在该分组的概率却非常的小,综合来看,不能认为该变量具有很强的预测能力。而 ( P i f − P i t ) (P_{if}-P_{it}) (Pif−Pit)体现了分组占样本总数的比例。
简单探索一下 I V i IV_i IVi的取值范围
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建一个数据集
x = np.arange(0.0001, 1, 0.0001)
y = np.arange(0.0001, 1, 0.0001)
x, y = np.meshgrid(x, y)
z = (x - y) * np.log(x / y)
# 创建一个3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D线图
ax.plot_surface(x, y, z, cmap='viridis')
# 添加标签
ax.set_xlabel('$P_{if}$')
ax.set_ylabel('$P_{it}$')
ax.set_zlabel('Z')
# 显示图形
plt.show()
可以看到, I V i IV_{i} IVi的取值范围为 ( 0 , + ∞ ) (0, +∞) (0,+∞),当 P i f = P i t P_{if}=P_{it} Pif=Pit时, I V i IV_{i} IVi取值为0,当 P i f P_{if} Pif和 P i t P_{it} Pit分别接近0和1时, I V i IV_{i} IVi取值接近正无穷。从该图也可以看出,如果 P i f P_{if} Pif 和 P i t P_{it} Pit均比较小,但 P i f P_{if} Pif 或 P i t P_{it} Pit是对方的很多倍时, W O E i WOE_i WOEi可能比较大,但是 I V i IV_{i} IVi会比较小。