WOE编码与IV值

参考:
WOE与IV值浅谈
机器学习-变量筛选之IV值和WOE

0. Introduction

WOE (weight of evidence): 证据权重
IV (information value): 信息值

计算 WOE 与 IV 值的意义:
(1)用 woe 编码可以处理缺失值问题。
(2)IV值可以衡量各变量对 y 的 预测能力,用于筛选变量。IV值越大,表示该变量的预测能力越强。
(3)对离散型变量,woe 可以观察组间的跳转对 odds 的提升是否呈线性,而 IV 可以衡量变量整体(而不是每个 group)的预测能力。
(4)对连续型变量,woe 和 IV 值为分箱的合理性提供了一定的依据。

1. WOE

1.1 WOE的计算方式

对于某变量,

[WOE_i = ln(\frac{#B_i/#B_T}{#G_i/#G_T}), i=1,…,n(n为取值个数) ]

其中 (i) 表示变量的第 (i) 个分箱(也即第 (i) 个取值),即 一个变量的每个分箱都有一个 WOE 值

(#B_i) 是第 (i) 箱中坏客户(label=1)的人数
(#G_i) 是第 (i) 箱中好客户(label=0)的人数
(#B_T) 是总共坏客户人数
(#G_T) 是总共好客户人数

实质上WOE表示的是 当前分箱中好坏客户的比例总体好坏客户比例 的差异

如果WOE的 绝对值越大,这种差异就越明显, 绝对值越小就表明差异越不明显。如果WOE为0,则说明该分箱中好坏客户比例等于随机好坏客户比值,此时这个分箱就无预测能力。

WOE 可以理解为 当前组中正负样本的比值,与所有样本中正负样本比值的差异。这个差异是用这两个比值的比值,再取对数来表示的。
WOE>0表示当前组正负样本比例大于总体的正负样本比例,值越大表示这个分组里的样本响应的可能性越大;
WOE

WOE编码与IV值

1.2 WOE编码的好处

逻辑回归假设

[log(odds)=log(\frac{p}{1-p})=\theta_0+\theta_1x_1+…+\theta_px_p ]

通常等式左边不会与等式右边呈线性关系,需要对 (x) 作变换 (T(\cdot)),让 (T(x)) 与 (log(odds)) 线性相关。
(1)可以证明 WOE 是其中一种比较好的把自变量转化为与 (log(odds)) 线性相关的有效形式
(2)所有变量被 WOE 编码标准化后,求解得到的系数取值都在同一范围,可以直接比较不同自变量对 (odds) 的影响

1.3 对于连续型变量,如何进行WOE编码

在计算WOE编码前需要对连续型变量进行分箱(binning)处理,将其转化为离散型,再进行WOE编码。

1.3.1 分箱数量

一般来说10~20个分箱足够了,因为每个分箱应保证不少于5%的样本数。分箱数量决定了平滑程度,分箱数越少平滑度越高。所以一般采用先精细分箱(fine classing),初始将箱数分成20~50个箱,然后进行粗分箱(coarse classing),利用IV值、基尼系数、卡方统计量等值将箱数合并,通常最多10箱。目的是通过创建更少的箱子来实现简化,每个箱子具有明显不同的风险因子,同时最小化信息损失。

如果缺失值有预测能力,则将缺失值单独分作一箱或者是合并到拥有相似风险因子的分箱中去。

为什么不分1000箱?更少的箱数能够捕捉到数据中的重要模式,同时忽略噪声。当某一分箱中样本数少于5%,则该箱可能不是数据分布的一个真实反映,也可能导致模型不稳定。

1.3.2 处理分箱中没有响应样本或者全部是响应样本

可以用以下公式修正

[WOE_i = ln(\frac{(#B_i+0.5)/#B_T}{(#G_i+0.5)/#G_T}) ]

1.3.3 如何用WOE检查分箱的正确性

(1)WOE最好应该呈单调趋势

(2)在预测变量做了WOE编码后跑一个单变量的逻辑回归,如果斜率(变量系数)不为1或者截距项不等于

[\ln(\frac{#Bad_T}{#Good_T}) ]

则该分箱效果不佳。

对于离散变量,例如职业变量包含学生、老师、工人等名义属性时,先将变量的不同level作WOE编码后,把WOE值相近的level合并在一起,这样可以减少level数量。因为有相近的WOE值的level有几乎相同的响应率/非响应率,换句话说,某几个level有相近的woe值就将他们合并成一个箱子

1.4 WOE编码的优点与缺点

优点:

  1. 可以有效处理缺失值(把缺失值单独作为一个分箱)
  2. 可以有效处理异常值(Outlier)
  3. WOE转换基于分布的对数值,这与逻辑回归输出函数一致
  4. 不需要进行哑变量编码
  5. 用了合适的分箱手段后,能够建立自变量与因变量的单调关系

缺点:
只考虑了每个分箱的相对风险,没有考虑到每个分箱样本数量占全样本的比例。可以用IV值来评估每个分箱的相对贡献

1.5 延申:WOE 为什么被称为数据权重

WOE编码与IV值

1.6 在python中计算WOE

例:构造如下数据集

df = pd.DataFrame({"col1":["男","女","女","男","女"],
        "y":[0,1,1,1,0]})

WOE编码与IV值

利用 crosstab 得到频率表:

pd.crosstab(df["col1"], df["y"], normalize='columns')

WOE编码与IV值

在频率表的基础上,加上woe列:

df_woe = pd.crosstab(df["col1"], df["y"], normalize='columns').\
assign(woe=lambda dfx: np.log(dfx[1].replace(0, 0.0001) / dfx[0].replace(0, 0.0001)))

WOE编码与IV值

当某个分箱中,只存在正样本或负样本时,会使得 ln(.) 的分子或分母为0,可选择将其替换为0.0001

2. IV值

2.1 IV值的计算方式

信息值是预测模型中选择重要变量的方式之一,它能根据预测变量的重要性对预测变量进行排序,IV值计算公式如下:

[IV = \sum_i^n(响应比例-未响应比例)WOE_i \ =\sum_i^n(\frac{#Bad_i}{#Bad_T}-\frac{#Good_i}{#Good_T})WOE_i ]

IV值是对一个变量而言,即 每个变量有一个IV值(其值等于每个分箱的IV值相加)。IV值在WOE的基础上保证了结果非负。

假设变量 (X) 有 (n) 个分箱,每个分箱的 WOE 编码取值为 (WOE_i) ,该分箱的IV值就是用该分箱响应比例与未响应比例之差再乘上 (WOE_i)。注意这里的响应比例和未响应比例都是用当前分箱中响应数量/整体样本响应数量和当前分箱未响应数量/整体样本未响应数量计算得到。

IV值是看单个变量正负样本分布的差异,这种差异越大表明这个变量对于正负样本的区分度越高.

WOE可能为负值,IV值不可能为负,根据IV值选择变量后,用WOE替换变量各分组的值进入模型。

2.2 利用IV值进行变量筛选

WOE编码与IV值

一般我们选择 IV值大于0.02的那些变量进入模型。如果IV值大于0.5,则考虑要对这个变量进行分群处理。即根据这个变量拆分成几个样本子集,分别在各个样本子集上建模。

2.3 在python中计算IV

def calIV(df, var, y):
"""
    计算IV值
    param df:数据集X
    param var:已分组的列名
    param y:响应变量y(0,1)
    return:IV值
"""

    df_woe_iv = pd.crosstab(df[var], y, normalize='columns').assign(woe=lambda dfx: np.log(dfx[1].replace(0, 0.0001) / dfx[0].replace(0, 0.0001))).assign(iv=lambda dfx: np.sum(dfx['woe'] * (dfx[1] - dfx[0])))

    a = df_woe_iv['iv'].reset_index()
    return a.loc[0, 'iv']

Original: https://www.cnblogs.com/qypx/p/15912310.html
Author: qypx
Title: WOE编码与IV值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607124/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • cmake 入门笔记

    1. cmake 是什么? 这些年大型 C/C++ 工程都纷纷转到了 cmake 环境下,那么这个工具到底有什么魅力吸引着大家呢?无它,软件工程崇尚实用主义,而 cmake 的功能…

    Linux 2023年6月6日
    0107
  • 关于如何在Idea下进行多子项目及引用内部子项目情况下打包项目的方法

    近期在开发Java的时候遇到了如下的打包上的问题 需要将一个工程下面的子工程分别打包 有的子工程还包含了另一个子工程 在这种情况下打包会出现找不到子模块的情况。 JDK:1.8 开…

    Linux 2023年6月14日
    098
  • Redis监控技巧(转)

    来自:http://blog.nosqlfan.com/html/4166.html Redis 监控最直接的方法当然就是使用系统提供的 info 命令来做了,你只需要执行下面一条…

    Linux 2023年5月28日
    099
  • 模板层

    过滤器 语法结构 {{ 数据对象|过滤器名称:参数 }} 过滤器最多只能额外传输一个参数 常见过滤器 标签 注意事项 在django模板语法中写标签的时候,只需要写关键字然后tab…

    Linux 2023年6月7日
    092
  • 快速部署LAMP黄金架构,搭建disuz论坛

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    058
  • [20220811]奇怪的隐式转换问题(12c补充测试).txt

    [20220811]奇怪的隐式转换问题(12c补充测试).txt –//生产系统遇到一个奇怪的隐式转换问题,问题在于没有发生隐式转换,前面已经做了一些分析增加12c下的…

    Linux 2023年6月13日
    083
  • Linux服务器配置git服务

    现在 Github 已经支持个人建立私有仓库,包括国内的一些开源平台如 Gitee 等也支持私有仓库,所以直接去建立私有仓库即可。或者可以自己买服务器搭建 GitLab。但是这篇文…

    Linux 2023年6月14日
    0109
  • 使用7z程序CLI实现基础功能

    阅文时长 | 0.64分钟字数统计 | 1025.6字符主要内容 | 1、引言&背景 2、压缩 3、解压 4、更多命令可见 5、声明与参考资料『使用7z程序CLI实现基础功…

    Linux 2023年6月14日
    095
  • Redis中bitmap的妙用

    bitmap的使用场景使用场景一:用户签到使用场景二:统计活跃用户使用场景三:用户在线状态 Original: https://www.cnblogs.com/linjiqin/p…

    Linux 2023年5月28日
    0100
  • 数据结构 单链表

    cpp;gutter:true;</p> <h1>include</h1> <h1>define null 0;</h1&gt…

    Linux 2023年6月13日
    083
  • [云原生]Kubernetes-资源管理(第3章)

    一、资源管理介绍 二、YAML语言介绍 三、资源管理方式 3.1 命令式对象管理 3.2 命令式对象配置 3.3 声明式对象配置 参考: Kubernetes(K8S) 入门进阶实…

    Linux 2023年6月13日
    0120
  • Linux系统卡死后紧急处理

    前言:Linux系统卡死了的情况有很多,最常见的是系统负载过高导致的。还可以运行内存耗用极大的程序(如虚拟机),也会迅速提升系统负载。注意:不能再试图依赖任何图形界面的东西,如 G…

    Linux 2023年6月7日
    0101
  • layui实现多图上传,支持拖拽上传

    示例:支持多图上传,支持拖拽上传,下方有文件上传信息提示 html代码: <div class="layui-upload"> <div cl…

    Linux 2023年6月7日
    091
  • springboot工程引用本地lib文件夾内的jar包,打包時把依賴jar包打入jar包

    本地工程新建lib文件夾,并放入jar包 springboot工程引用lib文件夹下的jar包 pom中增加 com.aliyun.vcs.dataengine common sy…

    Linux 2023年6月8日
    0103
  • redis编译安装

    redis是一个强大的NoSQL数据库,相对于memcached,他提供了更丰富的数据类型,有string、hash、list、set、sorted set这几种类型;还支持数据持…

    Linux 2023年5月28日
    0103
  • JavaScript快速入门-02-基本语法

    2 基本语法 2.1 JavaScript简介 JavaScript 是一门 解释型语言,其代码在客户端中执行前不需经过编译,而是直接由浏览器解释执行。主要用作 客户端脚本语言,在…

    Linux 2023年6月7日
    0112
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球