笔者之前用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 fpimport woe.eval as eval #%% woe分箱, iv and transformdata_woe = data #用于存储所有数据的woe值civ_list = []n_positive = sum(data['target'])n_negtive = len(data) - n_positivefor 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.001iv = 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
新闻热点
疑难解答