WOE(Weight of Evidence) 证据权重#
https://blog.csdn.net/kevin7658/article/details/50780391
https://zhuanlan.zhihu.com/p/80134853
https://www.cnblogs.com/hanxiaosheng/p/9831838.html
https://www.cnblogs.com/hanxiaosheng/p/9831964.html
https://blog.csdn.net/PbGc396Dwxjb77F2je/article/details/99687952
WOE的定义#
- WOE是一种对原始自变量进行编码的格式,可以屏蔽极值增强鲁棒性。(树模型一般只对离散变量进行编码,对极值不敏感)
- 要对一个变量进行WOE编码,需要首先把这个变量进行分组处理/离散化处理(等宽切割,等频切割,卡方分箱,或者利用决策树来切割)。
- 分组后,对于第i组,WOE的计算公式如下:
- 其中:pyi为坏样本占所有坏样本的比例,py0好样本占所有好样本的比例;
- Bad为坏样本总数,Badi为变量i对应的坏样本个数,Good为好样本总数,Goodi为变量i对应的好样本个数 ;
- 将模型目标变量y为1记为违约用户(坏样本),对于目标变量为0记为正常用户(好样本)
Woe公式理解#
基础模式
- 即 WOE = ln (第i个分箱的坏人数 / 总坏人数) - ln (第i个分箱的好人数 / 总好人数)
- 此时可以理解为:每个分箱里的坏人(响应)分布相对于好人(未响应)分布之间的差异性。
变换模式
- WOE = ln (第i个分箱的坏人数 / 第i个分箱的好人数) - ln (总坏人数 / 总好人数)
- 此时可以理解为:每个分箱里的坏好比(Odds)相对于总体的坏好比之间的差异性。
WOE回顾:#
- 当前分组中,差异越大,响应的比例越大,WOE值越大;
- 反应的是特征的重要性,woe的绝对值越大,说明越重要。
- 当前分组WOE的正负,由当前分组响应和未响应的比例,与样本整体响应和未响应的比例的大小关系决定,当前分组的比例小于样本整体比例时,WOE为负,当前分组的比例大于整体比例时,WOE为正,当前分组的比例和整体比例相等时,WOE为0。
- WOE的取值范围是全体实数。(所以就不方便,需要IV缩放)
- WOE其实描述了变量当前这个分组,对判断个体是否会响应(或者说属于哪个类)所起到影响方向和大小,当WOE为正时,变量当前取值对判断个体是否会响应起到的正向的影响,当WOE为负时,起到了负向影响。而WOE值的大小,则是这个影响的大小的体现。
- 做完woe之后,LR系数不再代表特征的重要程度。
- woe后LR的时候要保证系数全都是正数!
- woe的符号代表特征对模型贡献的方向,系数如果不是正数就会改变这个方向。
- 但是做BiVar的时候已经分析了这个woe特征的贡献方向,如果LR再负数会扭曲推翻之前BiVar的分析。
- 优点:数值型转化为WOE可以增强鲁棒性,屏蔽极值的影响(极小值和极大值也被分组了)
- 但是树模型对极值不敏感,只用处理字符型即可
note:如果特征做了WOE,那么LR的系数不能代表特征重要性权重。(WOE绝对值大小已经是特征重要性了,LR的系数仅仅是拟合系数而已) woe后**如果是LR的时候要保证系数全都是正数! **woe的符号代表特征对模型贡献的方向,系数如果不是正数就会改变这个方向。 但是做BiVar的时候已经分析了这个woe特征的贡献方向,如果LR再负数会扭曲推翻之前BiVar的分析。
-
核心——分箱逻辑:
-
实现WOE最重要的是分箱逻辑,不同的分箱会带来不同的WOE。金融常使用“基于负样本占比差异最大化”原则来分箱
- 一般是5箱内最好,通常最多不超过10箱
- 每一箱的负样本占比差值尽可能大(箱合并原则)
- 每一箱的样本量不少于总体5%(不要太小,不要小于三五百个样本)
- 通过控制划分后的总箱数,来迭代进行分箱合并
IV值:可以认为是WOE的加权#
某个分箱的IV值:
有了一个变量各分组的IV值,我们就可以计算整个变量的IV值:
n是分箱的数量
- 对于变量的一个分组,这个分组的响应和未响应的比例与样本整体响应和未响应的比例相差越大,IV值越大,否则,IV值越小;
- 极端情况下,当前分组的响应和未响应的比例和样本整体的响应和未响应的比例相等时,IV值为0;
- IV值的取值范围是[0,+∞) ,且,当当前分组中只包含响应客户或者未响应客户时,IV = +∞。
- 故可以计算多个特征的IV值,按照从大到小排序来决定采用哪些特征更容易响应。(类似信息增益或者基尼指数的感觉)
- IV比如要大于0.05才比较好用
- 谨慎的时候会要求IV大于0.02就可以先留着,也就是说IV在0.02-0.5之间
- 超过0.5的特征会被直接拿去作为策略------------->IV太大的值可能会把模型其他特征的信息覆盖掉,也可能会造成过拟合。(如果这个特征以后抖动,造成线上效果波动)
计算woe和IV的步骤#
- step 1. 对于连续型变量,进行分箱(binning),可以选择等频、等距,或者自定义间隔;对于离散型变量,如果分箱太多,则进行分箱合并。
- step 2. 统计每个分箱里的好人数(bin_goods)和坏人数(bin_bads)。
- step 3. 分别除以总的好人数(total_goods)和坏人数(total_bads),得到每个分箱内的边际好人占比(margin_good_rate)和边际坏人占比(margin_bad_rate)。
- step 4. 计算每个分箱里的WOE [公式]
- step 5. 检查每个分箱(除null分箱外)里woe值是否满足单调性(bivar),若不满足,返回step1。注意⚠️:null分箱由于有明确的业务解释,因此不需要考虑满足单调性。
- step 6. 计算每个分箱里的IV,最终求和,即得到最终的IV。
备注:好人 = 正常用户,坏人 = 逾期用户
计算注意点#
-
分箱时需要注意样本量充足,保证统计意义。
-
若相邻分箱的WOE值相同(非常相近),则将其合并为一个分箱。
-
当一个分箱内只有好人或坏人时(会出现∞),可对WOE公式进行修正如下:
-
在实践中,我们还需跨数据集检验WOE分箱的单调性。如果在训练集上保持单调,但在验证集和测试集上发生翻转而不单调,那么说明分箱并不合理,需要再次调整。(BIVAR)
-
或者当分箱中只有好人或坏人的时候,也可以这么做:
- 如果可能,直接把这个分组做成一个规则,作为模型的前置条件或补充条件;(即不允许这种分箱存在)
- 重新对变量进行离散化或分组,使每个分组的响应比例都不为0且不为100%,尤其是当一个分组个体数很小时(比如小于100个),强烈建议这样做,因为本身把一个分组个体数弄得很小就不是太合理。
- 如果上面两种方法都无法使用,建议人工把该分组的响应数和非响应的数量进行一定的调整。如果响应数原本为0,可以人工调整响应数为1,如果非响应数原本为0,可以人工调整非响应数为1.(或者按照上面进行修正,分子分母都加0.5)
WOE和IV的比较----为什么不用WOE,而是用IV值#
变量各分组的WOE和IV都隐含着这个分组对目标变量的预测能力这样的意义,但是有以下问题:
1. 各个组的WOE有正有负
解释:
- 假设构造一个$ WOE=\sum_i^n{WOE_i} ,那么因为里面的WOE_i$有正有负,所以求和不好表征。
2.每个组的WOE没有考虑到这个各个组在总体的占比
解释:
- 即使构造一个规避上面的负数问题,但是每个组的信息含量(泛化能力?)是不相同的,比如某个组很高但是这个组只有很少的样本,把他直接和另外一个很多样本但很低的相加是很不合适的。

假设某特征A分两组,从这个表我们可以看到,变量取1时,响应比达到90%,对应的WOE很高,但对应的IV却很低,原因就在于IV在WOE的前面乘以了一个系数
- 而这个系数很好的考虑了这个分组中样本占整体样本的比例,比例越低,这个分组对变量整体预测能力的贡献越低。
- 相反,如果直接用WOE的绝对值加和,会得到一个很高的指标,这是不合理的。
通用WOE计算实现#
1 | # -*- coding: utf-8 -*- |