风控评分卡模型原理与应用(九):评分卡建模实战

风控评分卡模型原理与应用(九):评分卡建模实战 在前面的文章中介绍了风控评分卡及模型的原理本篇使用bbbrisk来实现评分卡来帮助大家理解评分卡建模的流程。数据处理bbbrisk是python的一个风控包目前提供的功能主要是构建评分卡里面包含构建评分卡的相关功能和原始数据首先安装这个包pip install bbbriskbbbrisk依赖于numpy、pandas和sklearn包最好提前安装好上述包首先导入需要的数据并查看数据结构# 加载数据pd.set_option(display.float_format,lambdax:%.2f%x)# 设置输出2位小数防止出现科学计数法不直观databr.datasets.load_bloan()data.head()data.describe()从输出的数据来看bbbrisk自带的小贷数据共包含10个变量与客户好坏标签数据共2万条其中income这个字段的缺失值比较多接着看一下特征之间的相关性figure,axplt.subplots(figsize(15,15))sns.heatmap(data.corr(),squareTrue,annotTrue)可以看出due60和due90这两个特征相关性很高后续可以考虑只保留一个。数据分箱这里我们直接使用bbbrisk进行自动分箱做一个基本的数据分箱并查看结果xdata.iloc[:,:-1]# 变量数据ydata[is_bad]# 自动分箱bin_setsbr.bins.batch.autoBins(x,y,enum_var[city,marital])# 自动分箱,如果有枚举变量,必须指出哪些是枚举变量bin_statsbr.bins.batch.bin_stats(x,y,bin_sets)# 统计各个变量的分箱情况br.display.pd.set(width300,max_colwidth30,max_rows30)# 美化pandas的显示方式forvarinbin_stats:# 逐个变量打印分箱结果print(\n变量var的分箱结果:\n,bin_stats[var])# 打印当前变量的分箱统计结果代码会给出每个特征对应的分箱结果和对应的IV值和Badrate这里给出几个特征的结果美化一下细看一下自动分箱后的结果的问题还是挺多的例如age字段有两个箱体IV值不符合要求同时从badrate看也不单调同样的变量loan_num变量debrat等等也都有这种问题所以自动分箱的结果可以考虑IV值和Badrate单调性符合要求的分箱结果其他不符合要求的可以接着通过之前文章所说的其他分箱方法尝试再次分箱。这里直接给出最后的分箱结果帮助大家先了解相关流程。这里也是直接使用bbrisk的功能实现分箱。在bbbrisk中约定每个变量的分箱都以list来表示list中第i个元素代表第i个分箱简单来说主要就三种情况如果是范围分箱就用[a,b]格式它遵循左开右闭即它实际代表的范围是(a,b]如果要左闭,就把a取小一点如果是枚举值就直接填上枚举值a如果要合并就用小括号()括起来例如([a,b],[c,d],e)# 变量的分箱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_statsbr.bins.batch.bin_stats(x,y,bin_sets)# 统计各个变量的分箱情况br.display.pd.set(width300,max_colwidth30,max_rows30)# 美化pandas的显示方式forvarinbin_stats:# 逐个变量打印分箱结果print(\n变量var的分箱结果:\n,bin_stats[var])# 打印当前变量的分箱统计结果从输出的最终的结果看badrate都有非常明显的趋势它们都是有效的可以作为入模变量。建模与评估构建模型并使用逐步回归来删选最终的变量# 构建评分卡model,cardbr.model.scoreCard(x,y,bin_sets,train_param{random_state:0})# 构建评分卡,为了使结果能重现,笔者设置了固定的随机种子scorecard.predict(x[card.var])# 用评分卡进行评分card.featureScore# 评分卡-特征得分表card.baseScore# 打印结果print(\n-----【 模型性能评估 】----)print(* 模型训练AUC:,model.train_auc)# 打印模型训练数据集的AUCprint(* 模型测试AUC:,model.test_auc)# 打印模型测试数据集的AUCprint(* 模型训练KS:,model.train_ks)# 打印模型训练数据集的KSprint(* 模型测试KS:,model.test_ks)# 打印模型测试数据集的KSprint(\n--------【 模型 】---------)print(* 模型使用的变量:,model.var)# 模型最终使用的变量print(* 模型权重:,model.w)# 模型的变量权重print(* 模型阈值:,model.b)从输出的结果看模型的AUC大于0.8整体效果不错# 计算阈值表与分数分布图thd_tbbr.report.get_threshold_tb(score,y,bin_step10)# 阈值表thd_tbbr.report.draw_score_disb(score,y,bin_step10,figsize(20,8))从分数分布图可看出分数越低坏客户的占比越高当分数⩾790时基本坏客户的占比就较少了同时从分布图还可以看出整体客户质量是较好的分数基本集中在高分段高分段只有个别客户坏账这可以理解为意外情况导致的逾期。(备注在实践中分数分布图一般呈现为正态分布或二八分布在本例中就是二八分布。https://www.bbbdata.com/scorecard/cardhttps://geekdaxue.co/read/yingtaoxianghello/cil23y