老饼讲解:一步一步上手学习
评分卡的重点其实在于对变量的分箱,分箱的好坏就决定了模型的效果,所以要构建评分卡就避免不了对变量分箱,在使用bbbrisk前,我们先来说说bbbrisk的分箱格式是怎么一回事,以及它的格式。在这里建议大家先大概的看看就好了,在之后的使用之中有疑问时再回头来详细看。
我们知道,评分卡的重点其实在于对变量的分箱,而在bbbrisk中,也是以它为重点,只要知道了变量的分箱逻辑,就可以用它来得到我们所想要的一切东西,例如打印变量的badrate分箱效果、构建评分卡、对数据转换等等:

而我们这张文章,主要目的就是先熟悉一下在bbbrisk中怎么设置分箱,后面再来使用bbbrisk就方便多了。
下面我们不妨先通过几个小场景来简单熟悉一下bbbrisk的分箱格式。
假设我们想看看单个变量按分箱逻辑进行分箱后的效果,例如,要将rev变量分为五个箱:
(0,0.1],(-inf,0]或(0.1,0.37],(0.37,0.64],(0.64,1.2]或(2,inf],(1.2,2]
那么我们可以用如下代码来打印出它的分箱效果:
import bbbrisk as br
from bbbrisk import bins
data = br.datasets.load_bloan() # 加载数据
bin_set = [[0,0.1],(['-',0],[0.1,0.37]),[0.37,0.64],([0.64,1.2],[2,'+']),[1.2,2]] # 设置变量的分箱
bin_stat = bins.Bins(bin_set).binStat(data['rev'],data['is_bad']) # 统计分箱结果
print(bin_stat) # 显示分箱结果其中,bin_set就是我们的分箱逻辑了,然后按它来统计rev变量分箱后is_bad的分布结果bin_stat,如下:

当然,这是我将结果整理到excel后的结果,直接打印出来虽然可以看到结果,但不够美观。
事实上,看单个变量往往只是分析变量时会使用到,如果我们已经确定了所有变量的分箱逻辑,纯粹的想看看它们的分箱效果(例如写报告时要整理出所有变量的分析结果),那么就可以一次性查看所有变量的分箱效果,如下:
# 本代码展示如何用bbbrisk对变量进行手动分箱,并打印分箱统计信息
# 本代码来自《老饼讲解-评分卡》www.bbblearn.com
import bbbrisk as br
# 加载数据
data = br.datasets.load_bloan() # 加载数据
x = data.iloc[:,:-1] # 变量数据
y = data['is_bad'] # 标签数据
# 变量的分箱
bin_sets = {
'rev' :[[0,0.1],(['-',0],[0.1,0.37]),[0.37,0.64],([0.64,1.2],[2,'+']),[1.2,2],]
,'age' :[[80,'+'],[60,80],[45,60],['-',45]]
,'city' :[('J','E','I'),'_other',('D','N','S'),('F','P')]
,'income' :[[1000,5000],[5000,9000],(['-',1000],[20000,'+'],None),[9000,16000],[16000,20000]]
,'marital':[1,0,2]
,'debrate':[([0,0.1],[850,'+']),([0.1,0.5],[5,850]),([0.5,0.8],0),[0.8,5]]
,'due30' :[0,1,2,(3,4),[4,'+']]
,'due60' :[0,1,2,[2,'+']]
,'due90' :[0,1,[1,'+']]
,'loan_num':[[3,'+'],(2,3),1,0]
}
bin_stats = br.bins.batch.bin_stats(x,y,bin_sets) # 统计各个变量的分箱情况
br.display.pd.set(width=300,max_colwidth=30,max_rows=30) # 美化pandas的显示方式
for var in bin_stats: # 逐个变量打印分箱结果
print('\n变量'+var+'的分箱结果:\n',bin_stats[var]) # 打印当前变量的分箱统计结果运行上面的代码,就能得到上面各个变量的结果了。
例如rev变量打印出来的统计信息结果如下:

下面我们简单来看看每行代码是怎么一回事:
6-8行是导入数据;
11-22行是设置各个变量的分箱规则;
23行是调用batch.bin_stats函数,按分箱设置bin_sets来对数据x,y进行分箱信息统计;
25-26行就是逐个打印变量的分箱统计信息了。
在这里大家不必着急学习代码,后面会慢慢接触的,知道可以这么干就可以了。
在bbbrisk中建模是非常简单的,只需要设置好变量的分箱逻辑,然后调用scoreCard函数就可以一步到位建模了。
具体的代码示例如下:
import bbbrisk as br
data = br.datasets.load_bloan() # 加载数据
x = data.iloc[:,:-1] # 变量数据
y = data['is_bad'] # 标签数据
# 变量的分箱设置
bin_sets = {
'rev' :[[0,0.1],(['-',0],[0.1,0.37]),[0.37,0.64],([0.64,1.2],[2,'+']),[1.2,2],]
,'age' :[[80,'+'],[60,80],[45,60],['-',45]]
,'city' :[('J','E','I'),'_other',('D','N','S'),('F','P')]
,'income' :[[1000,5000],[5000,9000],(['-',1000],[20000,'+'],None),[9000,16000],[16000,20000]]
,'marital':[1,0,2]
,'debrate':[([0,0.1],[850,'+']),([0.1,0.5],[5,850]),([0.5,0.8],0),[0.8,5]]
,'due30' :[0,1,2,(3,4),[4,'+']]
,'due60' :[0,1,2,[2,'+']]
,'due90' :[0,1,[1,'+']]
,'loan_num':[[3,'+'],(2,3),1,0]
}
# 构建评分卡
model,card = br.model.scoreCard(x,y,bin_sets) # 构建评分卡如上面的代码所示,只需要设置好各个变量的分箱,然后scoreCard函数就可以帮我们构建整个评分卡了。
其中model,card = br.model.scoreCard(x,y,bin_sets),代表的就是用x,y来构建评分卡,其中x按bin_set的分箱逻辑来进行分箱,之后就会返回评分卡的逻辑回归模型,以及最终的评分卡表了,具体效果后面的文章再详述。
通过上面的展示大家会发现,其实在评分卡中无非就是两部分:"怎么确定分箱"和"怎么根据分箱得到各种结果":

bbbrisk正是围绕这个思想所设计的,大家可以围绕"怎么得到"和"怎么使用"分箱逻辑来理解bbbrisk的功能。
好了,既然分箱逻辑在评分卡中这么重要,下面我们就来说说bbbrisk是如何定义分箱的格式的。
在上面的代码中,我们设置了分箱格式:

在bbbrisk中,约定每个变量的分箱都以list来表示,如下:

其中,list中第i个元素代表第i个分箱,因此我们只需要关注单个箱体的书写格式就可以了。
单个箱体的表示方法,简单来说,主要就三种情况:
1. 如果是范围分箱,就用[a,b]格式。
它遵循左开右闭,即[a,b]实际代表的范围是(a,b],如果要左闭,就把a取小一点。
2. 如果是枚举值就直接填上枚举值,例如:a。
3. 如果要合并,就用小括号()括起来,例如([a,b],[c,d],e)。
下面举几个例子就熟悉了:
[0 ,[0,2],[2,'+']]代表0作为一个分箱,(0,2]作为一个分箱,>2作为一个分箱。
[(0,[2,'+]),[0,2],'_other']代表0与>2作为一个分箱,(0,2]作为一个分箱,其它作为一个分箱。
详细说明可以参见《bbbrisk-分箱配置格式》,但不太建议直接看,只需跟随着课程积累就行了。
在这一节,我们大概熟悉了bbbrisk的分箱配置格式,同时也了解了一些bbbrisk的使用方式,以及它的设计核心,总的来说,其实就是设置好分箱格式,就可以得到变量的分箱效果、建模效果等等内容了。
评论