前言

本篇承接上篇

信用评分系统运行原理上篇

分箱逻辑比较复杂 设计到很多的算法

为了确保分析的准确性 我通过pycharm编译器Debug的方式跑这段代码

一步一步的分析代码的实现逻辑

编译器环境的准备

python代码准备


编译器配置








python依赖包安装


pip3 install numpypip3 install pandaspip3 install matplotlib==3.2.0pip3 install --target=./venv/lib/python3.7/site-packages seabornpip3 install ipythonpip3 install xlrdpip3 install sklearn

代码逻辑分析

自动分箱

# 调用自定义分箱dfx1, ivx1, cutx1, woex1 = mono_bin(train.SeriousDlqin2yrs, train.RevolvingUtilizationOfUnsecuredLines, n=10)

# 自定义自动分箱函数def mono_bin(Y, X, n=20):    r = 0    # 好人个数 6936    good = Y.sum()    # 坏人个数 94957    bad = Y.count() - good    # np.abs(0)=0.9272727272727272m    absR = np.abs(r)    while absR < 1: # 满足循环条件 进入循环体        # 先对训练集X排序 再分组        dfX = X.rank(method="first")        cutPd = pd.qcut(dfX, n)        d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": cutPd}) # X.rank(method="first")        d2 = d1.groupby("Bucket", as_index = True)        d2Mean = d2.mean()        d2MeanX = d2Mean.X        r, p = stats.spearmanr(d2MeanX, d2.mean().Y) # 使用斯皮尔曼等级相关系数来评估两个变量之间的相关性        n = n - 1    d3 = pd.DataFrame(d2.X.min(), columns = ['min'])    d3['min']=d2.min().X    d3['max'] = d2.max().X    d3['sum'] = d2.sum().Y    d3['total'] = d2.count().Y    d3['rate'] = d2.mean().Y    d3['woe'] = np.log((d3['rate'] / (1-d3['rate'])) / (good/bad))    d3['goodattribute'] = d3['sum'] / good    d3['badattribute'] = (d3['total'] - d3['sum']) / bad    iv = ((d3['goodattribute'] - d3['badattribute']) * d3['woe']).sum()    d4 = (d3.sort_values(by = 'min'))    print(d4)    cut=[]    cut.append(float('-inf'))    for i in range(1, n+1):        qua = X.quantile(i/(n+1))        cut.append(round(qua,4))    cut.append(float('inf'))    woe = list(d4['woe'].round(3))    return d4, iv, cut, woe

详细分析分箱逻辑

参数分析
  • train.SeriousDlqin2yrs 对应函数中的X值
61003     026974     064962     022271     021614     0         ..133033    0123509    018246     028850     016172     0
第一列参数 表示 一行索引值 可以理解成唯一主键id第二列参数 表示 真实值 0表示坏客户 ,1 表示好客户
  • train.RevolvingUtilizationOfUnsecuredLines 对应函数中的Y值
RevolvingUtilizationOfUnsecuredLines 信用卡和个人信用额度的总余额,除了房地产和没有分期付款债务,如汽车贷款除以信用额度
61003     0.11910426974     0.04252464962     0.06774022271     0.86651321614     1.000000            ...   133033    0.367954123509    0.03187918246     0.09016328850     1.64451816172     0.160312
第一列是行索引值第二列表示总额度
函数实现逻辑分析
Y.sum() 表示好人总计Y.count() 表示所有人Y.count() - good 表示坏人个数

a、 循环初始条件:r = 0,n=10

b、 while循环条件:np.abs(r)<1

取绝对值

c-1、 循环过程中使用 斯皮尔曼等级相关系数 算法重新计算r值

c-2、 每次循环:n = n - 1

第一次循环: r=0

np.abs(0)==0 进入循环体

这个是对训练集X进行顺序排名 重复的值 谁出现在前面  就先排谁

X.rank(method="first")

这里简单介绍下 rank排名函数和qcut\cut函数

理解了这些函数的作用就可以更好的理解分箱算法对于数据处理的过程

  • rank函数
举一个简单的例子

有一个数据源 字段:班级、姓名、成绩

目的:找出每个班级中排名第二的学生信息

需要做的步骤:

1、根据班级分组2、每个组计算排名3、筛选出排名为第二的学生

此时对于相同成绩的同学如何排名

a 顺序排名 先到先得

李四和王五的成绩都为30,但是李四出现在王五的前面,所以李四的排名靠前

当method取值为min,max,average时,都是要参考“顺序排名”的)


b 密集排名:成绩相同 排名相同

相同成绩的同学排名相同,其他依次加1即可

1,2,2,3,4


c 跳跃排名:成绩相同 排名相同

1,2,2,4,5

成绩相同的同学,取在顺序排名中最小的那个排名作为该值的排名,李四和王五同学排名分别为2和3,那么当method为min时,取2和3的最小的那个作为第2名作为成绩30的排名

rank函数取值范围

‘average’,’first’,’min’, ‘max’,’dense’

min和max是跳跃排名的一种

关于average,成绩相同时,取顺序排名中所有名次之和除以该成绩的个数,即为该成绩的名次;比如上述排名中,30排名为2,3,那么 30的排名 = (2+3)/2=2.5,成绩为50的同学只有1个,且排名为1,那50的排名就位1/1=1。

​关于max,和min一样也是跳跃排名的一种,成绩相同时取顺序排名中排名最大的作为该成绩的名次,在顺序排名中,30最大的排名为3,那么当参数为max时,30的排名=3,此时,李四和王五的排名都为第3名了。
  • qcut函数
跟cut()按照变量的值对变量进行分割不同, qcut()是按变量的数量来对变量进行分割,并且尽量保证每个分组里变量的个数相同

例子:把数据由小到大分成四组,并且让每组数据的数量相同

# 把变量由小到大分成四组,并且让每组变量的数量相同d_qcut = d.copy()d_qcut['qcut_group'] = pd.qcut(d_qcut['number'], 4)d_qcut


# 查看每个分组里变量的个数d_qcut['qcut_group'].value_counts()

使用qcut()对数据进行分割之后,每个分组里的数据个数都大致相同,但是跟cut()不同的是,每个分组里值的范围并不相同

  • cut() 函数

按照指定的边界值对变量进行分割

# 使用bins参数, 指定每个分组的边界d_cut_bins = d.copy()d_cut_bins['cut_group'] = pd.cut(d_cut_bins['number'],                                 bins=[0, 10, 50, 100])d_cut_bins

继续信用评分系统 分箱代码分析

dfX = X.rank(method="first")

cutPd = pd.qcut(dfX, n)

n=10

对dfX 分10组 每组的数量大小一致


d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": cutPd}) 

d2 = d1.groupby("Bucket", as_index = True)

d2Mean = d2.mean()

d2MeanX = d2Mean.X

使用斯皮尔曼等级相关系数来评估两个变量之间的相关性

r, p = stats.spearmanr(d2MeanX, d2Mean.Y)这个具体什么原理感兴趣的朋友 可以自己查阅一下资料


每个指标具体计算过程

min 最小值 d2.min().Xmax 最大值 d2.max().Xtotal 总人数 d2.count().Ysum 好人数 d2.sum().Yrate 均值 d2.mean().Ywoe=np.log((d3['rate'] / (1-d3['rate'])) / (good/bad))

 (好人均值/坏人均值)/(好人人数/坏人人数) 取对数 即WOE

 goodattribute=d3['sum'] / good 每组好人数量/总的好人数

 badattribute=(d3['total'] - d3['sum']) / bad 每组坏人人数/坏人总人数

 iv = ((d3['goodattribute'] - d3['badattribute']) * d3['woe']).sum()

 d4 = (d3.sort_values(by = 'min')) 通过min列排序


该分箱函数最终得到的结果


ivx1:  1.0027047570109968cutx1:  [-inf, 0.0313, 0.1583, 0.5605, inf]woex1:  [-1.37, -1.212, -0.288, 1.106]

信用评分系统运行原理中篇-分箱逻辑相关推荐

  1. 信用评分系统运行原理下篇

    前言 信用评分系统运行原理上篇 信用评分系统运行原理中篇-分箱逻辑 绘制相关性系数热力图 corr = train.corr() # 计算各变量的相关性系数xticks = ['x0','x1','x ...

  2. 信用评分系统运行原理上篇

    源码 https://gitee.com/pingfanrenbiji/Credit-Card-Score 在jupyter中打开该项目 导入代码库 # Numpy是以矩阵为基础的数学计算模块,纯数学 ...

  3. python评分卡建模-卡方分箱(2)之代码实现

    卡方值计算 计算卡方值的函数需要输入numpy格式的频数表.对于pandas数据集,只需使用pd.crosstab计算即可,例如变量"总账户数" 与 目标变量 "是否坏客 ...

  4. 卡方 python_Python评分卡建模—卡方分箱

    原标题:Python评分卡建模-卡方分箱 今天主要给大家讲讲卡方分箱算法ChiMerge.先给大家介绍一下经常被提到的卡方分布和卡方检验是什么. 一.卡方分布 卡方分布(chi-square dist ...

  5. 银行信用评分卡建模原理

    今天学习了一下评分卡的内容,博主自己也对这个不了解,由于业务的需求,今天自学了下相关的内容.我把自己学习的一些东西整理下,发到这个博客里面. 背景 1.先讲一下背景内容,什么是评分卡:其实评分卡呢,就 ...

  6. 室内空气流动原理图_家庭新风系统示意图 新风系统运行原理介绍

    健康舒适的人居环境是我们一致的生活诉求, 实现这一目标, 家 居环境仅仅拥有恒温恒湿还不够,还必须恒氧,拥有 24 小时不间断 的新鲜空气供应. 家庭新风系统即为实现这一目标而诞生, 它根据房 间大小 ...

  7. python评分卡建模-卡方分箱

    今天主要给大家讲讲卡方分箱算法ChiMerge.先给大家介绍一下经常被提到的卡方分布和卡方检验是什么. 一.卡方分布 卡方分布(chi-square distribution, χ2-distribu ...

  8. python卡方分箱_Python评分卡建模—卡方分箱

    为服从自由度为k的卡方分布,记作: 或者记作 . 二.卡方检验 χ2检验是以χ2分布为基础的一种假设检验方法,主要用于分类变量之间的独立性检验. 其基本思想是根据样本数据推断总体的分布与期望分布是否有 ...

  9. 信用评分卡—信贷准入A卡(逻辑回归)

    信贷评分卡 前言 1.逻辑回归原理 1.1 求解方式 1.2 逻辑回归为什么用sigmoid并且转化后的输出即为1的概率 2.逻辑回归到评分卡 2.1 woe及IV 2.2 逻辑回归到评分卡 2.3 ...

最新文章

  1. 安装Oracle11g先决条件检查失败
  2. 74HC595的使用
  3. python的xlutils模块_xlutils模块使用
  4. Linux磁盘读写速率测试
  5. 手把手带你玩转LiteOS Ping组件
  6. 防止内存泄露 Linux下用Valgrind做检查【ZT】
  7. linux中命令du -sm,Linux中的Du命令
  8. matlab中字符串的大小比较,matlab中字符串的最大大小
  9. 【零基础学Python】Day10 Python解释器
  10. spring boot基于Java的电影院售票与管理系统毕业设计源码011449
  11. pdf转换器免费版下载
  12. Java代码实现点赞功能
  13. 计算机usb无法读取u盘启动,联想u盘启动不能识别u盘怎么办呢
  14. 固定资产自动盘点系统,盘点固定资产及利润更清晰
  15. Oracle 快速入门 同义词序列视图索引
  16. 替换掉mysql数据库指定字段的所有数据的中指定字符串
  17. 30岁+,大龄青年转行程序员的切身经历
  18. eclipse hadoop1.2.0配置及wordcount运行
  19. 便携式计算机设备是什么,IT 我想问便携式计算机与笔记本电脑的区别是什么?是否提供对PCMCIA插槽的支持是两者的唯一鉴别标准?...
  20. 第三方支付平台:BeeCloud和Ping++对比

热门文章

  1. C语言按位运算符 按位逻辑运算 移位运算 及其用法
  2. redis快照持久化和aof日志持久化
  3. 日志的艺术(The art of logging)
  4. 数据决策成共识 大数据产业期待点“数”成金
  5. DBA必知的mysql备份与还原的几大方法
  6. PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
  7. “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法...
  8. php设计模式之单例模式 1
  9. 微信成为开发者C#代码
  10. HTTP电脑发送短信接口调用示例