WOE编码和IV信息量

  • WOE

WOE的全称是“Weight of Evidence”,即证据权重。WOE是对原始自变量的一种编码形式。

要对一个变量进行WOE编码,需要首先把这个变量进行分组处理(也叫离散化、分箱等等,说的都是一个意思)。分组后,对于第i组,WOE的计算公式如下:

 

 

其中,pyi是这个组中响应客户(风险模型中,对应的是违约客户,总之,指的是模型中预测变量取值为“是”或者说1的个体)占所有样本中所有响应客户的比例,pni是这个组中未响应客户占样本中所有未响应客户的比例,#yi是这个组中响应客户的数量,#ni是这个组中未响应客户的数量,#yT是样本中所有响应客户的数量,#nT是样本中所有未响应客户的数量。

从这个公式中我们可以体会到,WOE表示的实际上是“当前分组中响应客户占所有响应客户的比例”和“当前分组中没有响应的客户占所有没有响应的客户的比例”的差异。

对这个公式做一个简单变换,可以得到:

 

变换以后我们可以看出,WOE也可以这么理解,他表示的是当前这个组中响应的客户和未响应客户的比值,和所有样本中这个比值的差异。这个差异是用这两个比值的比值,再取对数来表示的。WOE越大,这种差异越大,这个分组里的样本响应的可能性就越大,WOE越小,差异越小,这个分组里的样本响应的可能性就越小。

  • IV

对于一个分组后的变量,第i 组的WOE前面已经介绍过,是这样计算的:

 

同样,对于分组i,也会有一个对应的IV值,计算公式如下:

 

有了一个变量各分组的IV值,我们就可以计算整个变量的IV值,方法很简单,就是把各分组的IV相加:

 

其中,n为变量分组个数。

  • 为什么用IV而不是直接用WOE

IV和WOE的差别在于IV在WOE基础上乘以的那个,我们暂且用pyn来代表这个值。

第一个原因,当我们衡量一个变量的预测能力时,我们所使用的指标值不应该是负数,否则,说一个变量的预测能力的指标是-2.3,听起来很别扭。从这个角度讲,乘以pyn这个系数,保证了变量每个分组的结果都是非负数,你可以验证一下,当一个分组的WOE是正数时,pyn也是正数,当一个分组的WOE是负数时,pyn也是负数,而当一个分组的WOE=0时,pyn也是0。

第二个原因,上面的原因不是最主要的,因为其实我们上面提到的这个指标也可以完全避免负数的出现。

更主要的原因就在于IV在WOE的前面乘以了一个系数,而这个系数很好的考虑了这个分组中样本占整体样本的比例,比例越低,这个分组对变量整体预测能力的贡献越低。相反,如果直接用WOE的绝对值加和,会得到一个很高的指标,这是不合理的。

  • IV的极端情况以及处理方式

IVi无论等于负无穷还是正无穷,都是没有意义的。

由上述问题我们可以看到,使用IV其实有一个缺点,就是不能自动处理变量的分组中出现响应比例为0或100%的情况。那么,遇到响应比例为0或者100%的情况,我们应该怎么做呢?建议如下:

(1)如果可能,直接把这个分组做成一个规则,作为模型的前置条件或补充条件;

(2)重新对变量进行离散化或分组,使每个分组的响应比例都不为0且不为100%,尤其是当一个分组个体数很小时(比如小于100个),强烈建议这样做,因为本身把一个分组个体数弄得很小就不是太合理。

(3)如果上面两种方法都无法使用,建议人工把该分组的响应数和非响应的数量进行一定的调整。如果响应数原本为0,可以人工调整响应数为1,如果非响应数原本为0,可以人工调整非响应数为1.

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WOE编码是一种常用的特征工程方法,它的全称为Weight of Evidence,即证据权重编码。在WOE编码中,IV值(Information Value)是一项重要的指标,用于衡量一个特征的预测能力和与目标变量之间的关联程度。IV值越高,表示该特征对目标变量的预测能力越强。 在WOE编码中,我们需要进行IV值的检验,以确保编码的准确性和有效性。下面是一种常用的IV值检验方法,可以通过Python进行实现: ```python import numpy as np import pandas as pd def iv_check(df, col, target): """ 计算指定特征的IV值,并进行检验 :param df: 数据集 :param col: 特征列名 :param target: 目标变量列名 :return: IV值 """ # 计算该特征每个取值的数量和占比 freq = pd.DataFrame({'total': df.groupby(col)[target].count(), 'bad': df.groupby(col)[target].sum()}) freq['good'] = freq['total'] - freq['bad'] freq['bad_rate'] = freq['bad'] / freq['bad'].sum() freq['good_rate'] = freq['good'] / freq['good'].sum() freq['woe'] = np.log(freq['good_rate'] / freq['bad_rate']) # 计算IV值 freq['iv'] = (freq['good_rate'] - freq['bad_rate']) * freq['woe'] iv = freq['iv'].sum() # 进行IV值检验 if iv < 0.02: print('Warning: the IV value of feature {} is too low ({:.4f}), which indicates that it has weak predictive power.'.format(col, iv)) elif iv > 0.5: print('Warning: the IV value of feature {} is too high ({:.4f}), which indicates that it may be highly correlated with the target variable.'.format(col, iv)) else: print('The IV value of feature {} is {:.4f}, which indicates that it has moderate predictive power.'.format(col, iv)) return iv ``` 这个函数的输入参数包括数据集`df`、特征列名`col`和目标变量列名`target`,输出IV值并进行检验。在函数中,我们首先计算了该特征每个取值的数量、坏样本数量、好样本数量、坏样本率、好样本率和WOE值,然后根据IV值的公式计算了每个取值对应的IV值,并将它们相加得到总的IV值。最后,根据IV值的大小进行检验并输出相应的警告信息。 需要注意的是,IV值的大小并不是绝对的,不同的行业和应用场景可能对IV值的要求不同。一般来说,IV值在0.02到0.5之间被认为是合理的,具体的取值范围需要根据实际情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值