Python woe 0.0.7 源码解析(https://pypi.python.org/pypi/woe/0.0.7)
数据挖掘模型中的IV和WOE详解 http://blog.csdn.net/kevin7658/article/details/50780391
概念简述,提取自上链接:
iv(Information Value,中文意思是信息价值),变量的预测能力。
WOE的全称是“Weight of Evidence”,即证据权重,是对原始自变量的一种编码形式。要对一个变量进行woe编码需要先把这个变量分组(也叫离散化,分箱)。然后计算,woe表示的实际上是“当前分组中响应客户占所有响应客户的比例”和“当前分组中没有响应的客户占所有没有响应的客户的比例”的差异。由woe各组加权求和,可以计算出iv(如果加权见引用)
根据以上解释,我们发现,先分组,再计算woe值,再计算IV。IV值越大代表这个变量对目标的预测能力越强。不同的分组方式会导致不同的IV值。如何分组才能获取IV的最大值呢?
针对离散值,本来就是分好组的。比如性别对收入的预测能力。
针对连续值。一般来说需要根据变量的分布进行人工分组。(比如年龄对是否近视的预测能力。按照经验,近视与遗传和看书多少有关,一般按照1-7岁(学龄前),8-13(小学),14-16(初中),17-19(高中),20-23(大学),24-200(研究生及以上)进行分组)。
很多连续值场景中,都是按照连续值距离进行分组的。(有特例:比如像年龄对 红腰带(本命年买红腰带)售卖量的预测能力的计算,应该以除12作为分组。)woe代码实现了一种按照连续值距离进行分组的方式。
woe模块实现:
输入中会指名变量作为离散值还是连续值进行IV计算。
- 针对离散值,将每个值作为一个分组,计算个分组woe值,再计算IV值
- 针对连续值:
- 计算将整体数据作为一个分组的IV值(命名为IV0)。
- 对所有值排序,根据最大,最小值平均划分100个取值区间(99个区间分割点,每个分割点可以将整体数据分割为左右两部分)
- 针对每个分割点,尝试将左右两部分作为两个分组,计算IV值(如果此种分组中,左右有一个分组中数据少于总体数据量的5%,不计算此分组IV)。获取99中分组方式中的最大IV值(IVmax)。
- 假如此最大IV值(IVmax)大于不分组IV值的101%(IV0),不进行分割。否则,以此分割点将数据整体分为左右两个组。每个组独立重新进行1步骤,进入下一轮循环。
- 根据记录所有分组点进行数据整体分组,计算IV。
woe算法是单机实现,如果要改成分布式(spark计算),思路如下(没有是实现):
总体思路,将实现中的list换成rdd。
- 针对离散值,每个分组是一个rdd,计算woe,合并计算IV
- 针对连续值。
- 将整体数据(RDD数据结构)作为一个分组的IV值(命名为IV0)。
- 对所有值排序,根据最大,最小值平均划分100个取值区间(99个区间分割点,每个分割点可以将整体数据分割为左右两部分)
- 针对每个分割点,尝试将左右两部分作为两个分组(RDD数据结构),计算IV值(如果此种分组中,左右有一个分组中数据少于总体数据量的5%,不计算此分组IV)。获取99中分组方式中的最大IV值(IVmax)。
- 假如此最大IV值(IVmax)大于不分组IV值的101%(IV0),不进行分割。否则,以此分割点将数据整体分为左右两个组(RDD)。每个组独立重新进行a步骤,进入下一轮循环。
- 根据记录所有分组点进行数据整体分组(每个组一个RDD),计算IV。
暂时未实现原因如下:
- 积分卡模型都是数值型数据,最多占用16字节,随便的服务器都有128G内存,单机内存可以存放80亿条数据。臆断一下,没有这么多数据的预测场景。(对业务接触不多)
- 只能进行每层数据的并行化,但是每层之间还是串行,效率不会提升太高