本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
评分卡中一般将组别转为WOE值再进行建模,它使模型更符合业务意义
本文讲解评分卡中WOE的计算公式,并展示WOE的具体计算例子,以及转换为WOE编码的好处
通过本文,可以快速了解评分卡中的WOE转换如何计算,以及为什么需要将变量转换为WOE编码
本节讲解评分卡中的WOE转换公式,并展示一个woe转换例子
WOE编码的计算公式
什么是WOE编码
WOE(weight of Evidence)全称为证据权重
它是逻辑回归模型输入变量取为某个组别时,对样本"偏向正样本"的信息贡献
当WOE为正数时,说明该组别偏向于正样本,当WOE为负数时,则偏向负样本
在评分卡模型中,一般在将进行分组后,会进一步将组别编码为WOE,再进行建模
WOE计算公式
对于变量的第个组别,它的WOE计算公式如下:
其中
: 坏样本总个数
:坏样本且为第组的个数
:好样本总个数
:好样本且为第组的个数
WOE计算实例
以性别变量为例,性别变量共有三个级别:男、女、其它,如下:
以上述数据为例,通过下表的计算,就可得到性别在各个组别的WOE值:
如表,WOE的计算共三个步骤:
一、统计各个分组里好坏样本的个数,并算得好坏样本的总数
二、计算各个分组里好、坏样本在"好、坏总样本"的占比
三、根据公式就可以计算出每组的woe
本节讲解将评分卡的分组变量转换为WOE编码的好处
WOE编码的好处
在评分卡中,变量分组后,一般会有以下几种常见的形式:
下面通过比较WOE与其它三种形式,来说明使用WOE作为评分卡建模变量的三种好处
WOE编码的好处一:变量类型-数值化
相比原始的分组描述,使用WOE的最大好处是,它能使变量数值化,如下
对于原始分组描述,它不是数值类型,因此不能直接作为模型变量
而通过WOE转换,将它转换为WOE后,就是一个数值,就可以用于建模了
WOE编码的好处二:变量贡献单调化
对于"负债"变量的第二种形式、数值型枚举变量:1W、10W、100W
这样的变量虽然在数据类型上,符合逻辑回归模型的入模要求,但难以保障单调性
因为在实际中,负债往往与y不是单调的,即并不是负债越高逾期的可能性就越高
而逻辑回归模型是线性模型,它要求变量与y是单调的,直接把"负债"入模是不适合的
而由于WOE代表着变量组别对样本是正样本(即坏客户)的贡献量
因此将变量转换为WOE后再进行建模,可以保障变量与y的单调性,更准确来说是正相关性
WOE编码的好处三:变量贡献合理化
对于"负债"变量的第三种形式、组别型枚举变量:1、2、3
它是指将变量按组别的badrate进行升序编号,即按组别的BadRate,从低到高依次取为1、2、3...
此时,x虽然满足了数值化、单调化,但它默认了每组对ln odds的贡献是等量递增的,因此不够合理
而将变量转换为WOE后,由于它是对ln odds的贡献评估,所以它比直接取组号更为合理
总的来说,将变量转换为WOE,可以使得变量更加贴切逻辑回归模型的变量要求,有助于提升模型的合理性
本节展示变量woe转换的具体代码实现
WOE的代码实现
下面展示如何在python中使用代码,将变量转换为woe数据
具体代码实现如下:
# -*- coding: utf-8 -*-
"""
本代码用于展示如何将变量的组别转换为woe
本代码来自《老饼讲解-机器学习》www.bbbdata.com
"""
import numpy as np
import pandas as pd
# 函数:用于计算woe映射表
def get_woe_dict(data): # 计算woe映射表
bad_tt = data['y'].sum() # 坏客户个数
good_tt = data.shape[0] -bad_tt # 好客户个数
woe_df = data.groupby('x')['y'].agg([('bad_cn','sum'),('cn','count')]) # 按组别统计坏客户个数与总客户个数
woe_df['good_cn']=woe_df['cn'] -woe_df['bad_cn'] # 好客户个数
woe_df.loc[woe_df['bad_cn'] ==0,'bad_cn' ] = 1 # 如果坏客户个数为0,则设为1.这样计算woe才不报错
woe_df.loc[woe_df['good_cn']==0,'good_cn'] = 1 # 如果好客户个数为0,则设为1.这样计算woe才不报错
woe_df['woe']=np.log((woe_df['bad_cn']/bad_tt)/(woe_df['good_cn']/good_tt)) # 按公式计算woe
woe_dict = {item:woe_df['woe'][item] for item in woe_df.index} # 转换为字典
return woe_dict # 返回woe字典
# woe转换应用示例
data = pd.DataFrame({
'x': ['男','男', '男','男','女','女','女','女','其它','其它','其它'], # 用于计算woe的原始数据
'y': [1,1,0,0,0,0,0,1,1,1,0]
})
woe_dict = get_woe_dict(data) # 计算woe映射表
x_woe = data['x'].map(woe_dict) # 转换为woe数据
print('\n原始数据:\n',data) # 打印原始数据
print('\nwoe映射表:\n',woe_dict) # 打印变量的woe映射表
print('\nx转换后的woe数据:\n',x_woe) # 打印转换为woe后的数据
运行结果如下:
以上是用于转换woe的原始数据,x是需要转换的变量,y是样本标签
将x转换为woe的结果如下:
其中woe映射表是每个组别对应的woe值,使用它对x进行转换就可以得到x的woe数据
好了,以上就是评分卡中WOE的计算公式以及应用方法了~
End