python自动分箱,计算woe,iv的实例代码


Posted in Python onNovember 22, 2019

笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱。近期换用python开发, 也想实现自动分箱功能,找到了一个woe包,地址https://pypi.org/project/woe/,可以直接 pip install woe安装。

由于此woe包官网介绍及给的例子不是很好理解,关于每个函数的使用也没有很详细的说明,经过一番仔细探究后以此文记录一下该woe包的使用及其计算原理。

例子

官方给的例子不是很好理解,以下是我写的一个使用示例。以此例来说明各主要函数的使用方法。计算woe的各相关函数主要在feature_process.py中定义。

import woe.feature_process as fp
import woe.eval as eval
 
#%% woe分箱, iv and transform
data_woe = data #用于存储所有数据的woe值
civ_list = []
n_positive = sum(data['target'])
n_negtive = len(data) - n_positive
for column in list(data.columns[1:]):
 if data[column].dtypes == 'object':
 civ = fp.proc_woe_discrete(data, column, n_positive, n_negtive, 0.05*len(data), alpha=0.05)
 else:  
 civ = fp.proc_woe_continuous(data, column, n_positive, n_negtive, 0.05*len(data), alpha=0.05)
 civ_list.append(civ)
 data_woe[column] = fp.woe_trans(data[column], civ)
 
civ_df = eval.eval_feature_detail(civ_list,'output_feature_detail_0315.csv')
#删除iv值过小的变量
iv_thre = 0.001
iv = civ_df[['var_name','iv']].drop_duplicates()
x_columns = iv.var_name[iv.iv > iv_thre]

计算分箱,woe,iv

核心函数主要是freature_process.proc_woe_discrete()与freature_process.proc_woe_continuous(),分别用于计算连续变量与离散变量的woe。它们的输入形式相同:

proc_woe_discrete(df,var,global_bt,global_gt,min_sample,alpha=0.01)

proc_woe_continuous(df,var,global_bt,global_gt,min_sample,alpha=0.01)

输入:

df: DataFrame,要计算woe的数据,必须包含'target'变量,且变量取值为{0,1}

var:要计算woe的变量名

global_bt:全局变量bad total。df的正样本数量

global_gt:全局变量good total。df的负样本数量

min_sample:指定每个bin中最小样本量,一般设为样本总量的5%。

alpha:用于自动计算分箱时的一个标准,默认0.01.如果iv_划分>iv_不划分*(1+alpha)则划分。

输出:一个自定义的InfoValue类的object,包含了分箱的一切结果信息。

该类定义见以下一段代码。

class InfoValue(object):
 '''
 InfoValue Class
 '''
 def __init__(self):
 self.var_name = []
 self.split_list = []
 self.iv = 0
 self.woe_list = []
 self.iv_list = []
 self.is_discrete = 0
 self.sub_total_sample_num = []
 self.positive_sample_num = []
 self.negative_sample_num = []
 self.sub_total_num_percentage = []
 self.positive_rate_in_sub_total = []
 self.negative_rate_in_sub_total = []
 
 def init(self,civ):
 self.var_name = civ.var_name
 self.split_list = civ.split_list
 self.iv = civ.iv
 self.woe_list = civ.woe_list
 self.iv_list = civ.iv_list
 self.is_discrete = civ.is_discrete
 self.sub_total_sample_num = civ.sub_total_sample_num
 self.positive_sample_num = civ.positive_sample_num
 self.negative_sample_num = civ.negative_sample_num
 self.sub_total_num_percentage = civ.sub_total_num_percentage
 self.positive_rate_in_sub_total = civ.positive_rate_in_sub_total
 self.negative_rate_in_sub_total = civ.negative_rate_in_sub_total

打印分箱结果

eval.eval_feature_detail(Info_Value_list,out_path=False)

输入:

Info_Value_list:存储各变量分箱结果(proc_woe_continuous/discrete的返回值)的List.

out_path:指定的分箱结果存储路径,输出为csv文件

输出:

各变量分箱结果的DataFrame。各列分别包含如下信息:

var_name 变量名
split_list 划分区间
sub_total_sample_num 该区间总样本数
positive_sample_num 该区间正样本数
negative_sample_num 该区间负样本数
sub_total_num_percentage 该区间总占比
positive_rate_in_sub_total 该区间正样本占总正样本比例
woe_list woe
iv_list 该区间iv
iv 该变量iv(各区间iv之和)

输出结果一个示例(截取部分):

python自动分箱,计算woe,iv的实例代码

woe转换

得到分箱及woe,iv结果后,对原数据进行woe转换,主要用以下函数

woe_trans(dvar,civ): replace the var value with the given woe value

输入:

dvar: 要转换的变量,Series

civ: proc_woe_discrete或proc_woe_discrete输出的分箱woe结果,自定义的InfoValue类

输出:

var: woe转换后的变量,Series

分箱原理

该包中对变量进行分箱的原理类似于二叉决策树,只是决定如何划分的目标函数是iv值。

1)连续变量分箱

首先简要描述分箱主要思想:

1.初始化数据集D =D0为全量数据。转步骤2

2.对于D,将数据按从小到大排序并按数量等分为10份,记录各划分点。计算不进行仍何划分时的iv0,转步骤3.

3.遍历各划分点,计算利用各点进行二分时的iv。

如果最大iv>iv0*(1+alpha)(用户给定,默认0.01): 则进行划分,且最大iv对应的即确定为此次划分点。它将D划分为左右两个结点,数据集分别为DL, DR.转步骤4.

否则:停止。

4.分别令D=DL,D=DR,重复步骤2.

为了便于理解,上面简化了一些条件。实际划分时还设计到一些限制条件,如不满足会进行区间合并。

主要限制条件有以下2个:

a.每个bin的数量占比>min_sample(用户给定)

b.每个bin的target取值个数>1,即每个bin必须同时包含正负样本。

2)连续变量分箱

对于离散变量分箱后续补充 to be continued...

以上这篇python自动分箱,计算woe,iv的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python检查序列seq是否含有aset中项的方法
Jun 30 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python如何生成树形图案
Jan 03 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 Python
python 使用装饰器并记录log的示例代码
Jul 12 Python
python批量图片处理简单示例
Aug 06 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
Python3基本输入与输出操作实例分析
Feb 14 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
python爬虫基础之urllib的使用
Dec 31 Python
python创建学生管理系统
Nov 22 #Python
Python如何计算语句执行时间
Nov 22 #Python
python生成器用法实例详解
Nov 22 #Python
关于pandas的离散化,面元划分详解
Nov 22 #Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 #Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 #Python
在OpenCV里使用Camshift算法的实现
Nov 22 #Python
You might like
php 分页函数multi() discuz
2009/06/21 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
jQuery的强大选择器小结
2009/12/27 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
[01:08:09]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第二局
2016/03/02 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python画环形图的方法
2020/03/25 Python
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
运动会广播稿80字
2014/01/23 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL
python 判断文件或文件夹是否存在
2022/03/18 Python
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技
mysql数据库隔离级别详解
2022/06/16 MySQL