WOE和IV

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

img

进行WOE编码前,需要先把这个变量进行分组处理(离散化)

  其中,pyi是这个组中响应客户(即模型中预测变量取值为“是”或1的个体,也叫坏样本)占所有样本中所有响应客户的比例,pni是这个组中未响应客户(也叫好样本)占样本中所有未响应客户的比例;

  #yi是这个组中响应客户的数量,#ni是这个组中未响应客户的数量,#yT是样本中所有响应客户的数量,#nT是样本中所有未响应客户的数量。

  

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

  为了更简单明了一点,我们来做个简单变换,得:

img

  不难看出,woe表示的是当前这个组中响应客户和未响应客户的比值,和所有样本中这个比值的差异。这个差异是用这两个比值的比值,再取对数来表示的。例子如下:

Age#bad#goodWoe
0-1050200=ln((50/100)/(200/1000))=ln((50/200)/(100/1000))
10-1820200=ln((20/100)/(200/1000))=ln((20/200)/(100/1000))
18-355200=ln((5/100)/(200/1000))=ln((5/200)/(100/1000))
35-5015200=ln((15/100)/(200/1000))=ln((15/200)/(100/1000))
50以上10200=ln((10/100)/(200/1000))=ln((10/200)/(100/1000))
汇总1001000 

  WOE越大,这种差异越大,这个分组里的样本响应的可能性就越大,WOE越小,差异越小,这个分组里的样本响应的可能性就越小。woe反映的是在自变量每个分组下违约用户对正常用户占比和总体中违约用户对正常用户占比之间的差异;从而可以直观的认为woe蕴含了自变量取值对于目标变量(违约概率)的影响。再加上woe计算形式与logistic回归中目标变量的logistic转换(logist_p=ln(p/1-p))如此相似,因而可以将自变量woe值替代原先的自变量值。

  

那woe编码有什么意义呢?

很明显,它可以提升模型的预测效果,提高模型的可理解性。

  • 标准化的功能。

    WOE编码之后,自变量其实具备了某种标准化的性质,也就是说,自变量内部的各个取值之间都可以直接进行比较(WOE之间的比较)

  • 异常值处理。

一些极值变量,可以通过分组的WOE,变为非异常值

  • 检查变量WOE后与违约概率的关系

一般筛选的变量WOE与违约概率都是单调的,如果出现U型,或者其他曲线形状,则需要重新看下变量是否有问题。

  • 核查WOE变量模型的变量系数出现负值。

    如果最终模型的出来的系数出现负值,需要考虑是否出现了多重共线性的影响,或者变量计算逻辑问题。
      
    woe的意义,大家可以再体会一下。下面附上一段woe自编Code:


## 证据权重函数

def total_response(data,label):
    value_count = data[label].value_counts()
    return value_count
def woe(data,feature,label,label_value):
    '''
    data:传入需要做woe的特征和标签两列数据
    feature:特征名
    label:标签名
    label_value:接收字典,key为1,0,表示为响应和未响应,value为对应的值
    '''
    import pandas as pd 
    import numpy as np
    idx = pd.IndexSlice  # 创建一个对象以更轻松地执行多索引切片
    
    data['woe'] = 1
    groups = data.groupby([label,feature]).count().sort_index()
    
    ## 使用上述函数
    value_counts = total_response(data,label)

    resp_col = label_value[1]
    not_resp_col = label_value[0]
    resp = groups.loc[idx[resp_col,:]]/value_counts[resp_col]
    not_resp = groups.loc[idx[not_resp_col,:]]/value_counts[not_resp_col]
    Woe = np.log(resp/not_resp).fillna(0)
    return Woe

  

既然讲到这了,就再讲讲IV吧。

公式如下:
  1346146-20180904155217400-1912564729.png
有了一个变量各分组的IV值,我们就可以计算整个变量的IV值,方法很简单,就是把各分组的IV相加:
1346146-20180904155306168-730547897.png
其中,n为变量分组个数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WoLykos

若对你有所帮助,请鼓励我一下~

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

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

打赏作者

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

抵扣说明:

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

余额充值