评分卡

【介绍】一篇入门之-评分卡-WOE编码转换是什么

作者 : 老饼 发表日期 : 2022-11-21 02:12:40 更新日期 : 2024-12-30 10:16:17
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



评分卡中一般将组别转为WOE值再进行建模,它使模型更符合业务意义

本文讲解评分卡中WOE的计算公式,并展示WOE的具体计算例子,以及转换为WOE编码的好处

通过本文,可以快速了解评分卡中的WOE转换如何计算,以及为什么需要将变量转换为WOE编码





   01. 评分卡-WOE编码是什么   





本节讲解评分卡中的WOE转换公式,并展示一个woe转换例子





      WOE编码的计算公式      


什么是WOE编码
WOE(weight of Evidence)全称为证据权重
它是逻辑回归模型输入变量取为某个组别时,对样本"偏向正样本"的信息贡献
 WOE编码转换是什么
 当WOE为正数时,说明该组别偏向于正样本,当WOE为负数时,则偏向负样本
在评分卡模型中,一般在将进行分组后,会进一步将组别编码为WOE,再进行建模
 WOE计算公式 
对于变量的第个组别,它的WOE计算公式如下:
     
 其中
       :  坏样本总个数                   
      :坏样本且为第组的个数 
    :好样本总个数                   
     :好样本且为第组的个数  





       WOE计算实例        


以性别变量为例,性别变量共有三个级别:男、女、其它,如下:
 性别的数据
以上述数据为例,通过下表的计算,就可得到性别在各个组别的WOE值:
 WOE的计算例子与过程
如表,WOE的计算共三个步骤:

一、统计各个分组里好坏样本的个数,并算得好坏样本的总数              
二、计算各个分组里好、坏样本在"好、坏总样本"的占比
三、根据公式就可以计算出每组的woe         








      02. 转换为WOE编码的好处     




本节讲解将评分卡的分组变量转换为WOE编码的好处






     WOE编码的好处     


在评分卡中,变量分组后,一般会有以下几种常见的形式:
 分组变别的几种形式
下面通过比较WOE与其它三种形式,来说明使用WOE作为评分卡建模变量的三种好处
WOE编码的好处一:变量类型-数值化
相比原始的分组描述,使用WOE的最大好处是,它能使变量数值化,如下
 WOE编码的好处1-数值化
对于原始分组描述,它不是数值类型,因此不能直接作为模型变量
而通过WOE转换,将它转换为WOE后,就是一个数值,就可以用于建模了
WOE编码的好处二:变量贡献单调化
对于"负债"变量的第二种形式、数值型枚举变量:1W、10W、100W
这样的变量虽然在数据类型上,符合逻辑回归模型的入模要求,但难以保障单调性
 因为在实际中,负债往往与y不是单调的,即并不是负债越高逾期的可能性就越高
而逻辑回归模型是线性模型,它要求变量与y是单调的,直接把"负债"入模是不适合的
 
WOE编码的好处2-单调化
而由于WOE代表着变量组别对样本是正样本(即坏客户)的贡献量
因此将变量转换为WOE后再进行建模,可以保障变量与y的单调性,更准确来说是正相关性

WOE编码的好处三:变量贡献合理化
对于"负债"变量的第三种形式、组别型枚举变量:1、2、3
它是指将变量按组别的badrate进行升序编号,即按组别的BadRate,从低到高依次取为1、2、3...
此时,x虽然满足了数值化、单调化,但它默认了每组对ln odds的贡献是等量递增的,因此不够合理
 WOE编码的好处3-贡献合理化
而将变量转换为WOE后,由于它是对ln odds的贡献评估,所以它比直接取组号更为合理
 总的来说,将变量转换为WOE,可以使得变量更加贴切逻辑回归模型的变量要求,有助于提升模型的合理性







      03. 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转换的原始数据
  
 以上是用于转换woe的原始数据,x是需要转换的变量,y是样本标签
 将x转换为woe的结果如下
 WOE编码转换-代码运行结果
其中woe映射表是每个组别对应的woe值,使用它对x进行转换就可以得到x的woe数据

 






好了,以上就是评分卡中WOE的计算公式以及应用方法了~








 End 



  

联系老饼